In questo progetto costruirai una clessidra digitale che accende un LED ogni dieci minuti. Saprai per quanto tempo stai lavorando sui tuoi progetti usando il timer incorporato di arduino.
Molto spesso quando accade un evento in uno specifico intervallo di tempo si utilizza la funzione delay(). Questa funzione è pratica ma è allo stesso tempo limitante. Quando Arduino chiama la funzione delay() blocca il suo stato corrente per la durata del ritardo. Significa che non ci sono altri ingressi o uscite quando è in attesa. I ritardi non sono molto utili per tenere traccia del tempo.
La funzione millis() aiuta a risolvere questi problemi. Tiene traccia del tempo in cui Arduino è in funzionante in millesimi di secondo.
Molto spesso dichiariamo le variabili come int. Un int è un numero a 16 bit, che contiene valori tra -32768 e 32767. Possono sembrare numeri grandi, ma Arduino conta 1000 volte al secondo con la funzione millis() e quindi esaurisci i numeri in poco tempo. Il tipo di dato long contiene un numero da 32 bit (tra -2147483648 e 2147483647). Dal momento che non è possibile tornare indietro per ottenere numeri negativi, la variabile per immagazzinare il tempo millis() è chiamata unsigned long. Quando un tipo di dato è chiamato unsigned contiene valori positivi. Un unsigend Long ti permette di contare da 0 a 4294967295. C’è abbastanza spazio per fa sì che la funzione millis() tenga traccia del tempo per almeno 50 giorni. Confrontando il valore attuale di millis(9 a un valore specifico puoi vedere se è passato o meno un certo periodo.
Quando capovolgi la clessidra, un interruttore di inclinazione cambierà il suo stato e prenderà il via un nuovo ciclo di accensione dei LED.
L’interruttore di inclinazione funzione come un normale interruttore nel senso che “apre o chiude” un circuito. Lo useremo come ingresso digitale.
Ciò che rende unico l’interruttore di inclinazione è che rileva l’orientamento. Normalmente ha una piccola cavità all’interno del corpo che contiene una sfera di metallo. Quando è inclinato in modo coretto, la sfera rotola su un lato della cavità e collega i due terminali che sono sulla breadboard chiudendo l’interruttore.
Componenti da utilizzare:
- 1x Board Arduino Uno
- 1x sensore di inclinazione
- 6x LED
- 6x resistenze da 220 ohm
- 1x resistenza da 10 kilo ohm
Il diagramma elettronico:
Il codice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
/* Hai bisogno di alcune variabili globali. Per iniziare, creare una costante chiamata switchPin. Questo è il nome del piedino al quale è connesso l'interruttore di inclinazione */ const int switchPin = 8; /* Questa variabile memorizza il momento in cui è stato modificato il LED */ unsigned long previousTime = 0; /* Crea una variabile per lo stato dell'interruttore e un'altra per memorizzare il precedente stato dell'interruttore. Userai queste due variabili per confrontare la posizione dell'interruttore da un ciclo successivo. Crea una variabile chiamata led, che verrà usata per verificare quale led è il prossimo ad accendersi. inzia con il piedino 2. */ int switchState = 0; int prevSwitchState = 0; int led = 2; /* L'ultima variabile da creare è l'intervallo di accensione di ogni LED. questo è un tipo di dato long. 10 minuti sono 600000 millisecondi. Se vuoi modificare l'intervallo di accensione devi modificare il valore di questa variabile. */ long interval = 600000; /* nel setup() hai bisogno di dichiarare come output i piedini dei led 2-7. un ciclo for li dichiara tutti e sei come OUTPUT con 3 righe di codice. Hai bisogno di dichiarare switchPin come INPUT. */ void setup() { for (int x = 2; x < 8; x++) { pinMode(x, OUTPUT); } pinMode(switchPin, INPUT); } /* Quando inizia il loop, misura la quantità di tempo in cui arduino è stato in funzione con millis e immagazzinalo in una variabile locale chiamata currentTime */ void loop() { unsigned long currentTime = millis(); /* tramite questa interazione if controlli se è passato abbastanza tempo per accendere un LED. Sottrai currentTime da previousTime e controlla se è maggiore della variabile intervallo. se sono passati 600000 mill di secondo imposta la variabile previousTime al valore di currentTime */ if (currentTime - previousTime > interval) { previousTime = currentTime; if (led > 7) { warning(); } else { /* previousTime indica l'ultima volta in cui è stato acceso un LED. Quando hai impostato previousTime accendi il LED e incrementa la variabile led. a prossima volta che passi l'intervallo di tempo, il led successivo si accende. */ digitalWrite(led, HIGH); led++; } } /* dopo aver controllato il tempo, guardo se l'interrutore ha cambiato il suo stato. */ switchState = digitalRead(switchPin); /* con questa interazione if verifichi se l'interruttore si trova in una posizione diversa da quella precedente. il != controlla se switchState è diverso da prevSwitchState. Se sono diversi, spegni i LED e riporta la variabile led a lprimo piedino e azzera il timer per i LED impostando previousTime al valore di currentTime */ if (switchState != prevSwitchState) { for(int x = 2; x < 8; x++) { digitalWrite(x, LOW); } led = 2; /*Alla fine del loop(), salva lo stato dell'interruttore in prevSwitchState cosi puoi confrontarlo al valore di switchState nel loop() successivo */ previousTime = currentTime; } prevSwitchState = switchState; } void warning() { for(int x = 2; x < 8; x++) { digitalWrite(x, LOW); } delay(250); for(int x = 2; x < 8; x++) { digitalWrite(x, HIGH); } } |
Sei pronto a copiare e caricare il codice.
Conclusione
Una volta che hai programmato la scheda controlla l’ora su un orologio. Dopo che sono passati 10 minuti, il primo LED dovrebbe essersi acceso. Ogni 10 minuti si accenderà un altro LED. Alla fine di un’ora, tutte le 6 luci dovrebbero essere accese. Quando ribalti il circuito (la clessidra) e fai cambiare lo stato all’interruttore di inclinazione, le luci si spegneranno e il timer ripartirà.
Iscriviti ai nostri gruppi Telegram
Link utili