- Inleiding tot de BH1750 digitale lichtsensormodule
- Arduino
- Arduino programmeren voor het koppelen van BH1750-lichtsensor
Wanneer u uw telefoon meeneemt in de zon of bij veel licht, wordt de helderheid automatisch aangepast aan de lichtomstandigheden. De meeste weergaveapparaten hebben tegenwoordig, of het nu een tv of een mobiele telefoon is, de omgevingslichtsensor om de helderheid automatisch aan te passen. Vandaag zullen we in deze tutorial een dergelijke sensor BH1750 Light Sensor Module gebruiken en deze koppelen aan Arduino en de Lux-waarde weergeven op een 16x2 LCD.
Inleiding tot de BH1750 digitale lichtsensormodule
BH1750 is een digitale sensor voor omgevingslicht of een lichtintensiteit sensor, die kan worden gebruikt voor het automatisch aanpassen van de helderheid van het display in de mobiele telefonie, LCD-schermen, of voor het in- / uitschakelen van de koplampen van auto's op basis van de outdoor lichtomstandigheden.
De sensor maakt gebruik van het I 2 C seriële communicatieprotocol, waardoor het gemakkelijker te gebruiken is met microcontrollers. Voor I2C-communicatie heeft het SDI- en SDA-pinnen. De pinout van BH1750 omgevingslichtsensor wordt hieronder weergegeven:
De output van deze sensor is in LUX (lx), dus er zijn geen verdere berekeningen nodig. Lux is de eenheid om de lichtintensiteit te meten. Het meet de intensiteit op basis van de hoeveelheid licht die op een bepaald gebied valt. Eén lux staat gelijk aan één lumen per vierkante meter.
De sensor werkt op spanningen van 2,4 V tot 3,6 V (typisch 3,0 V) en verbruikt een stroom van 0,12 mA. Deze sensor heeft een groot bereik en hoge resolutie (1-65535lx) en daarnaast is de meetvariatie ook klein (ongeveer +/- 20%). Het kan ook onafhankelijk werken zonder externe componenten.
Hoewel een LDR-sensor ook kan worden gebruikt om de apparaten te bedienen op basis van lichtomstandigheden, is deze niet zo nauwkeurig. We hebben de LDR-sensor gebruikt om veel lichtgestuurde toepassingen te bouwen:
- Arduino Light Sensor Circuit met LDR
- Dark Detector met LDR en 555 Timer IC
- Eenvoudig LDR-circuit om licht te detecteren
- Arduino Color Mixing Lamp met RGB LED en LDR
Arduino
Het schakelschema om de BH1750 Lichtsensor met Arduino te verbinden, wordt hieronder weergegeven.
I2C-communicatiepennen SDA en SCL van BH1750 zijn respectievelijk verbonden met Arduino-pen A4 en A5 voor I 2 C-communicatie. Zoals we weten, is de bedrijfsspanning voor de sensor 3,3 V, dus VCC en GND van BH1750 zijn verbonden met 3,3 V en GND van Arduino. Voor LCD zijn datapinnen (D4-D7) verbonden met digitale pinnen D2-D5 van Arduino en RS- en EN-pinnen zijn verbonden met D6 en D7 van Arduino. V0 van LCD is verbonden met pot en een 10k pot wordt gebruikt om de helderheid van LCD te regelen.
Arduino programmeren voor het koppelen van BH1750-lichtsensor
Het programmeergedeelte voor het gebruik van deze LUX-sensor met Arduino is heel eenvoudig. Er is weliswaar een bibliotheek voor deze sensor, maar we kunnen deze ook zonder gebruiken.
Ten eerste hebben we header-bestanden voor het LCD- en I 2 C-protocol toegevoegd.
# omvatten
In de setup- functie hebben we zowel LCD als sensor geïnitialiseerd en het openingsbericht op LCD afgedrukt.
void setup () { Wire.begin (); lcd.begin (16,2); lcd.print ("BH1750 Light"); lcd.setCursor (0,1); lcd.print ("intensiteitssensor"); vertraging (2000); }
Hier worden de functies BH1750_Read en BH1750_Init gebruikt om respectievelijk de Lux-waarden te lezen en te schrijven. De functie Wire.beginTransmission () wordt gebruikt om de verzending te starten en de functie Wire.requestFrom (adres, 2) wordt gebruikt om registers te lezen, waarbij 2 het aantal registers aangeeft.
Verder wordt Wire.endTransmission () gebruikt om de verzending te beëindigen en de functie Wire.write () wordt gebruikt om naar het gewenste register te gaan door het adres van dat register erin in te voeren.
int BH1750_Read (int adres) { int i = 0; Wire.beginTransmission (adres); Wire.requestFrom (adres, 2); while (Wire.available ()) { buff = Wire.read (); i ++; } Wire.endTransmission (); terugkeer i; } void BH1750_Init (int adres) { Wire.beginTransmission (adres); Wire.write (0x10); Wire.endTransmission (); }
In de loop functie, zijn we het afdrukken van de real-time luxwaarden boven LCD. Vergelijk eerst de geretourneerde waarde van de BH1750_Read- functie met 2, en begin dan met het afdrukken van de Lux-waarden als deze gelijk is aan 2. Hier worden de waarden vergeleken met 2 omdat de BH1750_Read- functie de waarde van register count retourneert en we lezen slechts 2 registers. Dus als het 2 bereikt, begint het programma met het afdrukken van de LUX-waarden van de lichtintensiteit.
Vervolgens wordt een formule gebruikt om de waarden uit beide registers te krijgen en ze te delen door 1,2, wat de meetnauwkeurigheid is.
leegte lus () { int i; uint16_t waarde = 0; BH1750_Init (BH1750adres); vertraging (200); if (2 == BH1750_Read (BH1750adres)) { waarde = ((buff << 8) -buff) /1.2; lcd.clear (); lcd.print ("Intensiteit in LUX"); lcd.setCursor (6,1); lcd.print (waarde); } vertraging (150); }
Schakel ten slotte de Arduino in en upload het programma naar Arduino. Zodra het programma is geüpload, begint het LCD-scherm de lichtintensiteit in LUX-eenheden weer te geven. U kunt de waarden ook variëren door de lichtintensiteit rond de sensor te wijzigen, zoals wordt getoond in de onderstaande video.