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:
Commenti