- Úvod do modulu digitálneho snímača svetla BH1750
- Arduino
- Programovanie Arduina na prepojenie svetelného senzora BH1750
Ak beriete telefón na slnečné svetlo alebo na silné svetlo, automaticky upraví jas podľa svetelných podmienok. Väčšina zobrazovacích zariadení, ktoré sú dnes k dispozícii, či už ide o televízor alebo mobilný telefón, má vo vnútri senzor okolitého svetla, ktorý automaticky upravuje jas. Dnes v tomto tutoriále použijeme jeden taký senzorový modul BH1750 Light Sensor Module a prepojíme ho s Arduinom a ukážeme hodnotu Lux na 16x2 LCD.
Úvod do modulu digitálneho snímača svetla BH1750
BH1750 je digitálny snímač okolitého svetla alebo snímač intenzity svetla, ktorý sa dá použiť na automatické nastavenie jasu displeja v mobiloch, LCD displejoch alebo na zapnutie / vypnutie svetlometov v automobiloch na základe vonkajších svetelných podmienok.
Snímač využíva sériový komunikačný protokol I 2 C, ktorý uľahčuje jeho použitie s mikrokontrolérmi. Pre komunikáciu I2C má piny SDI a SDA. Pinov z BH1750 Ambient Light Sensor je uvedený nižšie:
Výstup tohto snímača je v LUX (lx), takže nevyžaduje žiadne ďalšie výpočty. Lux je jednotka na meranie intenzity svetla. Meria intenzitu podľa množstva svetla dopadajúceho na konkrétnu oblasť. Jeden lux sa rovná jednému lúmenu na meter štvorcový.
Senzor pracuje na napätí od 2,4 V do 3,6 V (zvyčajne 3,0 V) a spotrebováva prúd 0,12 mA. Tento snímač má široký rozsah a vysoké rozlíšenie (1-65535lx) a navyše je aj malá odchýlka merania (asi +/- 20%). Môže tiež pracovať samostatne bez akýchkoľvek externých komponentov.
Senzor LDR sa dá použiť aj na ovládanie zariadení na základe svetelných podmienok, ale nie je to také presné. Použili sme snímač LDR na vytvorenie mnohých aplikácií riadených svetlom:
- Obvod svetelného senzora Arduino využívajúci LDR
- Detektor tmy využívajúci LDR a 555 Timer IC
- Jednoduchý obvod LDR na detekciu svetla
- Arduino mixážna lampa pomocou RGB LED a LDR
Arduino
Schéma zapojenia pre pripojenie svetelného senzora BH1750 k Arduinu je uvedená nižšie.
Komunikačné piny I2C SDA a SCL BH1750 sú pripojené k Arduino pinom A4 a A5 pre komunikáciu I 2 C. Ako vieme, prevádzkové napätie snímača je 3,3 V, takže VCC a GND BH1750 sú pripojené k 3,3 V a GND Arduina. Pre LCD sú dátové kolíky (D4-D7) pripojené k digitálnym kolíkom D2-D5 Arduina a piny RS a EN sú pripojené k D6 a D7 Arduina. V0 LCD je pripojený k hrncu a 10k hrniec sa používa na riadenie jasu LCD.
Programovanie Arduina na prepojenie svetelného senzora BH1750
Programovacia časť pre použitie tohto senzora LUX s Arduinom je veľmi jednoduchá. Pre tento senzor je síce k dispozícii knižnica, ale môžeme ju používať aj bez toho.
Najskôr sme zahrnuli hlavičkové súbory pre protokol LCD a I 2 C.
#include
Vo funkcii nastavenia sme inicializovali LCD aj snímač a vytlačili úvodnú správu na LCD.
void setup () { Wire.begin (); lcd.začiatok (16,2); lcd.print ("BH1750 Light"); lcd.setCursor (0,1); lcd.print ("snímač intenzity"); meškanie (2000); }
Tu sa na čítanie a zápis hodnôt Lux používajú funkcie BH1750_Read a BH1750_Init . Funkcia Wire.beginTransmission () sa používa na začatie prenosu a funkcia Wire.requestFrom (adresa, 2) sa používa na čítanie registrov, kde 2 označuje počet registrov.
Ďalej Wire.endTransmission () sa používa na ukončenie prenosu a funkcia Wire.write () sa používa na prechod do požadovaného registra zadaním adresy tohto registra.
int BH1750_Read (int adresa) { int i = 0; Wire.beginTransmission (adresa); Wire.requestFrom (adresa, 2); while (Wire.available ()) { buff = Wire.read (); i ++; } Wire.endTransmission (); návrat i; } void BH1750_Init (int adresa) { Wire.beginTransmission (adresa); Wire.write (0x10); Wire.endTransmission (); }
Vo slučke funkcie, sme tlač hodnôt v reálnom čase lux nad LCD. Najskôr porovnajte návratovú hodnotu z funkcie BH1750_Read s 2 a potom začnite tlačiť hodnoty Lux, ak je rovná 2. Tu sa hodnoty porovnávajú s 2, pretože funkcia BH1750_Read vráti hodnotu počtu registrov a čítame iba 2 registre. Takže keď dosiahne 2, program začne tlačiť hodnoty LUX intenzity svetla.
Potom sa použije vzorec na získanie hodnôt z oboch registrov a ich vydelenie číslom 1,2, čo je presnosť merania.
void loop () { int i; hodnota uint16_t = 0; BH1750_Init (BH1750address); oneskorenie (200); if (2 == BH1750_Read (BH1750address)) { hodnota = ((buff << 8) -buff) /1,2; lcd.clear (); lcd.print ("Intenzita v LUX"); lcd.setCursor (6,1); lcd.print (hodnota); } oneskorenie (150); }
Nakoniec zapnite Arduino a nahrajte program do Arduina. Ihneď po načítaní programu začne LCD ukazovať intenzitu svetla v jednotkách LUX. Hodnoty môžete meniť aj zmenou intenzity svetla okolo snímača, ako je to znázornené na videu nižšie.