Automatsko svjetlo: fotoosjetljivi modul

Podesi prag fotoosjetljivog modula, provjeri digitalni nivo u mraku i uključi LED tek poslije 50 ms stabilnog očitavanja.

Senzori i prikaz mjerenjaPočetni nivo75 min

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

KomponentaKoličinaSpecifikacija i napomene
ESP32 razvojna ploča sa klasičnim ESP32-WROOM-32 modulom1GPIO nazivi moraju odgovarati referentnom profilu; fizički položaj izvoda provjeriti na ploči.
USB kabl za podatke i napajanje1Priključak prilagoditi ploči; komplet na slici navodi Micro-USB.
Eksperimentalna ploča1Komplet navodi 830 kontaktnih tačaka. Provjeriti eventualni prekid naponskih vodova.
Modul senzora svjetlosti sa digitalnim izlazom1Modul sa fotootpornikom i komparatorom, potvrđen za 3,3 V; VCC/GND/DO. AO se ne koristi. Polaritet DO provjeriti.
Crvena LED dioda1Anoda A i katoda K; provjeriti polaritet stvarne komponente.
Otpornik 220 Ω1Po jedan otpornik za svaku LED granu; 220 Ω iz kompleta.
Spojni kablovi6M-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.

Šema povezivanja — električne veze navedene u tabeli ispod
Šema povezivanjaUvećajSVGPNG
Veze · Šema povezivanja
OdDoOpis veze
ESP32.3V3U1.VCCNapajanje modula; provjeriti oznaku VCC.
ESP32.GNDU1.GNDZajednička masa ploče i senzora.
U1.DOESP32.GPIO27Digitalni signal nivoa 3,3 V prema GPIO27.
ESP32.GPIO25R1.1Digitalni izlaz za LED.
R1.2D1.ASerijski otpornik R1, 220 Ω, prema anodi LED.
D1.KESP32.GNDKatoda prema zajedničkoj masi.
  1. Odspoji USB. Na svojoj ploči pronađi oznake 3V3, GND, GPIO27 i GPIO25; ne broj fizičke položaje pinova.
  2. Spoji VCC modula na 3V3, a GND modula na GND ploče.
  3. Spoji digitalni izlaz DO na GPIO27. Provjeri da nisi izabrao AO.
  4. Spoji GPIO25 preko R1 od 220 Ω na anodu D1. Katodu spoji na zajednički GND.
  5. 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

light_switch.ino Arduino / C++
Preuzmi .ino

#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.

ProbaOčekivano ponašanje
Reset na osvijetljenom mjestuLED počinje ugašena i ostaje ugašena.
Zaklanjanje fotootpornikaPoslije prihvatanja stabilnog mraka LED se uključuje.
Nastavljeno zaklanjanjeLED ostaje uključena.
Ponovno osvjetljavanjePoslije stabilnog svjetla LED se isključuje.
Reset dok je fotootpornik zaklonjenLED 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

SimptomProvjera i postupak
LED radi obrnutoProvjeri sirovi nivo u mraku i uskladi DARK_LEVEL.
Sirovi nivo je stalno istiProvjeri DO/AO, napajanje, GND i prag trimera.
LED treperi oko granicePomjeri LED od senzora; provjeri osvjetljenje, prag i kontakte.
Prihvaćeni mrak ne uključuje LEDProvjeri GPIO25, R1, polaritet D1 i zajedničku masu.
Nepovezan ulaz izgleda kao mrakPull-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.

Preuzimanja

Primarni izvori