Zpět na články

ESP32 a PIR senzor pohybu: použití přerušení a časovačů

Naučte se rozsvítít LED při detekci pohybu PIR senzorem. LED zůstane zapnutá určitou dobu a poté se automaticky vypne.

ESP32 a PIR senzor pohybu: použití přerušení a časovačů

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.

ESP32 Blog image

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í:¨

pir.cpp
1attachInterrupt(GPIO, callback_function, mode);
ESP32 Blog image

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:

pir.cpp
1ARDUINO_ISR_ATTR

Ten 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:

pir.cpp
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:

pir.cpp
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:

  1. uloží se čas poslední události
  2. při každém průchodu smyčkou se porovnává aktuální čas
  3. 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:

  1. PIR senzor detekuje pohyb
  2. spustí se přerušení
  3. ESP32 zaznamená čas detekce
  4. LED dioda se rozsvítí
  5. 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:

  1. přerušení uloží čas do proměnné
  2. spustí se časovač
  3. 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.

pir.cpp
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.

Nakupte svoje ESP32 ještě dnes!

Doprava Zásilkovnou za 89 Kč
Platba dobírkou
Vrácení do 30 dnů
Omezené zásoby - skladem

ESP32-S3 DevKit USB-C

Kompletní vývojová deska s USB-C

240MHz dvoujádrový
WiFi 802.11 b/g/n
Bluetooth 4.2 + BLE
4MB Flash paměť
520KB SRAM
38 GPIO pinů
209za kus

Množstevní slevy:

1
Celkem
209
Objednat

Bezpečná platba při převzetí zásilky nebo online platba přes Comgate, a.s.