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.

ESP32 i LDR senzor

Praktična realizacija

ESP32 povezan sa LDR senzorom tokom merenja osvetljenja.

Šema povezivanja ESP32 i LDR senzora

Šema povezivanja

Pregled svih veza između ESP32 ploče i LDR senzora.

LDR senzor i otpornik

Elementi kola

Prikaz LDR senzora, otpornika i tačke sa koje se očitava analogni signal.

Napomena:

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.

Princip rada:

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

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.

Važno:

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);
}
Kako radi funkcija map()?

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.
ESP32 i LDR senzor

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.

ESP32 i LDR senzor

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);
}
Zašto se na ESP32 obično ne koristi analogWrite()?

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().

ESP32 i LDR senzor

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);
}
Kako funkcioniše mapiranje?

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().

Redosled povezivanja:

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.