
Di seguito mostro parte della soluzione agli esercizi assegnati ai miei studenti negli scorsi giorni in riferimento alla progettazione di un semplice dispositivo di automazione da collocare in bagno in prossimità del lavandino, in grado di rilevare ad una distanza minima fissata la presenza delle mani e l’avvio di un timer che mostra il trascorrere del tempo. L’indicazione del tempo che trascorre viene realizzata con un servomotore a cui dovrà poi essere fissata una lancetta e che mostra il trascorrere del tempo su una scala graduata. Il tempo di lavaggio viene fissato a 30 secondi. Sulla serial monitor dovrà essere indicato lo stato di avvio del sistema ed il tempo.
Soluzione
Controllo servomotore

22 | for (pos = 0; pos <= 180; pos += 1) { |
30 | for (pos = 180; pos >= 0; pos -= 1) { |
Controllo sensore ultrasuoni

6 | const int distanzaMinima = 20; |
18 | pinMode(pin_trig, OUTPUT); |
19 | pinMode(pin_segnale, INPUT); |
20 | Serial.println( "Sensore ad ultrasuini" ); |
25 | Serial.print( "Distanza ostacolo: " ); |
26 | Serial.println(distanzaOstacolo()); |
33 | long distanzaOstacolo() |
35 | digitalWrite(pin_trig, LOW); |
37 | digitalWrite(pin_trig, HIGH); |
38 | delayMicroseconds(10); |
39 | digitalWrite(pin_trig, LOW); |
40 | durata = pulseIn(pin_segnale, HIGH); |
41 | distanza = (durata / 2) / 29.1; |
Timer lavaggio mani

17 | const int distanzaOstacolo = 20; |
18 | int misuraDistanza = 0; |
28 | pinMode(pin_trig, OUTPUT); |
29 | pinMode(pin_echo, INPUT); |
41 | Serial.println( "Avvio programma lavaggio mani" ); |
49 | if (misuraDistanzaOstacolo() < distanzaOstacolo) { |
50 | contoAllaRovesciaServo(); |
59 | void contoAllaRovesciaServo() { |
60 | Serial.println( "Conto alla rovescia: " ); |
63 | for ( int i = passi; i >= 0; i--) { |
65 | mioServo.write(i * 6); |
68 | Serial.println( " sec" ); |
79 | long misuraDistanzaOstacolo() |
81 | digitalWrite(pin_trig, LOW); |
83 | digitalWrite(pin_trig, HIGH); |
84 | delayMicroseconds(10); |
85 | digitalWrite(pin_trig, LOW); |
86 | durata = pulseIn(pin_echo, HIGH); |
87 | distanza = (durata / 2) / 29.1; |
Esercizio 1
Modificare lo sketch precedente aggiungendo due LED, verde e rosso. Lo stato di riposo, timer non funzionante, deve essere indicato dal LED verde acceso e Led rosso spento, mentre lo stato di funzionamento del timer deve essere evidenziato dal LED verde spento e LED rosso acceso.
Esercizio 2
Modificare lo sketch precedente aggiungendo due LED, verde e rosso e un buzzer. Lo stato di riposo, timer non funzionante, deve essere indicato dal LED verde acceso e Led rosso spento, all’avvio del timer il buzzer deve emettere una nota ad una frequenza fissata per un tempo di 1 secondo. Lo stato di funzionamento del timer deve essere evidenziato dal LED verde spento e LED rosso acceso, allo scadere del tempo di lavaggio deve essere emessa una nota di durata 1 secondo ad una frequenza diversa dalla nota di avvio.
Esercizio 3
Realizzare l’esercizio 2 con le medesime caratteristiche e componenti, però sostituendo il servomotore usato come indicatore, con un display LCD 16×2 che indichi il trascorrere del tempo.
Buon lavoro 