Merenje osvetljenja pomoću LDR senzora (ESP32)
LDR senzor (Light Dependent Resistor) je otpornik čija se otpornost menja u zavisnosti od količine svetlosti. Kada je osvetljenje jače, otpornost LDR-a opada, a kada je svetlost slabija otpornost raste. Na osnovu te promene moguće je meriti intenzitet osvetljenja u prostoru.
Ovakvi senzori se koriste u automatskom uključivanju rasvete, praćenju dnevnog svetla, sistemima za uštedu energije, pametnoj kućnoj automatizaciji i mnogim IoT projektima. U ovoj vežbi koristićemo ESP32 razvojnu ploču i LDR senzor za očitavanje nivoa osvetljenja.
Praktična realizacija
ESP32 povezan sa LDR senzorom tokom merenja osvetljenja.
Šema povezivanja
Pregled svih veza između ESP32 ploče i LDR senzora.
Elementi kola
Prikaz LDR senzora, otpornika i tačke sa koje se očitava analogni signal.
Na pojedinim ESP32 pločama (npr. ESP32-S3) raspored GPIO pinova je drugačiji. U toj situaciji analogni ulaz GPIO34 može se zameniti odgovarajućim ADC pinom (npr. GPIO4), uz odgovarajuću izmenu u programu.
Kako radi LDR senzor?
LDR senzor menja otpornost u zavisnosti od količine svetlosti. U mraku njegova otpornost postaje veća, dok se pri jačem osvetljenju smanjuje. Zbog toga se LDR najčešće povezuje sa običnim otpornikom i tako se formira naponski delitelj.
LDR i otpornik zajedno formiraju naponski delitelj. ESP32 na analognoj ulaznoj nozi meri napon na srednjoj tački delitelja, a na osnovu te vrednosti zaključujemo koliko ima svetlosti.
Zašto koristiti naponski delitelj?
ESP32 ne meri otpornost direktno, već napon. Zato se LDR povezuje sa otpornikom od 10 kΩ kako bi se promena otpornosti pretvorila u promenljiv napon koji mikrokontroler može da očita na analognoj ulaznoj nozi.
Kada je svetlosti više, otpornost LDR-a opada i napon na ulazu se menja. Kada je svetlosti manje, otpornost raste i očitana vrednost takođe se menja. Na ovaj način ESP32 dobija informaciju o jačini osvetljenja.
Pinovi koji se koriste
U ovoj vežbi koristićemo sledeće priključke:
- 3V3 – napajanje kola
- GND – zajednička masa
- GPIO34 – analogni ulaz za očitavanje napona sa delitelja
- LDR – senzor koji menja otpornost u zavisnosti od svetlosti
- Otpornik 10 kΩ – drugi deo naponskog delitelja
ESP32 radi sa logikom od 3.3 V, pa se analogno kolo mora napajati sa 3V3, a ne sa 5 V. Takođe, za analogno očitavanje je najbolje koristiti ADC1 pinove, kao što je GPIO34, jer su oni pogodniji za rad sa Wi-Fi funkcijama.
Analogno očitavanje na ESP32
Za razliku od Arduino UNO ploče, ESP32 koristi 12-bitni ADC, pa analogRead() obično vraća vrednosti od 0 do 4095. To znači da ESP32 može da registruje finije promene napona.
U praksi to omogućava preciznije praćenje promene osvetljenja. Ipak, zbog karakteristika ESP32 ADC-a, vrednosti mogu biti neznatno nelinijske, pa je za ozbiljnije projekte korisno uraditi kalibraciju.
Na ESP32 ne koristimo analogWrite() kao na Arduino UNO ploči. Ako želimo da upravljamo LED diodom ili nekim drugim izlazom, koristimo PWM kanal preko funkcija ledcSetup(), ledcAttachPin() i ledcWrite().
Formula za očitavanje napona
Ako želimo da izračunamo napon na analognom ulazu, možemo koristiti formulu:
Voltage = (ADC Value / 4095) × 3.3
Gde je:
- ADC Value – vrednost koju vraća analogRead()
- 4095 – maksimalna vrednost 12-bitnog ADC-a na ESP32
- 3.3 – referentni napon ESP32 ploče
Zašto koristiti ESP32?
ESP32 poseduje veliki broj mogućnosti i odličan je izbor za projekte sa senzorima i Internetom stvari.
- ✅ Ugrađen Wi-Fi modul
- ✅ Ugrađen Bluetooth
- ✅ Veći broj GPIO pinova
- ✅ 12-bitni ADC za detaljnije merenje
- ✅ Pogodan za IoT i automatizaciju
Potreban materijal
- ESP32 razvojna ploča
- LDR senzor
- Otpornik od 10 kΩ
- Breadboard
- Jumper provodnici
- USB kabl za povezivanje sa računarom
- Arduino IDE sa instaliranom podrškom za ESP32
Bezbednosne preporuke
- Uvek koristiti 3.3 V napajanje za analogni deo kola.
- Proveriti da li je analogni ulaz pravilno povezan sa srednjom tačkom naponskog delitelja.
- Ne dovoditi napon veći od 3.3 V na ESP32 analogne ulaze.
- Za stabilnije vrednosti po potrebi koristiti više uzastopnih očitavanja i izračunati prosečnu vrednost.
Primer programa za ESP32
Sledeći program očitava vrednost sa LDR senzora i prikazuje je u Serial Monitor-u. Po želji, na osnovu očitane vrednosti može se upravljati i LED diodom preko PWM-a.
// Pin na koji je povezana srednja tačka naponskog delitelja
// (spoj između LDR senzora i otpornika od 10 kΩ)
#define LDR_PIN 34
void setup() {
// Pokretanje serijske komunikacije brzinom od 115200 bps
// kako bismo mogli da pratimo očitane vrednosti u Serial Monitor-u
Serial.begin(115200);
// ESP32 koristi 12-bitni ADC,
// pa analogRead() vraća vrednosti od 0 do 4095
analogReadResolution(12);
}
void loop() {
// Očitavanje analognog napona sa GPIO34 pina
// Dobijena vrednost predstavlja nivo osvetljenja
int ldrValue = analogRead(LDR_PIN);
// Pretvaranje ADC vrednosti (0–4095)
// u opseg PWM vrednosti (255–0)
// Obrnut opseg omogućava da veća vrednost
// predstavlja slabije osvetljenje (mrak)
int brightness = map(ldrValue, 0, 4095, 255, 0);
// Prikaz originalne ADC vrednosti
Serial.print("LDR: ");
Serial.print(ldrValue);
// Prikaz mapirane vrednosti
Serial.print(" PWM: ");
Serial.println(brightness);
// Pauza od pola sekunde između dva merenja
delay(500);
}
Funkcija map() pretvara jednu numeričku vrednost iz jednog opsega u drugi. U ovom primeru vrednosti koje vraća ADC (0–4095) pretvaraju se u opseg 255–0. Takve vrednosti se često koriste za PWM upravljanje LED diodama, gde veća PWM vrednost znači jače svetljenje LED diode.
Prikaz nivoa osvetljenja na serijskom monitoru
Vežba sa LDR senzorom merenje osvetljenja i prikaz podataka.
Primer upravljanja LED diodom pomoću PWM-a
Ako želimo da LED svetli jače kada je mrak, a slabije kada je svetlo, možemo koristiti PWM (Pulse Width Modulation) signal. PWM omogućava promenu prosečne snage koja se dovodi LED diodi, čime se kontroliše njen intenzitet svetljenja.
Praktična realizacija
ESP32 povezan sa LDR senzorom tokom merenja osvetljenja.
Arduino stil (analogWrite)
Korisnici koji su ranije radili sa Arduino UNO pločom verovatno su koristili funkciju analogWrite() za generisanje PWM signala.
// Analogni ulaz na koji je povezan LDR senzor
#define LDR_PIN 34
// LED dioda povezana na GPIO2
#define LED_PIN 2
void setup() {
Serial.begin(115200);
// Postavljanje LED pina kao izlaza
pinMode(LED_PIN, OUTPUT);
// ESP32 koristi 12-bitni ADC
analogReadResolution(12);
}
void loop() {
// Očitavanje vrednosti sa LDR senzora
int ldrValue = analogRead(LDR_PIN);
// Pretvaranje vrednosti u opseg 255–0
int brightness = map(ldrValue, 0, 4095, 255, 0);
// Slanje PWM vrednosti LED diodi
analogWrite(LED_PIN, brightness);
delay(100);
}
Na Arduino UNO ploči funkcija analogWrite() automatski generiše PWM signal na određenim pinovima. ESP32 poseduje mnogo napredniji PWM hardver sa više nezavisnih kanala, frekvencija i rezolucija. Iako novije verzije ESP32 biblioteka podržavaju funkciju analogWrite(), ona u pozadini koristi LEDC (LED Control) modul. Zbog razlika između verzija biblioteka i veće fleksibilnosti koju ESP32 pruža, u većini profesionalnih i edukativnih projekata preporučuje se direktna upotreba LEDC funkcija. Zbog toga ćete u većini ESP32 primera pronaći funkcije ledcSetup(), ledcAttachPin() i ledcWrite().
Prikaz nivoa osvetljenja na serijskom monitoru
Vežba sa LDR senzorom merenje osvetljenja i prikaz podataka.
Preporučeni ESP32 način (LEDC PWM)
// Analogni ulaz na koji je povezan LDR senzor
#define LDR_PIN 34
// Pin na koji je povezana LED dioda
#define LED_PIN 2
// Broj PWM kanala koji koristimo
#define PWM_CHANNEL 0
// Frekvencija PWM signala (5000 Hz)
#define PWM_FREQ 5000
// Rezolucija PWM-a (8 bita = opseg 0–255)
#define PWM_RES 8
void setup() {
// Pokretanje serijske komunikacije
Serial.begin(115200);
// ESP32 koristi 12-bitni ADC
analogReadResolution(12);
// Kreiranje PWM kanala
ledcSetup(PWM_CHANNEL, PWM_FREQ, PWM_RES);
// Povezivanje PWM kanala sa GPIO2 pinom
ledcAttachPin(LED_PIN, PWM_CHANNEL);
}
void loop() {
// Očitavanje trenutne vrednosti sa LDR senzora
int ldrValue = analogRead(LDR_PIN);
// Pretvaranje ADC vrednosti u opseg 255–0
int brightness = map(ldrValue, 0, 4095, 255, 0);
// Slanje PWM vrednosti LED diodi
ledcWrite(PWM_CHANNEL, brightness);
// Prikaz podataka u Serial Monitor-u
Serial.print("LDR: ");
Serial.print(ldrValue);
Serial.print(" Brightness: ");
Serial.println(brightness);
delay(100);
}
Funkcija map() pretvara vrednosti koje vraća ADC (0–4095) u PWM opseg (255–0). Pošto želimo da LED svetli jače kada je mrak, opseg je obrnut. Manje svetlosti daje veću PWM vrednost, pa LED emituje jače svetlo.
Zaključak
Pomoću LDR senzora i ESP32 ploče možemo jednostavno meriti nivo osvetljenja u prostoru. Ova vežba je odličan uvod u rad sa analognim senzorima, naponskim deliteljima i PWM upravljanjem izlazima na ESP32 platformi.
Povezivanje LDR senzora sa ESP32 pločom
LDR senzor se povezuje sa ESP32 pločom pomoću naponskog delitelja koji čine LDR i otpornik od 10 kΩ. Na taj način promena otpornosti senzora pretvara se u promenu napona koju ESP32 može da očita preko analognog ulaza.
Za realizaciju ove vežbe koristićemo GPIO34 kao analogni ulaz. Ovaj pin pripada ADC1 grupi i veoma je pogodan za analogna merenja.
Povezivanje po pinovima
| ESP32 pin | Komponenta | Opis veze |
|---|---|---|
| 3V3 | LDR | Jedan kraj LDR senzora povezuje se na 3.3 V napajanje. |
| GPIO34 | Srednja tačka delitelja | Povezuje se između LDR senzora i otpornika od 10 kΩ. |
| GND | Otpornik 10 kΩ | Drugi kraj otpornika povezuje se na masu. |
Prilikom povezivanja važno je da analogni ulaz GPIO34 bude povezan upravo na spojnu tačku između LDR senzora i otpornika. Na toj tački nastaje promenljiv napon koji ESP32 meri funkcijom analogRead().
3V3 → LDR → GPIO34 → Otpornik 10 kΩ → GND
Kada je osvetljenje jako, otpornost LDR senzora opada i menja se napon na GPIO34 ulazu. Kada je osvetljenje slabo, otpornost raste i dolazi do drugačijeg očitavanja. Na osnovu tih promena ESP32 određuje nivo osvetljenja u okruženju.