Calendario Arduino

Scuola Veronesi - Rovereto TN  anno 2014-2015 esercitazione di tecnica - realizzare un calendario

Il controllo del calendario è stato creato ulizzando Arduino - i mesi sono rappresentati dai LED e i giorni dalla lancetta che ruota grazie al servomotore.

 

Cosa serve:

  • Arduino Uno
  • Breadboard
  • Cavetti
  • Servomotore
  • 12 Led ...
  • Schienale di recupero
  • Pezzo di legno

Download:

Codice sorgente:


/* ------------------------------------------

   Scuola Veronesi - Rovereto TN
   anno 2014-2015 esercitazione di tecnica
   realizzare un calendario                
  
   Calendario - ZappocoJ - classe  III 
   
   20/11/2014

   ------------------------------------------   

   Servomotore   -->  arancio segnale 
                      rosso 5V
                      marrone GND

   ------------------------------------------   */

// libreria servomotore
#include <Servo.h>
Servo myServo;

// giorniMese --> indica il numero di giorni di ogni mese
int giorniMese[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// pinLedMese --> indica il pin a cui è collegato ogni mese
int pinLedMese[] = {2, 3, 4, 5, 6, 7, 8, 0, 10, 11, 12, 13};

// imposta le variabili iniziali

int iMese;
int nMesi = 12;
int iGiorno;
int iAnno;

// se maggiore di 0 indica che l'anno è bisestile
float Bisestile = 0.23; 

// attiva la stampa su seriale per controllo flusso programma


int Seriale = false;

// giorno del mese --> Servocomando
int       giornoPin = 9;       // pin a cui è collegato il servocomando
float     giornoStepAngle = 5; // passo dell'angolo corrispondente a ogni giorno

float     giornoAngMin = (180 - 30 * giornoStepAngle)/2;
float     giornoAngle;
int       servoAng;


void setup()
{
  if (Seriale == true){
    Serial.begin(9600);
  
    Serial.println("Test per controllo calendario analogico");
    Serial.println("novembre 2014");  
  }
  
  // inizializza e spegne tutti i led
  for (iMese = 1; iMese <= nMesi; iMese = iMese + 1) {
      pinMode (pinLedMese[iMese - 1], OUTPUT);
      digitalWrite (pinLedMese[iMese - 1], LOW);
  }
  

  Bisestile = float(iAnno)/4 - int(iAnno)/4;

  if(Bisestile > 0.0){
    giorniMese[1] = 28;
  }
  else{
    giorniMese[1] = 29;
  }
  
  // fissa la partenza
  iMese = 6;
  iGiorno = 21;
  iAnno = 2015;
  
  iGiorno = iGiorno - 1;
  
  // ----- giorno
  pinMode (giornoPin, OUTPUT);
  myServo.attach(giornoPin);
  
  
  // delay (5000);
  
}

void loop()
{
  // ritado 
  // va impostato al numero di millisecondi di un giorno
  // 1000 * 60 * 60 * 24  --> 86400 x* 1000
  // in questo esempio 3 secondi
  delay (3000);

  // incrementa l'indice del numero di giorno corrente
  iGiorno = iGiorno + 1;
  
  
  
  // controllo generale
  //
  // se nel mese corrente è stato superato il numero di giorni del mese
  //       riparte dall'inizio
  //       aggiunge 1 al mese
  //
  if(iGiorno > giorniMese[iMese - 1]){
    iGiorno = 1;
    iMese = iMese + 1;

    // se il mese è maggiore del numero di mesi
    //       riparte da 1 
    //       aggiunge 1 all'anno   -- non usato in questo esempio 
    //                                servirà se si aggiunge display anno
    //
    if(iMese > nMesi){
        iMese =  1; 
        //iAnno = iAnno +1 ;    
    }
  }
  // accensione del led corrispondente al mese corrente
  //      attenzione i va da 1 a 12
  //      il led corrispondente va da 0 a 11
  int i;
  for (i = 1; i <= nMesi; i = i + 1) {
      if(i == iMese){
          digitalWrite (pinLedMese[i - 1], HIGH);
      }
      else {
          digitalWrite (pinLedMese[i - 1], LOW);
      }
  }

  //iGiorno = 1;
  giornoAngle = giornoAngMin + (iGiorno - 1) * giornoStepAngle;
  servoAng = map(giornoAngle, 0, 179, 0, 179);


  if (Seriale == true){

    //Serial.print(iAnno);
    //Serial.print("   ");
    Serial.print(iMese);
    Serial.print("   ");
    Serial.print(iGiorno);
    Serial.print("   ");
    Serial.print(giornoAngle);
    Serial.print("   ");
    Serial.println(servoAng);
  }

  // posizionamento della lancetta sull'angolo corripondente al giorno calcolato
  myServo.write(servoAng);
  
}



ZappocoJ, novembre 2014