Utilizzare un sensore PIR per creare un rilevatore di movimento per sistema di allarme
Un rilevatore di movimento è utile non solo per i sistemi di allarme domestici ma anche per rilevare animali che si intrufolano in ambienti chiusi o aperti.
La realizzazione di questo sistema è semplice e richiede un investimento esiguo. Ho acquistato per circa 8€ un sensore PIR (Passive Infra-Red) della Parallax molto compatto che dispone di una lente di Fresnel e di un circuito di amplificazione che lo rende molto sensibile e capace di rilevare corpi in movimento a distanze di qualche metro.
I pin di collegamento di questo modulo sono tre di cui due per l’alimentazione ed uno per l’uscita del segnale.
L’uscita è un singolo bit, alto quando viene rilevato un movimento e basso in mancanza di rilevamento. L’alimentazione del dispositivo può variare da 3 a 6 Vdc.
Il sensore dispone anche di un selettore per aumentare o diminuire la sua sensibilità.
Impiegare questo sensore in un circuito risulta veramente semplice sia nei collegamenti hardware sia nella gestione software.
Vediamo insieme come impiegarlo utilizzando Arduino UNO con lo schema seguente:
L’uscita del sensore è collegata al pin2 dell’Arduino UNO precedentemente configurato via software come ingresso. La resistenza da 10Kohm, posta tra il pin2 e la massa, serve per creare un riferimento verso certo (pull-down) per evitare false letture.
Il codice di esempio permette di leggere, a tempi ciclici, lo stato dell’uscita del sensore PIR e di spedire tramite seriale questo valore. L’invio del dato risulta interessante per creare un log dei rilevamenti del sensore, magari per creare dei grafici o memorizzarli per una futura consultazione.
Un sistema di allarme che si rispetti possiede giustamente un attuatore necessario a far demordere il tentativo di furto o intrusione tramite una sirena o degli indicatori luminosi. Questo può avvenire tramite i pin dell’Arduino non utilizzati per pilotare dei relè che agiscono sulla sirena o sulle luci.
int StatoSensore = 0; void setup() { //Init Seriale Serial.begin(9600); //Config porta 2 come ingresso pinMode(2, INPUT); } void loop() { //leggo segnale Sensore PIR StatoSensore = digitalRead(2); //Invio dati alla seriale Serial.print(StatoSensore); //Lettura ogni secondo delay(1000); }
Sebbene questo codice funzioni, risulta poco efficace in quanto l’invio dei dati avviene a prescindere dallo stato rilevato dal sensore quindi credo sia meglio inviarli solamente quando questo rileva un movimento. Aggiungendo un blocco if otteniamo questa funzionalità:
/* Marco Lai Ago 2011 PIR Sensor with Parallax 555-28027 */ int StatoSensore = 0; void setup() { //Init Seriale Serial.begin(9600); //Config porta 2 come ingresso pinMode(2, INPUT); } void loop() { //leggo segnale Sensore PIR StatoSensore = digitalRead(2); //invia i dati solo se rilevo un movimento if (StatoSensore == HIGH) //Invio dati alla seriale Serial.println("PIR ATTIVO"); //Lettura ogni mezzo secondo delay(500); }
Il dato viene inviato tramite la porta USB per ogni rilevazione di movimento. Questi dati possono essere acquisiti tramite un software capace di leggere dalla porta seriale. Il software deve semplicemente configurarsi per leggere dalla stessa porta che hai selezionato per programmare l’Arduino UNO:
Nel mio caso è la COM4 e di seguito uno spezzone di codice C# utilizzato per leggere dalla porta:
//seleziono nome porta dove è mappato l'Arduino UNO serialPort1.PortName = "COM4"; //apro la porta seriale serialPort1.Open(); //creo un gestore di evento per la ricezione serialPort1.DataReceived += new SerialDataReceivedEventHandler(Data_RX);
Data la sua utilità realizzare un sistema di allarme è, grazie a questo sensore, una procedura molto semplice e rapida da realizzare. Nulla ci vieta di utilizzare più sensori PIR per tenere sotto controllo più aree. Questo sensore avendo anche una buona corrente in uscita si presta ad essere collocato anche a diversi metri di distanza dalla board Arduino.
Related posts
10 Comments
Lascia un commento Annulla risposta
Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
Ciao Marco,
dove sei riuscito a comprare il sensore ?
Grazie,
Paolo.
Ciao Paolo, tutto bene?
questo sensore l’ho acquistato da elettroshop (http://www.elettroshop.com/). Ci sono diversi sensori e i prezzi mi sembrano buoni. Eccoti il link della pagina del sensore pir (http://www.elettroshop.com/dettagli.asp?pid=1187).
A presto
Marco
Grazie mille !! Come sempre i tuoi articoli sono ottimi….complimenti !!
Saluti,
Paolo.
Grazie per i complimenti! Troppo gentile
a presto
Marco
Ciao Marco seguo da un pò il sito ed i tuoi progetti, complimenti , bei progetti e bel sito!
Vorrei contattarti per chiederti delle cose circa il mondo di arduino & co e qualche progetto che ho in mente, come faccio?
Non ho trovato email!
Grazie e ancora complimenti!
Ciao Andrea, grazie per i complimenti, sono sempre graditi ;)
in privato puoi contattarmi a questa mail info [at] logicaprogrammabile.it
a presto
Marco
Ciao Marco,
innanzitutto complimenti per il sito e per le guide.
Ho creato un web server con arduino dal quale controllo una serie di sensori (gas, una ventola, led,…).
Ho acquistato da poco il sensore Pir 555-28027 ed ho seguito la tua guida per farlo funzionare.
Il sensore pir l’ho collegato al pin 7 di Arduino sul pin 8 ho collegato un led.
il pir funziona. Quando rileva qualcosa nel suo raggio di azione il pin 7 viene portato alto e quando nn rileva nulla non arriva tensione sul pin 7.
il problema è che quando accendo il led sul pin 8, anche se il pir non rileva nulla (non c passo sopra la mano) al pin 7 arriva tensione, portando “alto”, come se il pir rilevasse qualcosa….
Non sono un esperto di elettronica e non so come risolvere il problema.
Puoi aiutarmi?
grazie in anticipo.
Ciao Luigi
grazie dei complimenti! Hai collegato la resistenza da 10Kohm tra il pin 7 e la massa? quando accendi il led sul pin8 forse potrebbe succedere che una componente ir della luce emessa dal led ecciti il PIR, assicurati che il led non illumini il pir.
Fammi sapere
a presto
Marco
Ciao Marco,
la resistenza da 10K di pull-down l’ho messa tra uscita del pir e massa.
Ho provato a spostare il led in un’altra stanza ma non cambia nulla :(
quando accendo il led(sul pin 8) arriva tensione al pin 7 portandomi alta l’entrata.
nel programma ho messo una semplice condizione:
StatoSensore = digitalRead(7);
if (StatoSensore == HIGH){
Serial.println(“1”);
}else{
}
Escludi il pir e metti un led anche sul pin 7 e vedi cosa succede quando poni alto il pin8, Verifica meglio il codice e se hai qualche dubbio puoi mandarmelo via mail così posso vedere se c’è qualche problema di programmazione che ti è sfuggito!
a presto
Marco