Ciljevi učenja
- Povezati 3,3 V fotoosjetljivi modul preko DO na GPIO27 i LED preko 220 Ω na GPIO25.
- Utvrditi stvarni polaritet digitalnog izlaza i podesiti DARK_LEVEL.
- Podesiti trimer tako da razlikuje osvijetljen i zaklonjen fotootpornik.
- Objasniti vremensku provjeru stabilnosti od 50 ms, uključujući prvo stanje nakon resetovanja.
- Razlikovati digitalni prag od mjerenja osvjetljenja u luksima i električne histereze.
Prije početka
Završi kurseve 01, 02 i 03: Arduino okruženje, Serial Monitor, LED sa otpornikom i filtriranje promjene tastera.
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 automatsko svjetlo: LED se uključuje kada fotoosjetljivi modul prijavi mrak, a isključuje kada prijavi dovoljno svjetla. Modul bira granicu svojim trimerom. ESP32 dodatno provjerava da novo očitavanje traje najmanje 50 ms prije promjene LED diode.
Ovaj kurs uvodi važan korak u radu sa senzorima: najprije posmatramo njihov stvarni izlaz, zatim mu u programu dodjeljujemo značenje. Naš cilj je pouzdano razlikovanje dva uslova, uz zapis provjera koje možeš ponoviti.
Šta ćeš naučiti
- Povezati fotoosjetljivi modul sa digitalnim ulazom ESP32.
- Odrediti koji logički nivo označava mrak na tvom modulu.
- Podesiti prag pomoću trimera i provjeriti oba stanja.
- Razlikovati sirovi nivo, prihvaćeno stanje i stanje LED diode.
- Objasniti šta provjera stabilnosti od 50 ms može odbaciti.
Predznanje
Završi kurseve 01, 02 i 03: učitavanje programa, Serial Monitor, LED sa otpornikom i filtriranje promjene tastera. Ovdje ćemo isti princip vremenske provjere primijeniti na izlaz senzorskog modula.
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. |
| Modul senzora svjetlosti sa digitalnim izlazom | 1 | Modul sa fotootpornikom i komparatorom, potvrđen za 3,3 V; VCC/GND/DO. AO se ne koristi. Polaritet DO provjeriti. |
| 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. |
Koristi modul čija dokumentacija potvrđuje rad na 3,3 V i digitalni izlaz označen DO ili D0. Ako postoji AO, u ovoj vježbi ostaje nepovezan. Fotografija kompleta ne potvrđuje tačnu izvedbu modula. Raspored je za klasični ESP32/WROOM-32; varijante C3, S2 i S3 zahtijevaju prilagođen profil.
Kako nastaje digitalna odluka
Fotootpornik mijenja otpor sa osvjetljenjem, a komparator poredi signal sa pragom. SunFounderov referentni modul podržava 3,3–5 V; njegov DO je LOW iznad podešenog praga svjetla, odnosno HIGH ispod njega. Trimer podešava prag. Ove podatke koristi kao referencu, a oznake i ponašanje svog modula provjeri zasebno.
Izlaz DO daje samo dvije mogućnosti. Iz njega ne dobijamo vrijednost u luksima niti razliku između nekoliko nivoa osvjetljenja koji su svi na istoj strani praga. Promjenom trimera pomjeraš granicu odluke, ne mijenjaš jedinicu mjerenja.
U programu je DARK_LEVEL početno HIGH. Ulaz GPIO27 koristi INPUT_PULLUP, odnosno unutrašnji pull-up, prema Espressif GPIO dokumentaciji. To podešavanje nije pretvarač naponskih nivoa: modul napajamo sa 3V3 i ne dovodimo 5 V na GPIO.
Šema i povezivanje
Šema povezivanja
Referentni modul radi na 3,3 V. Koristi se DO; eventualni AO ostaje nepovezan. DARK_LEVEL je početno HIGH, ali polaritet potvrdi osvjetljavanjem i zaklanjanjem senzora. Oznake izvoda su funkcije, a ne njihov fizički redoslijed.
| Od | Do | Opis veze |
|---|---|---|
ESP32.3V3 | U1.VCC | Napajanje modula; provjeriti oznaku VCC. |
ESP32.GND | U1.GND | Zajednička masa ploče i senzora. |
U1.DO | 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. |
- Odspoji USB. Na svojoj ploči pronađi oznake 3V3, GND, GPIO27 i GPIO25; ne broj fizičke položaje pinova.
- Spoji VCC modula na 3V3, a GND modula na GND ploče.
- Spoji digitalni izlaz DO na GPIO27. Provjeri da nisi izabrao AO.
- Spoji GPIO25 preko R1 od 220 Ω na anodu D1. Katodu spoji na zajednički GND.
- Pregledaj grupe rupica eksperimentalne ploče i polaritet LED diode. Tek tada vrati USB.
LED postavi tako da ne osvjetljava direktno fotootpornik. U suprotnom sama uključena LED može promijeniti uslov koji mjerimo i izazvati ponovljeno uključivanje i isključivanje. Taj problem riješi položajem komponenti prije podešavanja programa.
Priprema Arduino okruženja
U Arduino IDE-u 2.x izaberi ESP32 Dev Module i port ploče. Ovaj paket koristi esp32 by Espressif Systems 3.3.12; postupak instalacije je u zvaničnom uputstvu. Dodatne biblioteke nisu potrebne.
Raspakuj Arduino primjer i otvori light_switch/light_switch.ino. Zadrži isti naziv foldera i skice. Klikni Verify, zatim Upload, pa otvori Serial Monitor na 115200 baud. GPIO25 upravlja LED diodom, a GPIO27 čita modul.
Kompletan Arduino program
#include <Arduino.h>
// Classic ESP32/WROOM-32. Use a comparator module rated for 3.3 V.
constexpr uint8_t INPUT_PIN = 27;
constexpr uint8_t LED_PIN = 25;
constexpr int DARK_LEVEL = HIGH; // Change to LOW if your module reports LOW in darkness.
constexpr uint32_t FILTER_MS = 50;
constexpr uint32_t REPORT_MS = 500;
int candidateLevel = HIGH;
uint32_t candidateSince = 0;
uint32_t lastReportAt = 0;
bool acceptedKnown = false;
bool acceptedDark = false;
void setup() {
Serial.begin(115200);
pinMode(INPUT_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
candidateLevel = digitalRead(INPUT_PIN);
candidateSince = millis();
lastReportAt = candidateSince;
Serial.println("Light switch: qualify DO for 50 ms; confirm DARK_LEVEL with your module.");
}
void loop() {
const uint32_t now = millis();
const int raw = digitalRead(INPUT_PIN);
if (raw != candidateLevel) {
candidateLevel = raw;
candidateSince = now;
}
if (static_cast<uint32_t>(now - candidateSince) >= FILTER_MS) {
acceptedKnown = true;
acceptedDark = (candidateLevel == DARK_LEVEL);
}
digitalWrite(LED_PIN, acceptedKnown && acceptedDark ? HIGH : LOW);
if (static_cast<uint32_t>(now - lastReportAt) >= REPORT_MS) {
lastReportAt = now;
Serial.print("raw="); Serial.print(raw);
Serial.print(" accepted=");
Serial.print(!acceptedKnown ? "WAITING" : (acceptedDark ? "DARK" : "LIGHT"));
Serial.print(" LED="); Serial.println(acceptedKnown && acceptedDark ? "ON" : "OFF");
}
}
Prikazani program i preuzeta .ino datoteka imaju isti sadržaj. Za početnu provjeru ostavi DARK_LEVEL na podrazumijevanom HIGH.
Prolazak kroz program
U setup() LED se isključuje i očitava početni ulaz. Početno očitavanje još nije potvrđen uslov: ono mora ostati nepromijenjeno najmanje 50 ms, kao i svaka kasnija promjena.
FILTER_MS određuje 50 ms, candidateLevel čuva kandidata, a candidateSince početak njegove stabilnosti. acceptedKnown označava potvrđeno prvo stanje, a acceptedDark prihvaćeni mrak. U loop() svaka promjena sirovog nivoa ponovo pokreće interval stabilnosti. Tek po isteku intervala program prihvata novi nivo. LED je uključena kada prihvaćeni nivo odgovara DARK_LEVEL. Tokom čekanja ostaje prethodno stanje LED diode. Program koristi razliku vremenskih oznaka dobijenih funkcijom millis(), bez blokirajućeg čekanja od 50 ms.
Serial izvještaj stiže približno svakih 500 ms. raw daje 0 za LOW, 1 za HIGH; accepted prikazuje DARK, LIGHT ili početno WAITING, a LED stanje ON/OFF. Izvještavanje je sporije od očitavanja: kratak impuls može proći između dvije poruke. Zato odsustvo promjene u ispisu nije dokaz da sirovi ulaz nikada nije kratko promijenio nivo.
Određivanje polariteta i praga
Drži modul na uobičajenom svjetlu nekoliko sekundi, zatim zakloni fotootpornik. Posmatraj sirovu vrijednost u oba uslova. Ako ostaje ista, pomalo okreći trimer dok ne dobiješ jasno različite nivoe za osvijetljeno i zaklonjeno stanje. Ne forsiraj mehanički kraj trimera.
Ako zaklonjeni modul daje HIGH, zadrži DARK_LEVEL = HIGH. Ako provjereni modul daje LOW u mraku, promijeni samo tu konstantu na LOW i ponovo učitaj program. Položaj trimera, prostorija i udaljenost izvora svjetla dio su uslova eksperimenta; zapiši ih opisno.
Pokretanje i očekivani rezultati
Sljedeća očekivanja važe nakon pravilnog podešavanja polariteta. Svaki uslov zadrži najmanje dvije sekunde kako bi se vidio u nekoliko izvještaja.
| Proba | Očekivano ponašanje |
|---|---|
| Reset na osvijetljenom mjestu | LED počinje ugašena i ostaje ugašena. |
| Zaklanjanje fotootpornika | Poslije prihvatanja stabilnog mraka LED se uključuje. |
| Nastavljeno zaklanjanje | LED ostaje uključena. |
| Ponovno osvjetljavanje | Poslije stabilnog svjetla LED se isključuje. |
| Reset dok je fotootpornik zaklonjen | LED počinje ugašena pa se uključuje poslije kvalifikacije prvog stanja. |
Prepiši tabelu u bilješke i dodaj stvarno opaženo ponašanje. Ovo su predviđanja programa, a ne već izmjereni rezultati tvoje opreme.
Stabilnost i ograničenja
Filter odbacuje novo stanje koje nije trajalo 50 ms bez prekida. Ako promjene oko praga traju duže, LED ipak može više puta promijeniti stanje. Ovo je vremenska provjera stabilnosti, a ne električna histereza niti dva odvojena praga osvjetljenja. Za stabilan ogled izaberi jasno svijetao i jasno taman uslov.
Najčešći problemi
| Simptom | Provjera i postupak |
|---|---|
| LED radi obrnuto | Provjeri sirovi nivo u mraku i uskladi DARK_LEVEL. |
| Sirovi nivo je stalno isti | Provjeri DO/AO, napajanje, GND i prag trimera. |
| LED treperi oko granice | Pomjeri LED od senzora; provjeri osvjetljenje, prag i kontakte. |
| Prihvaćeni mrak ne uključuje LED | Provjeri GPIO25, R1, polaritet D1 i zajedničku masu. |
| Nepovezan ulaz izgleda kao mrak | Pull-up može dati HIGH; provjeri fizičku vezu, ne tretiraj ga kao potvrdu senzora. |
Samostalni zadatak
Promijeni FILTER_MS sa 50 na 1000 ms. Zakloni fotootpornik približno pola sekunde, pa dvije sekunde. Predvidi da li će LED reagovati i kada. Ispitaj i otkrivanje senzora: provjera važi u oba smjera. Vrati interval na 50 ms nakon ogleda.
Pitanja i smjernice za rješenje
Zašto DO = HIGH samo po sebi ne znači univerzalno mrak? Zato što značenje zavisi od kola modula i podešenog praga; provjera uspostavlja vezu između nivoa i fizičkog uslova.
Sa intervalom 1000 ms, pola sekunde promijenjenog nivoa neće proći filter, dok dvije sekunde hoće nakon približno jedne sekunde stabilnosti. Isto važi za povratak na svjetlo. Promjena DARK_LEVEL obrće tumačenje signala, ali ne pomjera fizički prag trimera i ne stvara mjerenje u luksima.
