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