Buona Pasqua! In occasione delle feste, ho pensato di realizzare un piccolo progetto per controllare le tentazioni alimentari, dopo le abbuffate di questi ultimi giorni! Si tratta di un piccolo congegno che ci avverte quando viene sollevato il coperchio di una scatola di cioccolatini.
Costruiamo quindi il nostro allarme anti-golosi.
Necessario
Tutto quello che ci serve per il progetto sono un LED, un buzzer piezo, un tilt sensor e un paio di cavi e di resistenze. Una volta ultimato il progetto, vedremo poi come usare un microchip ATTiny85 per miniaturizzare il tutto.
Funzionamento
Il congegno è molto semplice: grazie a un piccolo tilt sensor, un dispositivo in grado di percepire un’inclinazione maggiore di 30°, potremo stabilire se il coperchio della nostra scatola di cioccolatini viene aperto, e in quel caso far suonare il piezo e accendere il led per scoraggiare eventuali intrusi!
Circuito
Lo schema del circuito è anche questo piuttosto semplice: il led è collegato a terra e ad un pin con una resistenza, il piezo è collegato a terra e a un pin, il tilt sensor invece ad un pin con una resistenza sul versante che va alla 5V, mentre l’altro capo va a terra. È più facile da guardare che da spiegare.
Sketch
Passiamo adesso al codice del nostro sketch. Abbiamo già visto come accendere un led, e come far suonare un piezo. Dobbiamo soltanto capire come utilizzare il tilt sensor e poi non ci resta che mettere insieme il tutto. Definiamo, per cominciare, ingressi e uscite.
int ledPin = 2; int piezoPin = 9; int tiltPin = 5; void setup() { // Definisco led e piezo come OUTPUT pinMode(ledPin, OUTPUT); pinMode(piezoPin, OUTPUT); // Definisco tilt-sensor come INPUT pinMode(tiltPin, INPUT); // Abilita la resistenza di pull-up interna, circa 20k Ohm // In questo modo si evita la resistenza fisica da 10k Ohm // digitalWrite(tiltPin, HIGH); }
Come vedremo nella seconda parte di questo studio, è possibile eliminare la resistenza da 10k Ohm collegata al tilt sensor – e quindi risparmiare spazio nel circuito – con una semplice riga di codice che abilita la resistenza pull-up interna sul pin del sensore. Per il momento, lasciamo il codice commentato.
LED
Vogliamo che una volta aperta la scatola, il nostro led lampeggi in maniera “aggressiva”. Mettiamo quindi un bel led rosso e facciamolo lampeggiare 3 o 4 volte.
digitalWrite(ledPin,HIGH); delay(500); digitalWrite(ledPin,LOW); delay(500);
Piezo
Anche il suono del dispositivo deve “scoraggiare” gli eventuali intrusi! Facciamo suonare il piezo in maniera alternata, come se fosse una sirena.
tone(piezoPin,400); delay(500); tone(piezoPin,200); delay(500); noTone(piezoPin);
La funzione tone() permette di far suonare al piezo una semplice nota. Esiste anche una variante della funzione tone() che permette di specificare la durata della nota, ma per il nostro esempio non andrebbe bene, perché le note da suonare sono due. Perciò è più semplice far suonare la nota, e poi impostare la sua durata con un semplice delay(). La funzione noTone() è importante per evitare che il piezo continui a suonare all’infinito.
Tilt
Facciamo adesso qualche prova per verificare se l’inclinazione del sensore viene rilevata. Una volta sicuri che alzando il coperchio scatterà l’allarme, impostiamo il codice in modo che si attivi il led e che il piezo suoni.
// Leggo il valore del tilt sensor int sensore = digitalRead(tiltPin); // Quando in sensore viene inclinato if ( sensore == HIGH ) { // Allarme!! allarme(); }
La funzione allarme() scatta quando viene sollevato il coperchio: attiva il led, emette un suono alto per mezzo secondo, poi spegne il led ed emette un suono basso per un altro mezzo secondo, poi ricomincia; il tutto per 3 volte.
void allarme() { // Per 3 volte: // accendo e spengo il led // suono il piezo a sirena for ( int i=0; i<3; i++ ) { // Accendo il led digitalWrite(ledPin,HIGH); // Suono "alto" tone(piezoPin,400); // Durata: mezzo secondo delay(500); // Spengo il led digitalWrite(ledPin,LOW); // Suono "basso" tone(piezoPin,200); // Durata: mezzo secondo delay(500); // Fermo il piezo, altrimenti il suono non si interrompe mai! noTone(piezoPin); } }
Conclusioni
Ecco realizzato il nostro congegno anti golosi! Posizionato sotto il coperchio di una scatola di cioccolatini, scoraggerà chiunque tenterà di aprirla. Nella seconda parte di questo studio vedremo come ottimizzare il codice ed il circuito, e come miniaturizzare il tutto per creare un dispositivo vero e funzionante.
Per adesso è tutto. A presto!
Download: candy_alarm.zip
Antonio ha detto:
salve, al posto del tilt sensor potrei usare un sensore magnetico che azioni il tutto quando apro una porta. cosa cambia nel codice? grazie
studioarduino ha detto:
Ciao Antonio. Nel codice non dovrebbe cambiare nulla, il dispositivo si attiva quando il contatto viene chiuso e la corrente passa: la riga di codice che aziona il meccanismo è: if (sensore==HIGH). Nel tuo caso, il circuito si chiuderà quando i due magneti vengono allontanati. È diverso il funzionamento, ma la logica è la stessa: quindi immagino che il codice, se sostituisci il tilt sensor con un sensore magnetico, possa funzionare senza grosse modifiche.
Antonio ha detto:
grazie mille per la tempestiva risposta. ci provo e vi faccio sapere. Saluti
Antonio ha detto:
funziona, grazie mille!
studioarduino ha detto:
🙂
Antonio ha detto:
Sai cosa aggiungerei, almeno nel mio caso? poichè ha la funzione di allarme…vorrei che il buzzer e il led non cessassero di funzionare solo quando riavvicino i contatti ma quando decido io di disattivarlo magari mediante un pulsante. cosa ne pensi in merito? grazie mille per la disponibilità
studioarduino ha detto:
Beh, direi che si può fare! Per esperienza, ti posso solo suggerire di provare per prima cosa a far suonare l’allarme fino a quando non richiudi il contatto, e poi di provare ad aggiungere il pulsante per fermarlo in un secondo momento. Così, facendo una prova per volta, non corri il rischio di avere un allarme che non si accende mai o che non smette più di suonare 🙂 Buon esperimento!
Antonio ha detto:
Questo l’ho già testato e grazie a tuoi consigli va benissimo! Solo che essendo un allarme vorrei che se viene chiusa la porticina (i contatti si avvicinano)l’allarme non si interrompi ma continui a suonare fino a che non venga disattivato manualmente. grazie ancora 🙂