Lezione 6 su Arduino: I sensori di presenza PIR
In questa sesta lezione su Arduino, parleremo di un interessante trasduttore, che può essere utile per tantissimi progetti: il sensore di presenza. Ecco una breve descrizione tratta da Wikipedia:
I sensori di prossimità (chiamati anche proximity) sono dei sensori in grado di rilevare la presenza di oggetti nelle immediate vicinanze del “lato sensibile” del sensore stesso, senza che vi sia un effettivo contatto fisico.La distanza entro cui questi sensori rilevano oggetti è definita portata nominale (o campo sensibile). Alcuni modelli dispongono di un sistema di regolazione per poter calibrare la distanza di rilevazione.L’assenza di meccanismi d’attuazione meccanica, e di un contatto fisico tra sensore e oggetto, fa sì che questi sensori presentino un’affidabilità elevata.
Dal punto di vista circuitale, un sensore di presenza, ha 3 PIN.
- VCC: Per l’alimentazione
- OUT: Ha un valore 1 o 0 logico, a seconda della presenza di un oggetto in movimento
- Ground
Nei prossimi programmi, vedremo come utilizzare il sensore PIR per monitorare la presenza di oggetti in movimento, creare un piccolo sistema d’allarme oppure accedere una luce.
Requisiti per i programmi
- Arduino Uno
- Shield Ethernet
Serve per ottenere l’ora
- Sensore di presenza PIR HC-SR501
Costo 4-5 Euro, acquistabile su Ebay
- Relè
1° Programma: Rileviamo la presenza di un oggetto in movimento e accendiamo un LED
I collegamenti, per questo programma sono abbastanza semplici. Basta collegare i cavi del sensore PIR, come riportati in figura.
Da notare, una interessante caratteristica, è quella di poter aumentare il periodo in cui l’uscita sia ad un livello logico alto, regolando la manopola di destra. In questo caso, non si fa altro che variare una resistenza, che fa aumentare il tempo in cui l’uscita sia ad 1 logico.
/* Programam che utilizza il sensore di presenza PIR HC-SR501, per rilevare la presenza di un oggetto in movimento e accende un LED, collegato al PIN 13*/ // Tempo di calibrazione del sensore int calibrationTime = 30; //Il tempo in cui l'uscita sia bassa long unsigned int lowIn; // valore di millisecondi, per cui si ritiene che ci sia "quiete" long unsigned int pause = 5000; boolean lockLow = true; boolean takeLowTime; int pirPin = 3; //il PIN di Arduino a cui è collegato il sensore int ledPin = 13; //il PIN a cui è connesso il LED // Impostazione del sensore void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(pirPin, LOW); //Fase di calibrazione Serial.print("calibrating sensor "); for(int i = 0; i < calibrationTime; i++){ Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); } void loop(){ // Questo IF permette di stabilre se il sensore rileva un oggetto in movimento if(digitalRead(pirPin) == HIGH){ digitalWrite(ledPin, HIGH); /Accendiamo il LED if(lockLow){ lockLow = false; Serial.println("---"); Serial.print("motion detected at "); Serial.print(millis()/1000); Serial.println(" sec"); delay(50); } takeLowTime = true; } // Questo IF permette di stabilire se non c'è più nessun movimento if(digitalRead(pirPin) == LOW){ digitalWrite(ledPin, LOW); //Si spegne il LED if(takeLowTime){ lowIn = millis(); takeLowTime = false; } if(!lockLow && millis() - lowIn > pause){ lockLow = true; Serial.print("motion ended at "); //output Serial.print((millis() - pause)/1000); Serial.println(" sec"); delay(50); } } }
2°Programma: Creiamo un un piccolo sistema di allarme con il sensore PIR
Questo programma permette di creare un piccolo sistema d’allarme, grazie ad Buzzer, LED e al sensore PIR. I collegamenti sono indicati nel codice del programma.
/* Programma che fa emettere un suono e accedere un LED, quando c'è un oggetto in movimento, grazie ad un sensore PIR*/ int pirPin = 2; int pinSpeaker= 10; int ledPin = 13; void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); pinMode(pinSpeaker, OUTPUT); } void loop(){ int pirVal = digitalRead(pirPin); Serial.println("starting to read PIR"); analogWrite(ledPin, 0); delay(2000); if(pirVal == LOW) { analogWrite(ledPin, 255); Serial.println("Motion Detected"); tone(10, 700, 100); delay(2000); } } void tone(long duration, int freq) { duration *= 1000; int period = (1.0 / freq) * 1000000; long elapsed_time = 0; while (elapsed_time < duration) { digitalWrite(pinSpeaker,HIGH); delayMicroseconds(period / 2); digitalWrite(pinSpeaker, LOW); delayMicroseconds(period / 2); elapsed_time += (period); } }
Una domanda.
Secondo voi è possibile collegare un sensore di questo tipo ad una distanza di 15/20mt?
Se sì, con quale cavo?
Grazie!
Non ci sarebbe nessun problema nell’utilizzo di un cavo da 15/20 metri, in quanto si potrebbe usare un buffer, che trasferisce il rilevamento ad Arduino. Il problema è il costo. Ti consiglio di usare un sensore wireless a 433 MHz. Trovi un tutorial nel mio blog, riguardo all’utilizzo con il sensore PIR. Spero di esserti stato utile.
scusate il disturbo, volevo semplicemente chiedere se era necessaria la Shield Ethernet. Nel senso posso costruire il circuito anche senza?
Assolutamente si! La scheda ethernet serve per inviare il rilevamento nella rete, ma non a rilevarlo!
grazie in primis per il tutorial…
ho provato a seguirlo ma non riesco a capire perché il mio sensore sembra fare quello che vuole, in particolare segna sempre il movimento anche quando sono fuori dalla stanza…
premetto che sto usando un sensore diverso rispetto al vostro, per la precisione un sensore pir SE 10 con resistenza da 10 kohm, e che sono alle prime armi con arduino…
grazie
Salve,
è un po’ difficile capire i motivi per cui non funziona regolamento il progetto; mi servirebbe sia il programma che lo schema hardware. Ad ogni modo, se viene rispettato alla lettera il progetto, con il sensore uguale, non ci dovrebbe essere problemi.
Grazie per la risposta, ho riprovato con un altro sensore (DYP-ME003) e sembra tutto funzionare perfettamente tranne per quanto riguarda il led che non resta acceso durante il rilevamento costante della presenza ma si continua ad accendere e spegnere. Può essere legato alla questione del jumper?
grazie ancora
(sono alle prime armi come si noterà =) grazie per la pazienza)
Salve,
tipicamente i sensori PIR hanno un potenziometro (è una resistenza variabile), che permette di selezionare per quanto tipo il sensore manda un segnale ALTO (in pratica rileva il movimento) ad Arduino. All’interno del programma, puoi fare un ciclo while che fintanto che il sensore manda ALTO, lasci acceso il LED, altrimenti lo spegni. Spero di esserti stato d’aiuto.
Salve,
sto utilizzando la programmazione riportata inizialmente per accendere un led con sensore pir identico. Copiando lo sketch e cliccando su verifica mi da un errore nella quarantesima linea,come mai? Premettendo che sono alle prime armi
Salve,
penso che sia un problema di WordPress. Ti consiglio di copiare il codice da Github.
Ciao Vincenzo.
ti da errore perche manca una barra “//” per evidenziare il commento.
Ciao, che sensore si può utilizzare per rilevare il passaggio di una lattina o di una bottiglietta, all’ingresso di un tubo ?
Il passaggio di un oggetto può essere rilevato attraverso due fotocellule posizionate all’estremità del tubo. Eventualmente, qualora il tubo porti ad una sezione piana, è possibile utilizzare un sensore basato sulle celle di carico (tipo una bilancia).
Il tubo porta in un sacco…non è che mi potresti fornire qualche link ?
Scrivimi via email esattamente il progetto che desideri fare
Salve,
innanzitutto complimenti per l’articolo e per la completa disponibilità con noi “principianti”.
Io ho il classico problema dell’accensione delle luci in giardino. Ovviamente non sarebbe difficile se si utilizza un unico sensore PIR, ma avrei bisogno di accendere le luci nel vialetto da due punti differenti, quindi: rilevato da due sensori. Esempio: una persona entra dal cancello e ne viene rilevata la presenza (PIR 1), percorre il vialetto e dopo n. secondi (determinati dal pot sul rilevatore) le luci si spengono. Ma dovrebbe essere valido anche: una persona esce da casa viene rilevato il suo movimento (PIR 2), percorre il viale e si dirige verso il cancello. Spero di non essere stato troppo “invadente”, ma la domanda è: posso gestire questa situazione utilizzando gli schemi proposti negli esempi aggiungendo un sensore allo schema?
Grazie, Max.
Grazie per i complimenti. Partiamo dal seguente ragionamenti; i sensori PIR sono dei trasduttori in grado di rilevare la variazione di calore, che può essere generata dal passaggio di una persona. Tipicamente i sensori PIR hanno due potenziometri, ovvero due resistenze variabili che fanno aumentare il tempo delle accensioni delle luci e la sensibilità del sensore, ovvero la distanza a cui può rilevare il movimento. In questo caso, se con un unico sensore è possibile rilevare il passaggio di una persona si dal cancello che da casa, è possibile usare tranquillamente il mio schema. Altrimenti è necessario utilizzare dei piccoli sensori Wireless, per poter utilizzare due sensori PIR/arduino alla volta.
Grazie per la risposta.
Quindi la soluzione migliore sarebbe di posizionare un sensore in una posizione “strategica” in modo da rilevare il passaggio di una persona (sia in entrata che in uscita). Altrimenti usare due rilevatori wireless (per via della lunghezza dei cavi?).
Si è proprio così
Salve. Questi sensori PIR come noto vanno alimentati minimo a 5v e danno una tensione in uscita di 3,2v giusto, ora io dovendo far accendere dei led a 5v come potrei riportare la tensione in out a 5v? Grazie.
Lei vuole utilizzare l’uscita del sensore PIR per alimentare un LED?
Si questi led si trovano in una lampada e sono 4 credo che siano collegati in serie e quindi hanno bisogno di una tensione minima di 5v per avere una luce sufficiente, nella sudetta ho sostituito il sensore pir originale con questo PIR HC-SR501, che conosce molto meglio di me il funzionamento, grazie e saluti.
Ci sono dei circuiti che permettono di aumentare la tensione, ma il mio consiglio è quello di usare un transistor/relè, a cui sia sufficiente una tensione d’eccitazione della bobina per 3.3 v.
Sono alla ricerca di un sistema che invece del movimento mi segnali se la mattina andando al lavoro ho dimenticato una delle dieci finestre aperta – Dieci sensori wireless del tipo usato per le finestre una centralina che faccia accendere I corrispondenti led legati ad una data finestra.
Salve,
posso se vuole fare un piccolo tutorial sul blog. In pratica servono dei sensori magnetici posti sulle finestre per rilevare se esse sono chiuse oppure aperte.