- Uvod v digitalni modul senzorja svetlobe BH1750
- Arduino
- Programiranje Arduina za povezovanje senzorja svetlobe BH1750
Ko telefon vzamete na soncu ali pri močni osvetlitvi, samodejno prilagodi svetlost glede na svetlobne pogoje. V večini prikazovalnih naprav, ki so danes na voljo dnevi, ne glede na to, ali gre za televizor ali mobilni telefon, je vgrajen senzor zunanje svetlobe, ki samodejno prilagodi svetlost. Danes bomo v tej vadnici uporabili en tak senzorski modul BH1750 Light Sensor Module in ga povezali z Arduino ter prikazali vrednost Lux na 16x2 LCD.
Uvod v digitalni modul senzorja svetlobe BH1750
BH1750 je digitalni senzor za zunanjo svetlobo ali senzor za intenzivnost svetlobe, ki se lahko uporablja za samodejno prilagajanje svetlosti zaslona v mobilnih napravah, LCD-prikazovalnikih ali za vklop / izklop žarometov v avtomobilih glede na zunanjo osvetlitev.
Senzor uporablja serijski komunikacijski protokol I 2 C, kar olajša uporabo z mikrokrmilniki. Za komunikacijo I2C ima priključke SDI in SDA. Pinout od BH1750 ambientne svetlobe je prikazano spodaj:
Izhod tega senzorja je v LUX (lx), zato ne zahteva nadaljnjih izračunov. Lux je enota za merjenje jakosti svetlobe. Intenzivnost meri glede na količino svetlobe, ki zadene na določeno območje. En luks je enak enemu lumnu na kvadratni meter.
Senzor deluje na napetosti od 2,4 V do 3,6 V (običajno 3,0 V) in porabi tok 0,12 mA. Ta senzor ima širok razpon in visoko ločljivost (1-65535lx), poleg tega pa so tudi razlike v meritvah majhne (približno +/- 20%). Deluje lahko tudi samostojno brez kakršne koli zunanje komponente.
Čeprav se lahko senzor LDR uporablja tudi za nadzor naprav glede na svetlobne pogoje, vendar ni tako natančen. Senzor LDR smo uporabili za izdelavo številnih aplikacij z nadzorom svetlobe:
- Vezje senzorja svetlobe Arduino z uporabo LDR
- Temni detektor z uporabo LDR in 555 Timer IC
- Enostavno LDR vezje za zaznavanje svetlobe
- Mešalna svetilka Arduino Color z uporabo RGB LED in LDR
Arduino
Shema vezja za povezavo svetlobnega senzorja BH1750 z Arduinom je prikazana spodaj.
Komunikacijski zatiči I2C SDA in SCL BH1750 sta priključeni na Arduino pin A4 oziroma A5 za komunikacijo I 2 C. Kot vemo, je delovna napetost senzorja 3,3 v, zato sta VCC in GND BH1750 priključena na 3,3 V in GND Arduina. Za LCD so podatkovni zatiči (D4-D7) povezani z digitalnimi zatiči D2-D5 Arduina, RS in EN zatiči pa D6 in D7 Arduina. V0 LCD je povezan z loncem, 10k lonec pa se uporablja za nadzor svetlosti LCD.
Programiranje Arduina za povezovanje senzorja svetlobe BH1750
Programski del za uporabo tega senzorja LUX z Arduinom je zelo enostaven. Čeprav je za ta senzor na voljo knjižnica, lahko pa ga uporabljamo tudi brez tega.
Najprej smo vključili datoteke z glavo za LCD in protokol I 2 C.
#include
V nastavitveni funkciji smo inicializirali LCD in senzor ter na LCD natisnili uvodno sporočilo.
void setup () { Wire.begin (); lcd.begin (16,2); lcd.print ("BH1750 Light"); lcd.setCursor (0,1); lcd.print ("senzor intenzitete"); zamuda (2000); }
Tu se za branje in zapisovanje vrednosti Lux uporabljata funkciji BH1750_Read in BH1750_Init . Funkcija Wire.beginTransmission () se uporablja za začetek prenosa, funkcija Wire.requestFrom (naslov, 2) pa za branje registrov, kjer 2 označuje število registrov.
Nadalje Wire.endTransmission () se uporablja za konec prenosa, funkcija Wire.write () pa za prehod na želeni register, tako da vanj vnesete naslov tega registra.
int BH1750_Read (int naslov) { int i = 0; Wire.beginTransmission (naslov); Wire.requestFrom (naslov, 2); while (Wire.available ()) { buff = Wire.read (); i ++; } Wire.endTransmission (); vrnitev i; } void BH1750_Init (int naslov) { Wire.beginTransmission (naslov); Wire.write (0x10); Wire.endTransmission (); }
V zanke funkcijo, smo tiskanje vrednosti Lux v realnem času preko LCD. Najprej primerjajte vrnjeno vrednost iz funkcije BH1750_Read z 2, nato pa začnite tiskati vrednosti Lux, če je enaka 2. Tu se vrednosti primerjajo z 2, ker funkcija BH1750_Read vrne vrednost števila registrov in beremo samo 2 registra. Ko torej doseže 2, program začne tiskati vrednosti LUX intenzivnosti svetlobe.
Nato s formulo dobimo vrednosti iz obeh registrov in jih delimo z 1,2, kar je natančnost merjenja.
void loop () { int i; vrednost uint16_t = 0; BH1750_Init (BH1750adress); zamuda (200); če (2 == BH1750_Read (BH1750address)) { value = ((buff << 8) -buff) /1.2; lcd.clear (); lcd.print ("Intenzivnost v LUX"); lcd.setCursor (6,1); lcd.print (vrednost); } zamuda (150); }
Končno vklopite Arduino in naložite program v Arduino. Takoj ko je program naložen, LCD začne prikazovati jakost svetlobe v enotah LUX. Vrednosti lahko spreminjate tudi s spreminjanjem jakosti svetlobe okoli senzorja, kot je prikazano v spodnjem videu.