Il sensore utilizzato in questi esempi è il sensore infrarosso PIR tipo HC-SR501 si presenta come una scheda dalle seguenti dimensioni 33 x 25mm e di 8 g di peso. Questo modulo è un sensore a infrarossi in grado di fornire un segnale alto a 3V quando rileva un corpo caldo in movimento.
Sensore infrarosso HC-RS501
Il sensore infrarosso passivo piroelettrico (PIR) tipo HC-SR501 è basato sul chip BISS0001, integrato U4 (datasheet) per l’interfaccia, l’alimentazione è regolata al valore di 3,3V tramite apposito regolatore (IC1), ed è presente un diodo (D1) a protezione dell’inversione di polarità.
![]() |
![]() |
![]() |
Sulla scheda del sensore HC-SR501 sono presenti due trimmer, uno regola la sensibilità e l’altro tempi di uscita.
Per quanto riguarda la sensibilità avremo che ruotando in senso orario => Alta sensibilità, mentre in senso antiorario => bassa sensibilità (intervallo compreso tra 3-7 m).
Per i tempi di uscita, in senso orario => lungo, antiorario => corto (intervallo compreso tra 3-300 sec)
Sul connettore d’uscita, abbiamo il polo di alimentazione Vcc (+ 5-20V), quello centrale è il pin d’uscita del segnale, mentre l’ultimo rappresenta il terminale di massa.
L’uscita è alta (3,3 V) o bassa (0 V)
Caratteristiche del sensore
- Tensione di alimentazione: da 4,5V dc a 20V dc
- Tensione di uscita: 0-3,3V
- Corrente di uscita: 10 mA
- Angolo di visione: <140°
- Distanza di rilevamento: da 3 a 7 mt
Il sensore di movimento PIR HC-SR501 è uno dei più facili da collegarsi ad un Arduino o a qualsiasi altro microcontrollore, tra l’altro può essere utilizzato anche come un rilevatore di movimento autonomo.
Si possono trovare due versioni della scheda. Uno con un jumper a 3 poli ed uno con piazzole di saldatura.
- Con il ponticello messo nella sua posizione inferiore (con la scheda ancora di fronte, come descritto) non vi è alcun ripristino. No reset
- Ponticello nella sua posizione superiore (H) è in modalità ripristino automatico. Auto-reset
Quando impostato su No reset sensore di rilevamento si ferma una volta che ha innescato, e l’uscita rimane alta per il periodo di tempo prestabilito.
Se è impostato su auto-reset il segnale del sensore rimarrà alto fino a quando il movimento si arresta. Dopo, se non viene rilevato un movimento l’uscita diminuirà.
Per scegliere una di queste impostazioni, è sufficiente creare una saldatura-ponte tra il pad con l’etichetta e il pad in mezzo. il default è ‘L’
Dove trovare il sensore PIR
Il sensore PIR può essere acquistato presso il sito FUTURA ELETTRONICA, il codice prodotto è 2846-PIRMOD , il suo costo, al momento della pubblicazione di questo articolo è di 5 €.
Di questo sensore ne esiste anche una versione compatta tipo AM312, vedere articolo Sensore infrarosso PIR compatto AM312
Programmi di esempio
Per testare il sensore HC-SR501 sono presentati alcuni esempi: Rilevazione di oggetto in movimento , Semplice sistema di allarme
Rilevazione di oggetto in movimento
Il primo esempio mostra la semplice attivazione del sensore con accensione di un led. Tramite il monitor seriale viene mostrato il tempo di attivazione del sensore.
Sono necessari i seguenti componenti
Arduino UNO | Sensore PIR HC-SR501 | Diodo led |
![]() |
![]() |
![]() |
Programma test_sensore_pir.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
/* Programma:test_sensore_pir.ino Il programma accende un led quando un corpo caldo è in movimento. di Adriano Gandolfo https://www.adrirobot.it */ //Definizione dei PIN int pirPin = 4; //il PIN di Arduino a cui è collegato il sensore int ledPin = 13; //il PIN a cui è connesso il LED // Tempo di calibrazione del sensore int calibrationTime = 15; //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; // Impostazione del sensore void setup() { Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(pirPin, LOW); //Fase di calibrazione Serial.print("Calibrazione del sensore "); for (int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println(" Fatto"); Serial.println("SENSORE ATTIVO"); 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("Movimento rilevato a "); 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("Movimento terminato a "); //output Serial.print((millis() - pause) / 1000); Serial.println(" sec"); delay(50); } } } |
Semplice sistema di allarme
Il secondo esempio rappresenta un’elementare sistema di allarme. Sono necessari i seguenti componenti
Arduino UNO | Sensore PIR HC-SR501 | Diodo led |
![]() |
![]() |
![]() |
KY-019 5V relay module | KY-006 Small passive buzzer | |
![]() |
![]() |
Esempio di utilizzo fatto dall’amico Cristiano Rossi
Programma allarme_pir_HC-SR501.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/* Programma:allarme_pir_HC-SR501.ino Il programma attiva un relè, accende un led e fa emettere un suono quando un corpo caldo è in movimento, grazie al sensore Creato da Adriano Gandolfo revisione 1.1 del 10/3/2019 */ //Definizione dei PIN e variabili int pirPin = 2; int pinSpeaker = 3; int pinRele = 4; int ledPin = 13; int pirVal = digitalRead(pirPin); void setup() { Serial.begin(9600); // Definizione pin pinMode(pirPin, INPUT); pinMode(pinSpeaker, OUTPUT); pinMode(pinRele, OUTPUT); pinMode(ledPin, OUTPUT); digitalWrite(pinRele, HIGH); Serial.println("Programma allarme con PIR"); Serial.println("Pausa stabilizzazione sensore"); tone(pinSpeaker, 1000, 500); //tone(pin, frequency, duration) delay(5000); Serial.println("Inizio controllo"); tone(pinSpeaker, 500, 500); } void loop() { Serial.println("Lettura sensore PIR"); digitalWrite(ledPin, 0); digitalWrite(pinRele, HIGH); delay(2000); if (pirVal == HIGH) { Serial.println("RILEVATO MOVIMENTO"); digitalWrite(ledPin, HIGH); digitalWrite(pinRele, LOW); tone(pinSpeaker, 1000, 1000); //tone(pin, frequency, duration) delay(2000); } } |
Altra applicazione del modulo per realizzare un semplice sistema di allarme , che utilizza come base il Multi test Shield