Tutorial Arduino n.08
Cosa impareremo:
Costruire una clessidra con arduino è abbastanza semplice. In questo tutorial utilizzeremo un interruttore di inclinazione, è dotato di una sfera metallica che apre e chiude l'interruttore a seconda di come è posizionato.
Componenti Richiesti:
1 interruttore di inclinazione 
Programmazione:
//la costante dove è collegato l'interruttore di inclinazione
const int switchPin = 8;
unsigned long previousTime = 0; /* memorizza l'ultimo LED acceso. Ti sei domandato
perchè non utilizzo int e utilizzo long?*/
int switchState = 0; // lo stato attuale dell'interruttore di inclinazione
int prevSwitchState = 0; // lo stato precedente
/*Confrontiamo lo stato attuale con quello precedente
per capire dove si trova tra un ciclo e un altro*/
int led = 2; // una variabile per i led, così capiremo qual'è il prossimo ad accendersi
// 600000 millisecondi = 10 minuti
long interval = 600000; // l'intervallo che passa tra l'accensione di un LED ad un altro
void setup() {
/* Per comodità utilizziamo un ciclo for per dichiarare i piedini
come output, ma potreste anche mettervi a scrivere
pinMode(2, OUTPUT); per 8 volte; geniale no? così quando
programmerete i LED di uno shuttle della nasa subito farete! */
for(int x = 2;x<8;x++){
pinMode(x, OUTPUT);
}
// l'unico input è lo switchPin, ovvero, l'interruttore
pinMode(switchPin, INPUT);
}
void loop(){
/* Adesso controlliamo da quanto tempo è stato avviato lo sketch*/
/*immagazziniamo da quanto arduino è acceso, perchè non utilizziamo
delay? la funzione delay ibernizza arduino per un tot di tempo e non
possono avvenire eventi come input e output, con millis contiamo per
quanto tempo deve avvenire un evento o tra quanti millisecondi dovrà
avvenire. Non ho utilizzato int(numeri interi) perchè è un numero a 16
bit che può contare da -32768 a 32767. Arduino conta 1000 volte
in un secondo, perciò utilizzando double risolviamo il problema perchè
i numeri a doppia precisione, 32 bit, sono più grandi e vanno
da -2147483648 a 2147483648. Vogliamo esagerare? non contiamo partendo
dal negativo, ma da 0 a 4294967295 con unsigned long. */
/*abbastanza esaustivo? ogni tanto mi farebbe piacere un feedback
nei commenti, grazie!!! */
unsigned long currentTime = millis();
//utilizziamo la condizione if per verificare se sono passati 10 min
//la sottrazione: attuale meno precedente controlliamo se è maggiore dell'interrallo
if(currentTime - previousTime > interval) {
/*impostiamo il tempo corrente alla variabile precedente, così teniamo
conto del tempo totale, se non ci fosse si accenderebbe sempre lo stesso LED */
previousTime = currentTime;
// Accendi il led
digitalWrite(led, HIGH);
// incrementiamo la var. led
// tra 10 minuti si accenderà il prossimo
led++;
if(led == 7){
//verifica che tutte le luci sono accese
}
}
// leggi il valore dell' interruttore
switchState = digitalRead(switchPin);
// se l'interruttore si trova in una posizione diversa
if(switchState != prevSwitchState){
// spegni tutti i LED.
for(int x = 2;x<8;x++){
digitalWrite(x, LOW);
}
// resetta il contatore dei LED
led = 2;
//resetta anche il timer già che ti trovi
previousTime = currentTime;
}
// imposta lo stato corrente a quello precedente
prevSwitchState = switchState;
}Schema Elettronico:
Dimostrazione:



