Componenti · 6 min di lettura

Sensore di movimento PIR (HC-SR501): rilevare il movimento con Arduino, ESP32 e Pico

Come funziona un sensore di movimento PIR? Collegamento dell'HC-SR501, regolazione di sensibilità e tempo, modalità H/L, codice per Arduino, ESP32 e Pico, luce con sensore di movimento e come evitare i falsi allarmi.

Un sensore PIR (Passive InfraRed, infrarosso passivo) è un sensore economico e a bassissimo consumo che rileva quando una persona o un animale si muove nel suo campo visivo. Le luci delle scale che si accendono da sole, gli antifurti e i campanelli automatici funzionano quasi sempre con un PIR. La parola "passivo" significa che il sensore non emette nulla: si limita ad "ascoltare" la radiazione infrarossa emessa dai corpi caldi intorno a lui. Il modello più usato nei progetti Arduino è l'HC-SR501.

Sensore di movimento PIR HC-SR501
Sensore PIR HC-SR501: la cupola bianca è una lente di Fresnel; sulla scheda sotto ci sono due trimmer di regolazione e un ponticello di attivazione.

Come funziona un sensore PIR?

Ogni corpo con una temperatura superiore allo zero assoluto emette radiazione infrarossa, e il corpo umano emette soprattutto a una lunghezza d'onda di 9–10 micrometri. Il cuore del sensore è un elemento piroelettrico sensibile a questa radiazione, diviso in due metà. Quando non si muove nulla, le due metà ricevono la stessa radiazione, i loro segnali si annullano e l'uscita resta tranquilla. Quando qualcuno attraversa il campo visivo, prima una metà e poi l'altra ricevono più radiazione; il circuito del modulo rileva questa differenza e il pin OUT va a HIGH.

La cupola bianca in alto è una lente di Fresnel. Divide il campo visivo in decine di piccole zone e concentra la radiazione di ciascuna sull'elemento. Quando una persona passa da una zona all'altra, il segnale cambia: per questo un sensore PIR rileva benissimo il movimento ma non una persona perfettamente ferma.

Caratteristiche tecniche dell'HC-SR501

CaratteristicaValore
Tensione di alimentazione4,5–20 V (consigliati 5 V)
Corrente a riposoCirca 50 µA
UscitaDigitale: 3,3 V con movimento, 0 V senza
Portata di rilevamento3–7 m (regolabile)
Angolo di rilevamentoCirca 110°
Tempo di uscitaCirca 3 secondi – 5 minuti (regolabile)
Tempo di bloccoCirca 2,5 secondi dopo lo spegnimento dell'uscita
Tempo di riscaldamento30–60 secondi all'accensione

Le regolazioni del modulo

  • Trimmer Sx (sensibilità): regola la portata. Girandolo in senso orario passa da circa 3 a 7 metri.
  • Trimmer Tx (tempo): regola per quanto tempo l'uscita resta HIGH dopo un rilevamento. In senso orario il tempo si allunga.
  • Ponticello H (ripetibile): finché il movimento continua, il tempo riparte ogni volta; ideale per comandare le luci.
  • Ponticello L (singolo): allo scadere del tempo l'uscita torna LOW anche se il movimento continua; serve poi una nuova attivazione.
  • Tempo di blocco: per circa 2,5 secondi dopo che l'uscita è tornata LOW non viene rilevato alcun nuovo movimento; non è regolabile.
Quando inizi a sperimentare, gira entrambi i trimmer completamente in senso antiorario (tempo minimo, sensibilità minima) e metti il ponticello su H. Così non dovrai aspettare minuti dopo ogni prova; impostare il tempo nel codice è comunque molto più flessibile.

Piedinatura e collegamento dell'HC-SR501

PinFunzioneArduino UnoESP32Raspberry Pi Pico
VCCAlimentazione5VVIN (5V)VBUS (5V)
OUTUscita digitale (3,3 V)D2GPIO 27GP16
GNDMassaGNDGNDGND
Sulla maggior parte dei moduli i nomi dei pin sono stampati sopra la scheda, sotto la cupola bianca. Puoi sfilare delicatamente la cupola per leggere le scritte e poi rimetterla al suo posto.

Rilevare il movimento con Arduino

Il codice qui sotto aspetta che il sensore si riscaldi, poi scrive nel Monitor seriale un messaggio quando il movimento inizia e uno quando finisce, accendendo e spegnendo il LED integrato di Arduino. Controllare solo i cambi di stato, invece di stampare l'uscita in continuazione, è anche il metodo che userai nei progetti reali.

Arduino (C++)
1const int PIR_PIN = 2;
2const int LED_PIN = 13;        // dahili LED / built-in LED
3
4bool motion = false;
5
6void setup() {
7  pinMode(PIR_PIN, INPUT);
8  pinMode(LED_PIN, OUTPUT);
9  Serial.begin(9600);
10  Serial.println("Sensör ısınıyor / warming up...");
11  delay(30000);                  // ilk 30 sn kararsız / unstable for ~30 s
12  Serial.println("Hazır / ready");
13}
14
15void loop() {
16  bool now = digitalRead(PIR_PIN);
17  if (now && !motion) {
18    Serial.println("Hareket algılandı / motion detected");
19    digitalWrite(LED_PIN, HIGH);
20    motion = true;
21  } else if (!now && motion) {
22    Serial.println("Hareket bitti / motion ended");
23    digitalWrite(LED_PIN, LOW);
24    motion = false;
25  }
26}
Alla prima accensione il sensore passa 30–60 secondi a "imparare" l'ambiente e in questo tempo può attivarsi da solo. Aspettare questo tempo nel codice, o ignorare le prime attivazioni, evita falsi allarmi a ogni avvio del sistema.

Luce con sensore di movimento: gestire il tempo con millis()

Tenere il tempo di accensione nel codice invece che sul trimmer Tx è molto più flessibile. Il codice qui sotto memorizza l'ora a ogni movimento rilevato e spegne la luce 20 secondi dopo l'ultimo movimento, quindi la luce resta accesa finché qualcuno si muove nella stanza. Su LIGHT_PIN puoi collegare un LED oppure un modulo relè per una lampada a 230 V; se usi un relè attivo basso, scambia HIGH e LOW nell'ultima riga. Il collegamento del relè è spiegato in Cos'è un modulo relè?

Arduino (C++)
1const int PIR_PIN = 2;
2const int LIGHT_PIN = 7;               // LED ya da röle / LED or relay
3const unsigned long ON_TIME = 20000;   // son hareketten sonra 20 sn / 20 s after last motion
4
5unsigned long lastMotion = 0;
6
7void setup() {
8  pinMode(PIR_PIN, INPUT);
9  pinMode(LIGHT_PIN, OUTPUT);
10}
11
12void loop() {
13  if (digitalRead(PIR_PIN) == HIGH) {
14    lastMotion = millis();             // her harekette süreyi yenile / refresh on every motion
15  }
16  bool on = (lastMotion != 0) && (millis() - lastMotion < ON_TIME);
17  digitalWrite(LIGHT_PIN, on ? HIGH : LOW);
18}

PIR con ESP32 e Raspberry Pi Pico

L'uscita dell'HC-SR501 è già a 3,3 V, quindi si può collegare direttamente a ESP32 e Pico senza partitore. Il modulo però va alimentato a 5 V, perché il suo regolatore è instabile sotto i 4,5 V. Sull'ESP32 funziona lo stesso codice Arduino; nei progetti a batteria, mettere l'ESP32 in deep sleep e risvegliarlo con l'uscita del PIR (ext0 wakeup) allunga l'autonomia di settimane. Sul Pico con MicroPython puoi usare un interrupt per non perdere nessun movimento:

MicroPython
1from machine import Pin
2import time
3
4pir = Pin(16, Pin.IN)            # GP16
5led = Pin(25, Pin.OUT)           # dahili LED; Pico W'de Pin("LED") / onboard LED; Pin("LED") on Pico W
6
7def on_motion(pin):
8    led.value(pin.value())       # hareket varken yanar / on while there is motion
9    print("Hareket / motion" if pin.value() else "Bitti / ended")
10
11pir.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=on_motion)
12
13while True:
14    time.sleep(1)

Evitare i falsi rilevamenti

  • Non puntarlo verso fonti di calore: termosifoni, bocchette del condizionatore, finestre al sole e lampade calde lo attivano con sbalzi di temperatura improvvisi.
  • Tienilo lontano da oggetti in movimento: tende, piante o rami che ondeggiano al vento e si sono scaldati al sole sembrano movimento.
  • Pulisci l'alimentazione: relè e moduli Wi-Fi generano disturbi; metti un condensatore da 100 µF tra VCC e GND del sensore.
  • Allontanalo un po' dall'ESP32: un HC-SR501 attaccato all'antenna Wi-Fi può attivarsi da solo ogni tanto; qualche centimetro di distanza e un filo corto di solito risolvono.
  • Con gli animali domestici: abbassa la sensibilità e monta il sensore in alto, leggermente inclinato verso il basso.
  • Non metterlo dietro un vetro: il vetro normale blocca la radiazione infrarossa, quindi un sensore dietro una finestra non vede il movimento all'esterno.

PIR, radar a microonde o ultrasuoni?

CaratteristicaPIR (HC-SR501)Radar a microonde (RCWL-0516)Ultrasuoni (HC-SR04)
Cosa rilevaCorpi caldi in movimentoQualsiasi movimentoLa distanza di un oggetto davanti
Attraverso una parete sottile o una scatolaNoSìNo
Persona perfettamente fermaNoNoLa misura come distanza
ConsumoBassissimo (~50 µA)Basso (~3 mA)Medio (~15 mA)
Uso tipicoLuci, allarmiSensori nascosti, apriportaRilevamento ostacoli, misura di livello

Se vuoi sapere se qualcuno si muove, e non se qualcuno è nella stanza, il PIR è la soluzione più economica. Se devi misurare quanto è lontano un oggetto, dai un'occhiata a Sensore di distanza HC-SR04.

Idee di progetti con il sensore PIR

  • Luce automatica del corridoio: accendi una lampada con un relè quando rileva movimento e spegnila dopo 30 secondi senza movimento.
  • Antifurto: fai suonare un buzzer se rileva movimento in modalità notte; per la parte audio vedi Cos'è un buzzer?
  • Luce notturna intelligente: abbina il PIR a un sensore di luce LDR per una lampada che si accende solo quando è buio e c'è movimento.
  • Notifiche sul telefono: invia un messaggio Telegram da un ESP32 quando rileva movimento.
  • Display a risparmio energetico: accendi la retroilluminazione di un LCD quando qualcuno si avvicina e spegnila quando se ne va.
  • Contapersone: conta ogni passaggio davanti a una porta e mostralo su un display.

Errori comuni e come risolverli

  • L'uscita resta sempre HIGH: il tempo Tx è troppo lungo o in modalità H c'è movimento continuo; abbassa il trimmer e verifica che il sensore non punti verso una fonte di calore.
  • Non si attiva mai: VCC potrebbe non essere a 5 V, il sensore potrebbe essere ancora in riscaldamento o il filo OUT potrebbe essere su un pin diverso da quello del codice.
  • Si attiva da solo ogni pochi secondi: l'alimentazione è disturbata; aggiungi un condensatore e allontanalo da relè e moduli Wi-Fi.
  • Non rileva di nuovo subito dopo la fine del movimento: il tempo di blocco di circa 2,5 secondi è normale, il sensore non è guasto.
  • Montarlo orientato male: un PIR rileva meglio quando il movimento attraversa lateralmente il campo visivo; chi cammina dritto verso di lui viene notato più tardi.

Il sensore PIR è uno dei migliori punti di partenza per il tuo primo progetto di domotica: si collega con tre fili e vedi subito il risultato. Nell'app BlueGrays trovi progetti di luce con sensore di movimento, campanello e antifurto, passo passo con schemi e codice.

Domande frequenti

A che distanza rileva un sensore PIR?

L'HC-SR501 rileva tra 3 e 7 metri con un angolo di circa 110 gradi. La portata si regola con il trimmer Sx (sensibilità) del modulo; girandolo in senso orario aumenta.

Un sensore PIR rileva una persona ferma?

No. Un PIR rileva solo le variazioni della radiazione infrarossa, cioè il movimento. Non si accorge di chi sta seduto perfettamente immobile. Per sapere se c'è qualcuno in una stanza si usano radar di presenza mmWave come l'LD2410.

Un sensore PIR funziona attraverso il vetro?

No. Il normale vetro delle finestre non lascia passare la radiazione infrarossa emessa dal corpo umano, quindi un sensore dietro il vetro non vede il movimento all'esterno. Per l'esterno, monta il sensore fuori, in un punto riparato dalla pioggia.

L'HC-SR501 funziona a 3,3 V?

Il suo regolatore è instabile sotto i 4,5 V, quindi va alimentato a 5 V. L'uscita è già a 3,3 V e può andare direttamente a un ESP32 o a un Pico. Per un sistema tutto a 3,3 V usa il piccolo modulo PIR AM312, che funziona da 2,7 a 12 V.

Perché il mio sensore PIR si attiva da solo?

Le cause più comuni sono il tempo di riscaldamento, le fonti di calore verso cui è puntato (termosifoni, sole, condizionatore) e i disturbi sull'alimentazione. Ignora i primi 60 secondi, orienta il sensore lontano dal calore, metti un condensatore tra VCC e GND e allontanalo dai moduli Wi-Fi.

Che differenza c'è tra la modalità H e L dell'HC-SR501?

In modalità H (ripetibile) il tempo di uscita riparte a ogni rilevamento finché il movimento continua, quindi una luce resta accesa finché qualcuno si muove. In modalità L (singola) l'uscita si spegne allo scadere del tempo anche se il movimento continua; l'attivazione successiva arriva dopo il tempo di blocco.

Vedi tutti i progetti
Rilevatore di movimento con sensore di movimento
#24Principiante
Premium

Rilevatore di movimento con sensore di movimento

Progetto di base che illumina i LED rilevando il movimento nell'ambiente con un sensore di movimento PIR. Insegna la lettura digitale del sensore e la logica di rilevamento del movimento.

4.6(47)
66
Campanello e luce con sensore di movimento
#25Intermedio
Premium

Campanello e luce con sensore di movimento

Progetto che accende il LED e riproduce la melodia del campanello con cicalino quando il sensore PIR rileva un movimento. Combina il rilevamento del movimento con la notifica sonora e luminosa.

4.7(54)
70
Illuminazione automatica con sensore di movimento PIR ESP32
#121Intermedio
Premium

Illuminazione automatica con sensore di movimento PIR ESP32

In questo progetto, utilizzeremo il sensore di movimento PIR HC-SR501 per rilevare la presenza di una persona che entra nella stanza e accendere automaticamente il LED. Quando viene rilevato un movimento, il LED rimarrà acceso per un determinato periodo di tempo e gestiremo il tempo tramite la funzione `millis()` e un contatore, senza ricorrere alla funzione `delay()`. In questo modo otterremo un sistema di illuminazione con sensore di movimento che non blocca l'ESP32, consentendogli di svolgere

4.4(24)
38
Allarme con sensore di movimento ESP32
#140Intermedio
Premium

Allarme con sensore di movimento ESP32

In questo progetto, realizzato utilizzando un ESP32 e un sensore PIR, quando viene rilevato un movimento, il cicalino si attiva emettendo un allarme acustico. Si tratta di un'applicazione semplice ed economica per un sistema di sicurezza. (Le immagini sono puramente illustrative; collegarle in base al testo)

4.4(10)
15
Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)
#141Avanzato
Premium

Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)

Trasforma il tuo corridoio, bagno o dispensa in illuminazione intelligente con ESP32! Utilizzando un sensore di movimento PIR, un sensore di luce LDR e un modulo relè, costruiamo lo scenario classico "la luce si accende quando viene rilevato movimento al buio" — se l'ambiente è già luminoso, il movimento NON attiva la luce, risparmiando energia durante il giorno. La luce rimane accesa per 30 secondi; se il movimento continua, il timer si azzera e la luce rimane accesa più a lungo. Il display OLE

4.3(6)
11
Sistema di Allarme Movimento ESP32 (PIR + Buzzer + LED + Telegram)
#145Avanzato
Premium

Sistema di Allarme Movimento ESP32 (PIR + Buzzer + LED + Telegram)

Un sistema di allarme di sicurezza intelligente che attiva buzzer e LED quando il sensore PIR rileva movimento, inviando contemporaneamente una notifica istantanea al proprietario tramite Telegram. Dispone di un cooldown di 30 secondi per evitare falsi allarmi. Adatto a sicurezza domestica, monitoraggio di garage, magazzini o studi. Con l'ESP32-CAM è possibile aggiungere notifiche con foto; con il classico ESP32 DevKit V1 vengono inviate notifiche di testo.

0.0(0)
8
Sistema di allarme laser
#22Intermedio
Premium

Sistema di allarme laser

Progetto di sicurezza che rileva l'interruzione del raggio laser tramite LDR e avvisa con un cicalino e un LED. Insegna la logica del rilevamento dell'interruzione della luce con la coppia laser-LDR.

4.8(64)
82
Sistema di sicurezza laser
#23Avanzato
Premium

Sistema di sicurezza laser

Sistema di sicurezza avanzato che attiva l'allarme quando il raggio laser viene interrotto e può essere ripristinato tramite pulsante o controllo IR. Insegna la gestione di più sorgenti di ingresso e

4.8(60)
77

Impara come un sensore PIR rileva il movimento delle persone, come regolare l'HC-SR501, collegarlo ad Arduino, creare una luce che si accende al passaggio ed evitare i falsi allarmi.

Sensore di movimento PIR (HC-SR501): rilevare il movimento con Arduino, ESP32 e Pico | BlueGrays