Prikaz nivoa osvetljenja (LDR senzor)
Prikaz nivoa osvetljenja pomoću LDR senzora (Light Dependent Resistor) predstavlja jednostavan elektronski sistem koji meri intenzitet ambijentalnog svetla i daje njegovu vizuelnu reprezentaciju. LDR senzor menja svoju otpornost u zavisnosti od količine svetlosti koju prima:
- Pri jakom osvetljenju otpornost se smanjuje.
- U mraku otpornost se povećava.
Ova promena otpornosti pretvara se u napon koji se očitava preko analognog pina na Arduino ploči. Izmerena vrednost se zatim koristi za upravljanje prikazom, na primer grafičkim elementom na ekranu (putem Processing okruženja) ili jačinom svetlosti LED diode (korišćenjem PWM signala). Ovakav sistem se često primenjuje u automatskom osvetljenju, senzorima ambijentalnog svetla i edukativnim projektima.
Vežba 2: Korišćenje svetlosnog senzora – Osnovni nivo
Uradimo jednu vežbu sa RGB LED diodom.
Od opreme nam je potrebno sledeće (videti Sliku 1):
- Arduino Uno ploča (1)
- Probna ploča – breadboard (2)
- Svetlosni senzor (3)
- Jedan otpornik od 10 kΩ (5)
- Povezne žice (4, 6, 7, 8, 9)
U ovoj vežbi meriće se nivo osvetljenja u okruženju.
Potrebno je da koristimo svetlosni senzor, poznatiji kao LDR senzor. To je fotootpornik, što znači da menja svoju otpornost u zavisnosti od nivoa svetlosti u okruženju.
Šema povezivanja svih potrebnih komponenti prikazana je na Slici 1.
Veoma je važno imati u vidu da ne treba povezivati Arduino ploču sa računarom dok sve komponente nisu pravilno povezane.
Obavezno je postaviti otpornik između 5V pina i fotootpornika, jer LDR podnosi struju od približno 1–5 mA. Ukoliko se ova granica prekorači, može doći do oštećenja senzora.
Šta se dešava ako se prekorači dozvoljena struja:
- LDR se zagreva, što može dovesti do:
- Trajne promene njegove otpornosti (što uzrokuje netačna očitavanja pri budućim merenjima).
- Topljenja ili sagorevanja materijala unutar senzora.
- Smanjenja radnog veka ili potpunog prestanka rada.
Radi zaštite fotootpornika koristićemo stalni (fiksni) otpornik koji je sa njim povezan redno (u seriji).
Šema povezivanja
Šema povezivanja
Uzmite crvenu žicu (5) i povežite jedan kraj na 5V (VCC) pin na Arduino ploči. Drugi kraj ubacite u jedan red na probnoj ploči (2).
Postavite jednu nožicu LDR fotootpornika (3) u isti red (isti napon) gde se nalazi crvena žica. Zatim drugu nožicu LDR-a ubacite u novi red.
Uzmite otpornik od 10 kΩ (5) i povežite jednu njegovu nožicu u isti red gde se nalazi druga nožica LDR-a. Drugu nožicu otpornika ubacite u sledeći, novi red.
Sada uzmite crnu žicu (8) i povežite jedan kraj sa tim poslednjim redom (gde je povezan otpornik), a drugi kraj povežite na GND pin na Arduino ploči.
Da biste očitali napon na spoju između LDR-a i otpornika, ubacite žicu iz tog srednjeg reda (gde su LDR i otpornik međusobno povezani) u A0 analogni ulaz na Arduino ploči.
Proverite da li su sve veze stabilne i pravilno postavljene. Kada je sve ispravno povezano, možete priključiti Arduino na računar pomoću USB kabla.
Primer koda: Čitanje vrednosti LDR senzora
// Definisanje pinova
const int ldrPin = A0; // Analogni ulaz povezan na razdelnik napona između LDR-a i otpornika
const int ledPin = 9; // PWM izlaz povezan na LED (nije korišćeno u ovom kodu, ali deklarisano)
// Funkcija setup – pokreće se jednom pri uključivanju ili resetovanju Arduino ploče
void setup() {
Serial.begin(115200); // Inicijalizacija serijske komunikacije na 115200 baud
pinMode(ldrPin, INPUT); // Podesiti LDR pin kao ulaz (opciono, analogRead to automatski radi)
}
// Funkcija loop – izvršava se stalno u petlji
void loop() {
// Čitanje analogne vrednosti sa LDR senzora (opseg: 0 do 1023)
int ldrValue = analogRead(ldrPin);
// Mapiranje vrednosti LDR-a na osvetljenost od 255 (tama) do 0 (svetlo)
int brightness = map(ldrValue, 0, 1023, 255, 0);
// Štampanje izračunate vrednosti osvetljenosti na serijski monitor sa oznakom "L:"
Serial.print("L:");
Serial.println(brightness);
delay(100); // Pauza od 100 milisekundi pre sledećeg očitavanja
}
Objašnjenje Arduino koda – Čitanje nivoa osvetljenja pomoću LDR senzora
Ovaj Arduino program je napravljen da očitava nivo osvetljenja sa LDR senzora (Light Dependent Resistor) i šalje podatke računaru putem Serijskog monitora. Pomaže u vizualizaciji promena intenziteta svetla tokom vremena, što se kasnije može koristiti u različitim projektima, poput upravljanja jačinom LED svetla ili pokretanja akcija u zavisnosti od svetlosnih uslova.
Kako kola funkcionišu
- LDR i fiksni otpornik (npr. 10 kΩ) formiraju razdelnik napona.
- Jedan kraj je povezan na 5V, drugi na GND, a srednja tačka je povezana na A0 analogni pin na Arduino ploči.
- Kako svetlost raste, otpornost LDR-a se smanjuje, menjajući napon na A0.
Šta radi kod
const int ldrPin = A0; // Pin LDR signala (povezan na razdelnik napona)
const int ledPin = 9; // Pin za LED (deklarisan, ali se ne koristi u ovom primeru)
ldrPin je dodeljen analognom pinu A0 kako bi se očitavao napon u zavisnosti od svetlosti.
ledPin je deklarisan za buduću upotrebu, ali se u ovom kodu ne koristi.
void setup() {
Serial.begin(115200); // Pokretanje serijske komunikacije sa računarom
pinMode(ldrPin, INPUT); // Postavljanje LDR pina kao ulaznog (nije strogo neophodno)
}
Funkcija setup() se izvršava jednom i inicijalizuje serijsku komunikaciju sa računarom velikom brzinom (115200 baud).
Takođe postavlja pin povezan sa LDR-om kao ulazni.
void loop() {
int ldrValue = analogRead(ldrPin); // Čitanje analogne vrednosti (0–1023)
int brightness = map(ldrValue, 0, 1023, 255, 0); // Pretvaranje u osvetljenost (invertovano)
Serial.print("L:");
Serial.println(brightness); // Slanje rezultata na Serijski monitor
delay(100); // Kratka pauza pre ponovnog očitavanja
}
Funkcija loop() se izvršava kontinuirano:
– Očitava nivo svetlosti sa LDR senzora.
– Mapira vrednost tako da tamnije = veća vrednost brightness (255 znači tamno, 0 znači svetlo).
– Šalje rezultat u formatu L:123 na Serijski monitor.
– Kratka pauza pomaže da očitavanja budu stabilnija i lakša za posmatranje.
Šta možete raditi sa ovim
- Pratiti promene ambijentalnog svetla u realnom vremenu.
- Upravljati LED diodom, motorom ili displejom u zavisnosti od jačine svetla (npr. automatsko paljenje svetla noću).
- Slati vrednosti u Processing ili neki grafički alat za vizualizaciju u realnom vremenu.
Kako funkcioniše analogni ulaz A0 – Razumevanje ADC-a
Kada koristimo analogRead(A0), Arduino ne meri direktno otpornost.
On meri napon na analognom pinu A0.
Unutar Arduino Uno ploče (ATmega328P mikrokontrolera) nalazi se komponenta koja se zove analogno-digitalni konverter (ADC).
Šta radi ADC?
- Pretvara analogni napon (0–5V) u digitalni broj.
- Arduino Uno koristi 10-bitni ADC.
- To znači da može prikazati vrednosti od 0 do 1023.
Šta znače te vrednosti?
ADC deli opseg napona (0–5V) na 1024 koraka.
- 0 → 0V
- 512 → približno 2.5V
- 1023 → 5V
Svaki korak predstavlja približno:
5V / 1024 ≈ 0.0049V (4.9 mV po koraku)
Kako je to povezano sa LDR senzorom?
LDR i fiksni otpornik zajedno formiraju naponski delitelj. Kada se promeni intenzitet svetlosti, menja se otpornost LDR-a. To uzrokuje promenu napona na srednjoj tački kola (koja je povezana na A0).
- Više svetlosti → manja otpornost LDR-a → promena napona → drugačija ADC vrednost
- Manje svetlosti → veća otpornost LDR-a → promena napona → drugačija ADC vrednost
Kada u Serial Monitor-u vidite broj, na primer 750,
to zapravo predstavlja određeni napon između 0V i 5V.
Kako izračunati stvarni napon?
Ako želite da pretvorite očitanu vrednost u stvarni napon, koristite sledeću formulu:
float voltage = ldrValue * (5.0 / 1023.0);
Na primer:
- Ako je očitana vrednost 512 → napon je približno 2.5V
- Ako je očitana vrednost 1023 → napon je približno 5V
Zašto je ovo važno?
Razumevanje ADC-a omogućava vam da:
- Pravilno kalibrišete senzore
- Pretvorite očitavanja u realne fizičke vrednosti
- Razumete zašto opseg ide od 0 do 1023
- Napravite preciznije i profesionalnije projekte
Ovo je ključni princip koji omogućava Arduinu da meri temperaturu, svetlost, zvuk, udaljenost i mnoge druge fizičke veličine.
Kod u processing-u
Koristimo Processing za vizualizaciju podataka dobijenih sa serijskog porta o nivou osvetljenja u vašem okruženju. Više o tome kako crtati osnovne oblike u Processing-u možete pročitati na sledećoj stranici: processing_hub.html .
Ova aplikacija crta krug i menja njegov prečnik i boju ispune u skladu sa primljenim podacima.
Processing kod za vizualizaciju svetlosnog nivoa
// Uvoz biblioteke za serijsku komunikaciju sa Arduino pločom
import processing.serial.*;
Serial myPort; // Deklaracija serijskog objekta
int lightValue = 0; // Promenljiva za čuvanje vrednosti sa LDR senzora
void setup() {
size(400, 400); // Postavljanje veličine prozora
try {
if (Serial.list().length > 0) {
printArray(Serial.list()); // Prikaz liste dostupnih serijskih portova
myPort = new Serial(this, Serial.list()[0], 115200); // Otvaranje prvog dostupnog porta
myPort.bufferUntil('\n'); // Čitanje serijskih podataka do karaktera novog reda
} else {
println("Nema dostupnih serijskih portova.");
}
} catch (Exception e) {
println("Greška pri otvaranju serijskog porta: " + e.getMessage());
}
}
void draw() {
background(0); // Postavljanje pozadine na crnu boju
// Mapiranje vrednosti svetlosti na veličinu kruga
float diameter = map(lightValue, 0, 1023, 300, 50);
// Mapiranje vrednosti svetlosti na osvetljenost boje
int brightness = int(map(lightValue, 0, 1023, 255, 50));
fill(brightness, brightness, 255); // Bojenje kruga RGB bojom
ellipse(width/2, height/2, diameter, diameter); // Crtanje kruga
}
void serialEvent(Serial p) {
String data = p.readStringUntil('\n'); // Čitanje linije sa serijskog porta
if (data != null) {
data = trim(data); // Uklanjanje belina
if (data.startsWith("L:")) {
lightValue = int(data.substring(2)); // Pretvaranje stringa nakon "L:" u integer
println("lightValue=" + lightValue);
}
}
}
Prikaz nivoa osvetljenja (LDR senzor) sa LED diodom
Kada je okruženje svetlije, otpornost LDR senzora se smanjuje. To uzrokuje da se preko fiksnog otpornika u razdelniku napona pojavi veći napon, što rezultira višim analogno očitanom signalom na Arduino ploči.
Ovo očitavanje možete koristiti da programski pošaljete proporcionalno manji signal na PWM pin (Pulse Width Modulation), na primer pin 9. Ovaj pin će služiti kao izvor napona za LED diodu.
Kao rezultat, LED će primati niži prosečan napon i svetleti smanjenom jačinom. Ovo stvara vizuelni efekat gde LED postaje slabije osvetljena kako ambijentalno svetlo raste — oponašajući rad automatske noćne svetiljke.
Da biste to postigli, možete dodati sledeće komponente osnovnoj vežbi:
- LED dioda (13 na Slici 4)
- Otpornik (11) – 220 Ω
- Povezne žice (10, 12, 14)
Pogledajmo Sliku 3, koja prikazuje kako dodati LED diodu i otpornik na probnu ploču.
Da biste proširili projekat sa LED diodom koja odražava nivo svetla, potrebno je povezati LED na jedan od PWM pinova na Arduino ploči (npr. pin 9).
Povežite anodu (duža nogica) LED diode (13) na pin 9 preko otpornika od 220 Ω (11). Katodu (kraća nogica) LED diode povežite na GND.
Zašto je potreban otpornik od 220 Ω?
- LED diode su osetljive i mogu biti oštećene ako kroz njih prolazi previše struje.
- Otpornik ograničava struju na bezbedan nivo (obično oko 10–20 mA) i sprečava pregorevanje LED diode.
- Bez otpornika, LED bi mogla povući previše struje sa Arduino pina, što bi moglo oštetiti i LED i mikrokontroler.
Ovim povezivanjem Arduino može kontrolisati jačinu svetla LED diode koristeći analogWrite() na pin 9, pri čemu veći nivo svetla u okruženju dovodi do manje jačine svetla LED diode i obrnuto.
Hajde da izmenimo prethodni Arduino kod kako bismo dodali novu funkcionalnost. Kod koji je dodat prikazan je označen crvenom bojom:
Izmenjeni Arduino kod – Dodavanje LED kontrole
// Definisanje pinova
const int ldrPin = A0; // Analogni ulaz povezan na razdelnik napona (LDR + otpornik)
const int ledPin = 9; // PWM izlaz povezan na LED diodu
void setup() {
// Ovaj kod se izvršava jednom pri uključivanju ili resetovanju Arduino ploče
Serial.begin(9600); // Pokretanje serijske komunikacije na 9600 baud
pinMode(ledPin, OUTPUT); // Postavljanje LED pina kao izlaznog
pinMode(ldrPin, INPUT); // Podesiti LDR pin kao ulaz (opciono, analogRead to automatski radi)
}
void loop() {
// Ovaj kod se izvršava u petlji
int ldrValue = analogRead(ldrPin); // Čitanje analogne vrednosti sa LDR senzora (0 = tamno, 1023 = svetlo)
// Mapiranje očitane vrednosti LDR-a na nivo osvetljenosti LED (invertovano: tamna prostorija = jača LED)
int brightness = map(ldrValue, 0, 1023, 255, 0);
// Upis izračunate jačine svetla na LED koristeći PWM
analogWrite(ledPin, brightness);
// Slanje vrednosti osvetljenosti na Serijski monitor radi praćenja
Serial.print("L:");
Serial.println(brightness);
delay(100); // Pauza od 100 ms pre sledećeg očitavanja
}
U proširenoj verziji koda dodata je LED dioda koja se kontroliše pomoću PWM (Pulse Width Modulation) signala sa pina 9 na Arduino ploči.
LED je fizički povezana u seriji sa otpornikom od 220Ω kako bi se ograničila struja koja kroz nju prolazi.
Zašto je otpornik neophodan?
Bez otpornika, LED bi mogla da primi previše struje direktno sa 5V izvora, što može dovesti do:
- Zagrevanja LED diode.
- Trajnog oštećenja LED diode ili čak Arduino pina.
- Smanjenog veka trajanja ili potpunog kvara LED diode.
Otpornik obezbeđuje da struja ostane u bezbednom opsegu za LED, obično oko 15–20 mA. Vrednost od 220Ω se često koristi za standardne crvene, zelene ili plave LED diode.
U programu se izračunava nivo osvetljenosti pomoću svetlosnog senzora (LDR) i ta vrednost se šalje LED diodi pomoću funkcije analogWrite() na pin ledPin. Kao rezultat:
- U svetlim okruženjima (niska otpornost LDR-a), LED svetli slabije.
- U tamnijim okruženjima (visoka otpornost LDR-a), LED svetli jače.
|
Prethodno
|< Arduino Uno – Uvod |
Sledeće
Arduino - Senzor temperature >| |