[Progetto-Arduino] Telecomando ON/OFF con controllo di prossimità – (VI.BE.TV)

Secondo progetto con Arduino Uno (link precedente progettoArduino+Bluetooth+Relè+Lampadina) utilizzando il sensore ad ultrasuoni HC-SR04 e un led IR che mi sono appena arrivati.

VIBETV

childTVNon so quanti di voi abbiano il problema dei bambini che guardano la Tv avvicinandosi troppo allo schermo.
Ai voglia continuare a ripetere di allontanarsi, non c’è niente da fare. Sembra che Peppa Pig & Co. debbano essere guardati appiccicati al video, altrimenti non c’è gusto, anche sotto la minaccia di spegnere la televisione.
Mi è venuta quindi l’idea di monitorare con Arduino la distanza dello spettatore ed eventualmente spegnere la tv se si è troppo vicini allo schermo…

how-watching-tv-and-adult-media-affects-children-039-s-health-21A che distanza bisogna posizionare il televisore?
Occorre tener conto della risoluzione: gli HD e i Full HD vanno guardati a distanze diverse, anche se hanno la stessa grandezza.
Teniamo inoltre presente che 1 pollice (1”) equivale a 2,54 cm.

Per i televisori HD la formula è: (POLLICI x 2,54) x 2,30.
Quindi se dobbiamo calcolare la distanza di un televisore 46” HD dovremo calcolare: (46 x 2,54) x 2,30 ovvero 268,70 (2 m e 69 cm circa).

Per un televisore Full HD la formula è: (POLLICI x 2,54) x 1,50.
Quindi se dobbiamo calcolare la distanza di un televisore 46” Full HD dovremo calcolare: (46 x 2,54) x 1,50 ovvero 175,20 (1 m e 75 cm circa).


Il progetto:
logo-arduino_byZirconetIl dispositivo è davanti al televisore, posto sullo stesso ripiano.
L’inizializzazione è verificabile dall’accensione dei tre led (in sequenza: rosso, giallo e poi verde) e dal suono del buzzer che avverte che il dispositivo è attivo.
Il modulo ad ultrasuoni misura la distanza dell’ostacolo davanti al dispositivo (lo spettatore). Sono contemplate tre distanze limite a 200cm (segnalata dall’accensione del led verde), 130cm (led giallo) e 80cm (led rosso).
Il codice da inviare alla TV lho ricavato
Per evitare misurazioni ridondanti, se la distanza è > 200cm la misurazione avviene ogni 5 secondi, che scendono a 2 secondi a < 130cm e un solo secondo sotto gli 80cm. ArduinoUnoSmd450pxA distanze inferiori alla soglia degli 80cm il sistema rileva un allarme (segnalazione acustica tramite buzzer) e dopo 10 rilevamenti consecutivi provvede ad inviare via infrarossi il segnale di spegnimento alla televisione (invio segnale OFF). ledA questo punto verrà inviato un segnale di accensione alla tv quanto non si rileveranno più allarmi ovvero l’ostacolo (lo spettatore) non si sarà adeguatamente allontanato (distanza > 80cm, invio segnale ON).
Ho anche predisposto la comunicazione seriale per monitorare via seriale quanto misurato durante la fase di test.


Lista componenti hardware utilizzati per questo progetto:
– Arduino Uno;
– modulo sensore HC-SR04;
– IR led 38Khz;
– led rosso;
– led giallo;
– led verde;
– buzzer piezo;
– breadboard;
– resistenze 330Ω;
– resistenza 150Ω;
– cavi e cavetti vari.


Lo schema del progetto:VIBETV_2


Il modulo HC-SR04 è un sensore molto economico, in grado di misurare il tempo impiegato dalle onde sonore emesse da un sorgente a ritornarvici dopo aver incontrato un ostacolo che le riflette. Sono presenti 4 pin: Vcc (+5V), Trigger, Echo, GND. modulo_ultrasuoniUn impulso alto viene inviato sul pin Trigger per almeno 10 microsec, a questo punto il sensore invierà il ping sonoro e aspetterà il ritorno delle onde riflesse, il sensore risponderà sul pin Echo con un impulso alto della durata corrispondente a quella di viaggio delle onde sonore, dopo 38 millisec si considera che non sia stato incontrato alcun ostacolo. Il sensore restituisce il tempo impiegato per andare e tornare dalle onde sonore in microsecondi e visto che la velocità del suono nell’aria alla temperatura di 20° è di circa 343,4 m/s si può calcolare facilmente la distanza dell’ostacolo in centimetri. Per sicurezza si aspettano in genere 50-60 millisec per far si che non vi siano interferenze con la misura successiva.

Il Led IR (infrarossi) è un led capace di emettere un fascio luminoso ad elevata frequenza a 38Khz compatibili con i dispositivi che in casa pilotiamo tramite telecomando infrarossi. az_ir_led_emitter_940Questo fascio luminoso non è altro che una sequenza di bit (0 e 1) che vengono codificati dal ricevente, attraverso la polarizzazione di photo-transistor. Ci sono diversi codifiche etipicamente ogni produttore di dispositivi tecnologici, ha una propria codifica, come ad esempio Sony, NEC, Samsung ecc… tuttavia, è possibile stabilire la sequenza di bit di qualsiasi segnale ad infrarosso, calcolando il tempo in cui il segnale è alto e il tempo in cui il segnale è basso. Questo tipo di codifica si chiama RAW. Utilizzando la libreria IRremote.h il Led IR ad infrarossi va collegato al pin 3, con una resistenza di almeno 100Ω in serie.

Lo sketch:

//Librerie
#include <IRremote.h> //Libreria controllo IR

//Dichiarazioni
IRsend irsend;
unsigned int powerOn [68]={4600,4350,700,1550,650,1550,650,1600,650,450,650,450,650,450,650,450,700,400,700,1550,650,1550,650,1600,650,450,650,450,650,450,700,450,650,450,650,450,650,1550,700,450,650,450,650,450,650,450,650,450,700,400,650,1600,650,450,650,1550,650,1600,650,1550,650,1550,700,1550,650,1550,650};
const int triggerPort = 6; //Trigger Ultrasuoni
const int echoPort = 7; //Echo Ultrasuoni
const int ledR = 10; //led rosso (1,8V) - utilizzata resistenza 330K
const int ledY = 9;  //led giallo(1,9V) - utilizzata resistenza 330K
const int ledG = 8;  //led verde (2,0V) - utilizzata resistenza 330K
const int ledIR = 11; //led IR
const int pinbuzz = 12;//pin Buzzer
int led = 0; //variabile per controllo led iniziale
int alert = 0; //variabile controllo allarmi
int temp = 5000; //variabile controllo delay ultrasuoni
int wow = 0;//variabile controllo
const int Bar0 = 200; //limite MAX ultrasuoni
const int Bar1 = 130; //limite INT ultrasuoni
const int Bar2 = 50;  //limite MIN ultrasuoni

//Inizializzazione
void setup()
{
pinMode(triggerPort, OUTPUT);
pinMode(pinbuzz, OUTPUT);
pinMode(echoPort, INPUT);
pinMode(ledR, OUTPUT);
pinMode(ledY, OUTPUT);
pinMode(ledG, OUTPUT);
Serial.begin(9600);
Serial.print( "Sensore Ultrasuoni: ");
}

//Programma
void loop() {
if (led == 0) {
analogWrite(pinbuzz,128);
digitalWrite(ledR, HIGH );
delay(300);
digitalWrite(ledY, HIGH );
delay(300);
digitalWrite(ledG, HIGH );
delay(300);
digitalWrite(ledR, LOW );
delay(300);
digitalWrite(ledY, LOW );
delay(300);
digitalWrite(ledG, LOW );
digitalWrite(pinbuzz, LOW);
delay(temp);
}  

//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );

//calcolo distanza
long durata = pulseIn( echoPort, HIGH );
long distanza = 0.034 * durata / 2;

Serial.print("distanza: ");

//dopo 38ms è fuori dalla portata del sensore
if( durata > 38000 ){
Serial.println("Fuori portata   ");
}
else{
Serial.print(distanza);
Serial.println(" cm     ");
Serial.print(led);
Serial.println(" led     ");
Serial.print(alert);
Serial.println(" alert");
Serial.print(temp);
Serial.println(" temp     ");
Serial.print(wow);
Serial.println(" wow     ");

if (distanza > Bar0)
{
  digitalWrite(ledY, LOW );
  digitalWrite(ledR, LOW );
  digitalWrite(ledG, HIGH );
  alert = 0;
  temp = 5000;
  if (wow ==1) {
  digitalWrite(ledG, HIGH );
  digitalWrite(ledR, HIGH );
  digitalWrite(ledY, HIGH );
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  wow = 0;
  led = -1;
  }
}

if (distanza > Bar2 && distanza < Bar1)
{
  digitalWrite(ledY, HIGH );
  digitalWrite(ledR, LOW );
  digitalWrite(ledG, LOW );
  alert = 0;
  temp = 2000;
  if (wow ==1) {
  digitalWrite(ledG, HIGH );
  digitalWrite(ledR, HIGH );
  digitalWrite(ledY, HIGH );
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  wow = 0;
  led = -1;
  }
}  

if (distanza > 0 && distanza < Bar2)
{
  digitalWrite(ledG, LOW );
  digitalWrite(ledR, HIGH );
  digitalWrite(ledY, LOW );
  analogWrite(pinbuzz,128);
  delay (50);
  analogWrite(pinbuzz,LOW);
  alert = alert ++;
  temp = 500;
  if (alert > 10 & wow ==0) {
  digitalWrite(ledG, HIGH );
  digitalWrite(ledR, HIGH );
  digitalWrite(ledY, HIGH );
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  irsend.sendRaw(powerOn,68,38);
  delay(100);
  wow = 1;
  alert = 0;
  led = -1;
  delay(1000);
  }
}
}

//Aspetta 2000 microsecondi
delay(temp);
led = led ++;
}

Una Risposta

  1. salve,nella progettazione di tale progetto,parlo a livello costruttivo.. ovvero una volta compilato lo sketch e successivamente montato seguendo precisamente lo schema non funziona nulla a parte il buzzer che suona incessantemente,dove potrebbe essere il problema?

    Mi piace

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: