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 resistenze da 10Kilo Ohm10kohm

6 resistenze da 220 Ohm  resistore

1 interruttore di inclinazione 185258_RB_00_FB.EPS_1000
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:

 

clessidra

 

Dimostrazione:

 

clessidra