Mikrokontrolér ESP32 je velmi oblíbený při tvorbě IoT projektů a chytré elektroniky. Jedním z častých scénářů je detekce pohybu pomocí PIR senzoru. V tomto článku si ukážeme, jak propojit PIR senzor s ESP32 a jak využít přerušení (interrupts) a časovače (timers) pro efektivní reakci na detekovaný pohyb.
Výsledkem projektu bude jednoduchý systém, který při detekci pohybu rozsvítí LED diodu na určitou dobu a následně ji automaticky vypne.
Co je PIR senzor pohybu
PIR (Passive Infrared) senzor detekuje změny v infračerveném záření ve svém okolí. Tyto změny obvykle způsobuje pohyb člověka nebo zvířete, protože jejich těla vyzařují teplo.
Senzor funguje tak, že při detekci pohybu nastaví svůj výstupní pin na logickou hodnotu HIGH. Pokud pohyb není detekován, výstup je LOW.
Typický PIR modul má tři piny:
- VCC – napájení senzoru
- GND – zem
- DATA (OUT) – výstupní signál do mikrokontroléru
Při zapojení k ESP32 tedy mikrokontrolér pouze sleduje stav výstupního pinu a reaguje na jeho změny.

Nastavení citlivosti a zpoždění senzoru
Některé PIR senzory (například model HC-SR501 PIR Motion Sensor) mají na desce dva potenciometry:
- Citlivost (Sensitivity) – určuje dosah detekce pohybu
- Čas zpoždění (Time Delay) – určuje, jak dlouho zůstane výstup HIGH po detekci pohybu
Doba, po kterou zůstává výstup HIGH, se označuje jako dwell time nebo také reset time.
Přerušení (Interrupts)
Přerušení umožňují mikrokontroléru reagovat na událost okamžitě bez nutnosti neustále kontrolovat stav vstupu.
Namísto neustálého čtení hodnoty pinu může program spustit speciální funkci vždy, když dojde ke změně signálu.
V prostředí Arduino IDE se přerušení nastavuje funkcí:¨
1attachInterrupt(GPIO, callback_function, mode);
Parametry funkce:
- GPIO – číslo pinu, na kterém sledujeme změnu
- callback_function – funkce, která se spustí při přerušení
- mode – typ změny signálu, která přerušení spustí
Možné režimy jsou například:
- LOW – přerušení při logické nule
- HIGH – přerušení při logické jedničce
- CHANGE – při jakékoli změně
- FALLING – při změně z HIGH na LOW
- RISING – při změně z LOW na HIGH
PIR senzor při detekci pohybu přepne signál z LOW na HIGH, proto se obvykle používá režim RISING.
Funkce ISR (Interrupt Service Routine)
Funkce, která se spustí při přerušení, se nazývá ISR – Interrupt Service Routine.
Pro správné fungování by měla splňovat několik pravidel:
- nesmí vracet žádnou hodnotu
- musí být co nejkratší a nejrychlejší
- nesmí obsahovat složité operace
- neměla by používat funkce jako
delay()nebo sériový výpis
U ESP32 se často používá atribut:
1ARDUINO_ISR_ATTRTen zajistí, že se funkce uloží do rychlé interní paměti RAM.
Časovače (Timers)
V projektu chceme, aby LED svítila pouze určitou dobu po detekci pohybu.
Mnoho začátečníků by použilo funkci:
1delay()Ta ale blokuje celý program – mikrokontrolér během čekání nemůže dělat nic jiného.
Proto je lepší použít neblokující časovač založený na funkci:
1millis()Tato funkce vrací počet milisekund od spuštění programu.
Díky tomu lze jednoduše zjistit, kolik času uplynulo od určité události.
Princip časování pomocí millis()
Princip funguje velmi jednoduše:
- uloží se čas poslední události
- při každém průchodu smyčkou se porovnává aktuální čas
- pokud rozdíl přesáhne nastavený interval, provede se akce
Například při blikání LED:
- LED se zapne
- po určité době se vypne
- program přitom může vykonávat další úlohy
Tento způsob je mnohem vhodnější pro komplexnější projekty.
Projekt: ESP32 s PIR senzorem
Cílem projektu je vytvořit jednoduchý systém detekce pohybu.
Průběh programu:
- PIR senzor detekuje pohyb
- spustí se přerušení
- ESP32 zaznamená čas detekce
- LED dioda se rozsvítí
- po určité době se automaticky vypne
Zároveň se informace o detekci pohybu vypisuje do sériového monitoru.
Zapojení obvodu
Pro projekt jsou potřeba:
- ESP32
- PIR senzor (např. AM312 Mini PIR Motion Sensor)
- LED dioda
- rezistor
Zapojení:
- LED → GPIO 26
- PIR výstup → GPIO 27
- napájení senzoru → 3.3 V
- GND → zem
Je důležité zkontrolovat napětí PIR senzoru. Některé modely fungují na 3.3 V, jiné na 5 V.
Jak funguje program
Program obsahuje několik proměnných:
- aktuální čas programu
- čas poslední detekce pohybu
- proměnnou určující, zda běží časovač
Při detekci pohybu:
- přerušení uloží čas do proměnné
- spustí se časovač
- LED se rozsvítí
Program následně kontroluje, zda uplynula nastavená doba (např. 20 sekund).
Pokud ano, LED se vypne a systém čeká na další detekci pohybu.
1// PIR sensor pin
2const int motionSensor = 27;
3
4// LED pin
5const int ledPin = 26;
6
7// Timer variables
8unsigned long lastMotionTime = 0;
9unsigned long delayTime = 20000; // 20 seconds
10
11// Motion detection flag
12volatile bool motionDetected = false;
13
14// Interrupt function
15void IRAM_ATTR detectMotion() {
16 motionDetected = true;
17}
18
19void setup() {
20 Serial.begin(115200);
21
22 pinMode(motionSensor, INPUT);
23 pinMode(ledPin, OUTPUT);
24
25 digitalWrite(ledPin, LOW);
26
27 // Attach interrupt to PIR sensor
28 attachInterrupt(digitalPinToInterrupt(motionSensor), detectMotion, RISING);
29}
30
31void loop() {
32
33 // If motion detected
34 if (motionDetected) {
35
36 Serial.println("Motion detected!");
37
38 digitalWrite(ledPin, HIGH);
39
40 lastMotionTime = millis();
41
42 motionDetected = false;
43 }
44
45 // Turn off LED after delay
46 if ((millis() - lastMotionTime > delayTime) && digitalRead(ledPin) == HIGH) {
47
48 Serial.println("Motion stopped...");
49 digitalWrite(ledPin, LOW);
50
51 }
52}Možná využití projektu
Stejný princip lze využít v mnoha projektech:
- domácí alarm
- automatické osvětlení
- bezpečnostní systémy
- IoT notifikace
- monitorování prostoru
Například místo rozsvícení LED může ESP32:
- poslat email
- odeslat notifikaci do telefonu
- aktivovat kameru
- zapnout relé.
Shrnutí
Použití přerušení a časovačů je velmi efektivní způsob, jak reagovat na události v mikrokontrolérech.
