Ciljevi učenja
- Razlikovati napajanje HC-SR501 od 5 V i njegov izlaz kompatibilan sa logikom 3,3 V.
- Povezati PIR izlaz sa GPIO27 i LED sa GPIO25 preko otpornika od 220 Ω.
- Objasniti početno čekanje od 60 sekundi i dodatno zadržavanje svjetla od pet sekundi.
- Pratiti posljednji aktivni izlaz pomoću millis() i osvježavati interval bez dugog blokirajućeg čekanja.
- Razlikovati unutrašnje kašnjenje modula, programsko zadržavanje i ograničenja detekcije kretanja.
Prije početka
Završi kurseve 04 i 07: vremensko upravljanje pomoću millis() i čitanje digitalnog izlaza senzorskog modula. Potrebno je i povezivanje LED diode sa otpornikom.
Referentna postavka
- Ploča u Arduino IDE-u
- ESP32 Dev Module
- Arduino-ESP32
- 3.3.12
- Serial Monitor
- 115200 baud
Ovo je referentni profil, a ne identifikacija ploče sa fotografije. Za ESP32-C3/S2/S3 ili drugačije označenu ploču treba prilagoditi GPIO i provjeriti šemu prije spajanja.
Šta ćemo napraviti
Napravićemo model automatskog svjetla koje reaguje na kretanje. PIR modul HC-SR501 šalje digitalni signal ESP32 ploči, a program uključuje LED. Kada modul prestane slati aktivan signal, LED ostaje uključena još pet sekundi. Novi aktivan signal produžava taj interval.
Prvih 60 sekundi poslije pokretanja program namjerno drži LED ugašenom. Time odvajamo početno smirivanje senzora od redovnog rada. Vježba pokazuje kako se fizički senzor, njegovo unutrašnje vremensko upravljanje i naš program zajedno odražavaju na rezultat.
Šta ćeš naučiti
- Razlikovati napajanje senzora od naponskog nivoa njegovog izlaza.
- Povezati HC-SR501 sa digitalnim ulazom ESP32.
- Napraviti početni period čekanja bez dugog
delay()poziva. - Produžavati uključenost svjetla dok postoji aktivan signal.
- Razlikovati detekciju kretanja od pouzdane detekcije prisustva.
Predznanje
Završi kurseve 04 i 07: upravljanje vremenom pomoću millis() i čitanje digitalnog izlaza senzorskog modula. Potrebno je da znaš povezati LED sa serijskim otpornikom i prepoznati oznake GPIO, GND, 3V3 i priključak USB napajanja od 5 V.
Potrebna oprema
| Komponenta | Količina | Specifikacija i napomene |
|---|---|---|
| ESP32 razvojna ploča sa klasičnim ESP32-WROOM-32 modulom | 1 | GPIO nazivi moraju odgovarati referentnom profilu; fizički položaj izvoda provjeriti na ploči. |
| USB kabl za podatke i napajanje | 1 | Priključak prilagoditi ploči; komplet na slici navodi Micro-USB. |
| Eksperimentalna ploča | 1 | Komplet navodi 830 kontaktnih tačaka. Provjeriti eventualni prekid naponskih vodova. |
| PIR senzor pokreta HC-SR501 | 1 | Napajanje modula 5 V sa USB voda ploče; izlaz OUT 3,3 V. Provjeriti raspored pinova, H/L kratkospojnik i trajanje impulsa. |
| Crvena LED dioda | 1 | Anoda A i katoda K; provjeriti polaritet stvarne komponente. |
| Otpornik 220 Ω | 1 | Po jedan otpornik za svaku LED granu; 220 Ω iz kompleta. |
| Spojni kablovi | 6 | M-M ili F-M prema priključcima ploče. Okvirna količina, zavisno od rasporeda i tipa priključaka. |
Referentna ploča je klasični ESP32-WROOM-32. Referentni HC-SR501 radi sa napajanjem od 5 V i izlazom približno 3,3 V kada je aktivan; takvu razliku navodi SunFounder specifikacija. Provjeri svoj modul i dokumentaciju ploče prije spajanja. Naziv na fotografiji sam po sebi ne potvrđuje raspored pinova ili osobine svake kopije.
Šta PIR zapravo otkriva
PIR je pasivni infracrveni senzor. Registruje promjene infracrvenog zračenja u vidnom polju. Prolazak osobe može izazvati aktivan izlaz, ali nepomična osoba ne mora stalno održavati detekciju. Iz jednog signala ne možemo odrediti broj ljudi, identitet ili udaljenost. Princip modula opisuje SunFounder dokumentacija.
HC-SR501 već ima sopstveno zadržavanje izlaza i podešavanje osjetljivosti. Za demonstraciju izaberi režim ponavljanja H i najmanje kašnjenje prema oznakama svog modula. U režimu H novi pokreti mogu produžavati HIGH; režim L ima drugačije ponašanje ponovnog okidanja. Zato pet sekundi u programu ne znači pet sekundi od posljednjeg stvarnog pokreta.
Šema i povezivanje
Šema povezivanja
HC-SR501 se napaja sa provjerenog USB 5 V izvoda ploče, a njegov OUT daje 3,3 V logiku. Naziv USB5V ovdje označava funkciju: stvarni pin može biti označen 5V ili VIN i mora se provjeriti u šemi ploče. Nikad ne spoji 5 V na GPIO.
| Od | Do | Opis veze |
|---|---|---|
ESP32.USB5V | U1.VCC | Napajanje modula; provjeriti oznaku VCC. |
ESP32.GND | U1.GND | Zajednička masa ploče i senzora. |
U1.OUT | ESP32.GPIO27 | Digitalni signal nivoa 3,3 V prema GPIO27. |
ESP32.GPIO25 | R1.1 | Digitalni izlaz za LED. |
R1.2 | D1.A | Serijski otpornik R1, 220 Ω, prema anodi LED. |
D1.K | ESP32.GND | Katoda prema zajedničkoj masi. |
- Isključi USB i provjeri funkcionalne oznake VCC, OUT i GND na modulu. Ne prepisuj fizički raspored sa druge verzije.
- Spoji GND modula sa GND ESP32.
- Spoji VCC modula na priključak ploče za koji je dokumentacijom potvrđeno da daje USB napajanje od 5 V. Oznaka
VINna nepoznatoj ploči nije dovoljna potvrda. - Spoji OUT na GPIO27. Sam izlaz mora biti kompatibilan sa logikom 3,3 V; 5 V nikada ne dovodi na GPIO.
- Spoji GPIO25 preko R1 od 220 Ω na anodu D1. Katodu LED spoji na GND.
- Pregledaj veze, zatim napajaj ploču samo USB kablom. U ovoj vježbi ne dodaj nezavisno napajanje od 5 V uz USB.
GPIO27 koristimo kao INPUT: senzor određuje njegov nivo. Priključak 5 V napaja isključivo modul; nije oznaka logičkog nivoa koji program smije primiti.
Priprema Arduino okruženja
U Arduino IDE-u 2.x koristi esp32 by Espressif Systems 3.3.12, ploču ESP32 Dev Module i odgovarajući port. Espressif uputstvo za instalaciju opisuje dodavanje paketa. Dodatne biblioteke nisu potrebne.
Raspakuj Arduino primjer i otvori pir_light/pir_light.ino. Naziv foldera treba da odgovara nazivu programa. Provjeri GPIO27 za PIR i GPIO25 za LED, zatim podesi Serial Monitor na 115200 baud.
Kompletan Arduino program
#include <Arduino.h>
// HC-SR501: USB-derived 5 V to VCC, common GND, verified 3.3 V OUT to GPIO27.
constexpr uint8_t PIR_PIN = 27;
constexpr uint8_t LED_PIN = 25;
constexpr uint32_t WARMUP_MS = 60000;
constexpr uint32_t HOLD_MS = 5000;
constexpr uint32_t REPORT_MS = 500;
uint32_t startedAt = 0;
uint32_t lastHighAt = 0;
uint32_t lastReportAt = 0;
bool warmupComplete = false;
bool lampOn = false;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
startedAt = millis();
lastReportAt = startedAt;
Serial.println("PIR warm-up: LED remains OFF for 60 seconds.");
}
void loop() {
const uint32_t now = millis();
const int raw = digitalRead(PIR_PIN);
if (!warmupComplete && static_cast<uint32_t>(now - startedAt) >= WARMUP_MS) {
warmupComplete = true;
Serial.println("PIR monitoring started.");
}
if (!warmupComplete) {
lampOn = false;
} else if (raw == HIGH) {
lastHighAt = now;
lampOn = true;
} else if (lampOn && static_cast<uint32_t>(now - lastHighAt) >= HOLD_MS) {
lampOn = false;
}
digitalWrite(LED_PIN, lampOn ? HIGH : LOW);
if (static_cast<uint32_t>(now - lastReportAt) >= REPORT_MS) {
lastReportAt = now;
Serial.print("state="); Serial.print(warmupComplete ? "MONITORING" : "WARMUP");
Serial.print(" raw="); Serial.print(raw);
Serial.print(" LED="); Serial.println(lampOn ? "ON" : "OFF");
}
}
Počni originalnim programom. Vrijednosti WARMUP_MS = 60000 i HOLD_MS = 5000 čine početno ponašanje lako provjerljivim.
Kako program upravlja vremenom
Tokom početnog čekanja LED ostaje ugašena bez obzira na OUT. Poslije tog perioda svaki očitani HIGH uključuje LED i osvježava lastHighAt. Kada očitavamo LOW, program poredi sadašnje vrijeme sa posljednjim zabilježenim HIGH. LED se gasi kada protekne najmanje HOLD_MS.
Program koristi razliku vremenskih oznaka tipa uint32_t, umjesto poređenja sa budućom apsolutnom oznakom. Takav način računanja podržava prelazak brojača millis() preko njegove granice za ove kratke intervale. Završeno početno čekanje ostaje završeno; ne ponavlja se samo zato što se brojač kasnije prelio. Arduino dokumentacija za millis() objašnjava povratnu vrijednost i prelivanje.
Pokretanje i očekivano ponašanje
Klikni Verify, zatim Upload. Otvori Serial Monitor i resetuj ESP32. Sačekaj 60 sekundi, držeći senzor mirno. To je izabrani interval vježbe, a ne garancija da će svaki modul biti potpuno stabilan baš tada.
Poslije čekanja prođi ispred senzora. Posmatraj oznake state, raw i LED u izvještajima koji stižu približno svakih 500 ms. MONITORING označava redovan rad. Potom se udalji i sačekaj da modul vrati OUT na LOW. Tek tada možeš vidjeti dodatno zadržavanje svjetla. Izvještavanje je rjeđe od provjere ulaza, pa vrijeme poruke nije precizno vrijeme svake promjene.
Eksperiment i tabela opažanja
| Korak | Očekivano ponašanje | Šta zabilježiti |
|---|---|---|
| Reset i prvih 60 s | LED ugašena i kada OUT postane aktivan. | Završetak čekanja. |
| Kretanje poslije čekanja | HIGH uključuje LED. | Prvi primijećeni aktivan izlaz. |
OUT ostaje HIGH | LED ne počinje odbrojavati gašenje. | Trajanje izlaza modula. |
OUT pređe na LOW | LED se gasi oko pet sekundi poslije posljednjeg očitanog HIGH. | Vrijeme promjene i gašenja. |
Novi HIGH prije gašenja | Petosekundni interval počinje iznova. | Razliku prema prethodnoj probi. |
Tabela opisuje očekivanja, ne unaprijed izmjerene rezultate. Svoje opažanje upiši tokom rada na ploči.
Najčešći problemi
| Simptom | Provjera i postupak |
|---|---|
| LED odmah poslije reseta ne reaguje | Sačekaj završetak 60-sekundnog početnog perioda. |
| LED ostaje dugo uključena | Prvo provjeri OUT; modul može još držati HIGH. Smanji njegovo kašnjenje prema dokumentaciji. |
| Nema detekcije | Provjeri zajednički GND, GPIO27, ispravno USB napajanje od 5 V i položaj senzora. |
| Aktiviranje bez namjernog prolaska | Učvrsti modul, završi smirivanje i udalji ga od promjenljivih izvora toplote. |
| OUT se mijenja, LED ne radi | Provjeri GPIO25, polaritet i otpornik; ponovi LED primjer iz kursa 02. |
Samostalni zadatak
Promijeni HOLD_MS na 10000 i ponovi istu probu. Zadrži početno čekanje. Zatim izračunaj: poslije smirivanja posljednji očitani HIGH bio je u 78. sekundi od pokretanja; kasnije nema novog HIGH. Kada očekuješ gašenje za početnu, a kada za izmijenjenu vrijednost?
Pitanja za provjeru
- Zašto VCC od 5 V ne znači da i OUT mora biti 5 V?
- Šta se dešava ako modul neprekidno daje
HIGH? - Može li ugašena LED dokazati da u prostoriji nema nikoga?
Smjernice i rješenje
Za posljednji HIGH u 78. sekundi početni program gasi LED približno u 83, a izmijenjeni u 88. sekundi. Stvarno gašenje nastupa u prvom prolazu petlje poslije isteka intervala. Svaki kasniji HIGH pomjera taj trenutak.
Napajanje i izlazni nivo odvojene su specifikacije modula. Neprekidni HIGH stalno osvježava vrijeme i održava svjetlo. Ugašena LED pokazuje da je istekla naša vremenska logika bez novog aktivnog izlaza, a ne da je prostorija sigurno prazna. Vrati HOLD_MS na 5000 za sljedeće vježbe.
