Archivi tag: tinkered circuits

Arduino – Esercizio: Realizzare un timer per il lavaggio delle mani

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

// Prof. Maffucci Michele
// gestione servomotore

#include <Servo.h>

int pos = 0;

Servo mioServo;

// scrivere pos +=1 è la stessa cosa che scrivere pos = pos + 1

void setup()
{
  mioServo.attach(9);
}

void loop()
{
  // muove il servo da 0 a 180 gradi
  // con passi di 1 grado
  
 for (pos = 0; pos <= 180; pos += 1) {
    // viene detto al servo di posizionarsi
    // nella posizione inserita nella variabile 'pos'
    mioServo.write(pos);
    // attende 15 ms wait 15 ms
	// per far raggiungere il sevo la posizione
    delay(15); // attesa di 15 millisecondi
  }
  for (pos = 180; pos >= 0; pos -= 1) {
    // viene detto al servo di posizionarsi
    // nella posizione inserita nella variabile 'pos'
    mioServo.write(pos);
    // attende 15 ms wait 15 ms
	// per far raggiungere il sevo la posizione
    delay(15); // attesa di 15 millisecondi
  }  
}

Controllo sensore ultrasuoni

// Prof. Maffucci Michele
// Impostazione sensore ultrasuoni

// distanza minima dell'ostacolo (in cm)

const int distanzaMinima = 20;
int misuraDistanza = 0;

long durata;          // durata dell'impulso
long distanza;        // distanza dell'oggetto
int pin_segnale = 7;  // pin Arduino a cui è collegato il sensore SR04
int pin_trig = 10;    // pin Arduino a cui è collegato il sensore SR04


void setup()
{
    Serial.begin(9600);
	pinMode(pin_trig, OUTPUT);
  	pinMode(pin_segnale, INPUT);
  	Serial.println("Sensore ad ultrasuini");
}

void loop()
{
  Serial.print("Distanza ostacolo: ");
  Serial.println(distanzaOstacolo());
  delay(100);
}

// rilevazione distanza ostacolo

// misura la distanza dell'ostacolo
long distanzaOstacolo()
{
  digitalWrite(pin_trig, LOW);
  delayMicroseconds(2);
  digitalWrite(pin_trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pin_trig, LOW);
  durata = pulseIn(pin_segnale, HIGH);
  distanza = (durata / 2) / 29.1;
  delay(100);
  return distanza;
}

Timer lavaggio mani

// Prof. Maffucci Michele
// realizzazione di un timer
// per il lavaggio delle mani
// in un tempo di 30 secondi

#include <Servo.h>

// Impostazione servomotore
int pos = 0;

Servo mioServo;

// Impostazione sensore ultrasuoni

// distanza minima dell'ostacolo (in cm)

const int distanzaOstacolo = 20;
int misuraDistanza = 0;

long durata;          // durata dell'impulso
long distanza;        // distanza dell'oggetto
int pin_echo = 7;     // pin Arduino a cui è collegato il sensore SR04
int pin_trig = 10;    // pin Arduino a cui è collegato il sensore SR04

void setup() {
    Serial.begin(9600);
    mioServo.attach(9);
	pinMode(pin_trig, OUTPUT);
  	pinMode(pin_echo, INPUT);
  	
// Posizionamento iniziale del servo
  
  mioServo.write(180);
  delay(500);
  mioServo.write(0);
  delay(500);
  mioServo.write(180);

// Avvio alla partenza
  
  Serial.println("Avvio programma lavaggio mani"); 
}

void loop() {
  
  // Se la distanza delle mani dal rubinetto è
  // inferiore alla distanzaOstacolo si avvia il timer
  
    if (misuraDistanzaOstacolo() < distanzaOstacolo) {
    	contoAllaRovesciaServo();
  }
  delay(100);
}


// Conto alla rovescia
// sposta il servo di 6 gradi ogni secondo

void contoAllaRovesciaServo() {
  Serial.println("Conto alla rovescia: ");
  int passi = 30;
  
  for (int i = passi; i >= 0; i--) {

    mioServo.write(i * 6);
    delay(1000);
    Serial.print(i);
    Serial.println(" sec");

  }

  // azzeramento del servo.
  // Le mani sono pulite
  mioServo.write(180);
  delay(500);
}

// misura la distanza dell'ostacolo
long misuraDistanzaOstacolo()
{
  digitalWrite(pin_trig, LOW);
  delayMicroseconds(2);
  digitalWrite(pin_trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pin_trig, LOW);
  durata = pulseIn(pin_echo, HIGH);
  distanza = (durata / 2) / 29.1;
  delay(100);
  return distanza;
}

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 🙂