BH1750. Omgivningsljussensor med I2C-buss.

BH1750. Omgivningsljussensor med I2C-buss.

BH1750. Omgivningsljussensor med I2C-buss.

BH1750 är en omgivande ljussensor med lagom hög upplösning och känslighet. Den beter sig inför synligt ljus på ett sätt som är jämförbart med det mänskliga ögat och påverkas inte av infraröd strålning och beror inte heller på färgtemperaturen för typen av belysning, det vill säga fungerar bra med naturligt ljus och med olika typer av artificiell belysning. Den kommunicerar digitalt med mikrokontrollern, med I2C-buss, så den är resistent mot störningar om den placeras på ett visst avstånd från kretsen som läser den. Dess svarstid är ganska låg, mindre än 200 ms under de mest ogynnsamma omständigheterna.

Innehållsförteckning

    BH1750 Sensor för omgivande ljus

    Ur elektronisk synvinkel är implementeringen mycket enkel. Anslut helt enkelt strömmen (mellan 2,4V och 3,6V) och I2C-buss. Alternativt kan bussadressen ändras för att ansluta två enheter (med ADDR på låg nivå är det 0B0100011 eller 0x23 och med ADDR på hög nivå är det 0B1011100 eller 0x5C) och VDI-linjen kan användas för återställningsfunktionen med mikrokontroller.

    För att ansluta BH1750 till Arduino, förutom att drivas av 3,3 V-utgången, är det mest korrekt att använda en nivåomvandlare utöver pull-up motstånd för I2C-buss. Även om komponenten kommer att stödja en direkt anslutning till bussen I2C-buss Det är inte tillrådligt att dimensionera en krets utan att överväga att konvertera nivån.

    BH1750 omgivande ljussensor. Applikationskrets

    På grund av dess popularitet, som beror på att den är väldigt billig i förhållande till dess precision, finns det flera moduler, som den välkända GY-30, som syns på fotografiet i början. För att ansluta dem mer bekvämt vid prototyper med en mikrokontroller, inkluderar de vanligtvis nivåomvandlare för I2C-buss och spänningsregulatorer för att driva dem med en högre spänning (upp till 5V) istället för 3,3V-utgången på Arduino.

    BH1750 har två läslägen, kontinuerlig och individuell, som motsvarar två tillstånd, aktiv och låg effekt eller viloläge. Om det kontinuerliga avläsningsläget används förblir BH1750 aktiv efter provtagning, men efter att ha utfört en individuell mätning går den automatiskt in i viloläge och lågeffektläge. Den första avläsningen i kontinuerligt läge tar max 180 ms och efterföljande mellan 16 ms och 120 ms beroende på upplösningen.

    Sensorn kan mäta med intervaller (upplösning) på 4 lux, 1 lux och 0,5 lux. BH1750 rekommenderar i sitt datablad att använda upplösningen 1 lux, vilket gör att belysningar under 10 lux kan urskiljas (vilket motsvarar skymning) och är mer immun mot brus som kan påverka mätningen.

    Upplösningarna 1 lux och 4 lux använder de 16 bitarna av data för att representera heltalsdelen så att en maximal mätning på 65535 lux kan uppnås (solig dag utan direkt ljus). Läget 0,5 lux använder den minst signifikanta biten för decimaldelen (mäter från 0,5 lux till 0,5 lux) så med de återstående 15 bitarna är det möjligt att representera ett maximalt värde på 32767 lux (exteriör utan direkt ljus)

    Teoretisk solbelysning kontra medelkapaciteten för BH1750
    Teoretisk solbelysning av platsen och dagen för att skriva artikeln (laglig tid, inte solenergi) kontra den genomsnittliga kapaciteten för BH1750 vid 1 lux

    Normalt motsvarar det optiska fönster enligt vilket omgivande ljus mäts hela det synliga spektrumet och syftet är att uppnå en känslighetsfördelning i det jämförbar med människors. Om det optiska fönstret reduceras (ljus mäts i ett lägre våglängdsområde) kan BH1750:s känslighet ökas (upp till 0,11 lux) med ett sätt att avbryta justeringen av det optiska fönstrets påverkan genom att öka tidsavläsningen i förhållande. Eftersom i detta speciella (överdimensionerade) läge görs separata avläsningar, måste sammanhanget tillåta detta utan att särskilt ändra mätförhållandena (till exempel måste sensorn förbli mycket stabil, den får inte flytta till ett område med olika ljusförhållanden)

    BH1750 Driftkoder

    Estado
    5>

    • 0B00000000 (0x00) Låg effekt eller viloläge.

    • 0B00000001 (0x01) Påslagen.

    • 0B00000111 (0x07) Återställ. Rensar BH1750-dataloggarna.

    upplösning
    5>

    • 0B00010011 (0x13) Kontinuerlig mätning vid 4 lux upplösning (mellan 16 ms och avläsningstid)

    • 0B00010000 (0x10) Kontinuerlig mätning vid 1 lux upplösning (120 ms avläsningstid)

    • 0B00010001 (0x11) Kontinuerlig mätning vid 0,5 lux upplösning (120 ms avläsningstid)

    • 0B00100011 (0x23) En mätning vid 4 lux upplösning (16 ms avläsningstid)

    • 0B00100000 (0x20) En mätning vid 1 lux upplösning (120 ms avläsningstid)

    • 0B00100001 (0x21) En mätning vid 0,5 lux upplösning (120 ms avläsningstid)

    Justering för ändring av optiskt fönster
    5>

    • 0B011MT [0,1,2,3,4] Låg bit i MTREG-registret (Measurement Time REGister).

    • 0B01000MT [5,6,7] MTREG register hög bit.

    Läs BH1750 från Arduino

    För att mäta omgivande belysning med BH1750 från Arduino biblioteket används Wire som hanterar kommunikationen med I2C-buss. Processen är den vanliga i denna typ av kommunikation, först aktiveras de (en gång i programmet) med Wire.begin(), börjar kommunikationen med BH1750 med Wire.beginTransmission() och din adress I2C (0x5C eller 0x23 beroende på om ADDR är hög respektive låg) konfigureras den genom att skicka motsvarande kod med Wire.write() och bussen släpps med Wire.endTransmission()

    Om ett av lägena för kontinuerlig läsning används, används Wire.beginTransmission() för att hämta data med adressen I2C motsvarande åtkomst till BH1750, uppmanas du att ange två byte (upplösningen är 16 bitar) med Wire.requestFrom() som läses, med hjälp av Wire.read(), och läses in i ett heltal utan tecken, och roterar den första byten med 8 bitar. Bussen släpps därefter med Wire.endTransmission(). Det slutliga resultatet erhålls genom att dividera det returnerade värdet med precisionsfaktorn (1,2 om det optiska fönstret inte ändras)

    Om det individuella avläsningsläget används går BH1750 in i viloläge För att återgå till aktivt läge kan en konfiguration (samma avläsningsläge eller ett nytt) eller startkoden (0x01) skickas. Avstängningskoden (1750x0) kan användas för att tvinga BH00 till viloläge.

    Det är viktigt att respektera sensorns avläsningstid, som beror på upplösningen. Om väntan inte är kritisk kan den förenas till ett värde för alla fall som kan vara något större än det förväntade maximala för att säkerställa att läsningen slutförs.

    För att göra det bekvämare att skriva kod för BH1750 Arduino, de mest relevanta operationskoderna finns i följande rubrikdokument.

    Följande exempelkod visar det vanligaste läsläget i ljussensorn I2C BH1750. Upplösningen är 1 lux och läsläget är kontinuerligt. Exemplet visar, att använda den seriella konsolen Arduino, varje resultat som erhålls från det uppmätta värdet.

    Som jag sa ovan använder både upplösningslägena 1 lux och 4 lux de 16 databitarna för att uttrycka mätningen som ett heltal. Å andra sidan, i 0,5 lux-läget, representerar den sista biten en decimaldel, det vill säga att värdet som bidrar till den totala mätningen förskjuts med en potens av två åt höger. I 1 lux eller 4 lux läge den sista biten (LSB) är värt 20, den näst sista 21, nästa 22…i 0,5 lux-läge den sista biten (LSB) är värt 2-1, den näst sista 20, nästa 21.

    Enligt denna datastruktur och med tanke på att två avläsningar måste utföras I2C av en byte, för att erhålla 16-bitarsvärdet måste du ladda de mest signifikanta bitarna i byten, de första som ska läsas, och rotera dem 8 bitar åt vänster i 1 lux upplösningsläge och i 4 lux upplösningsläge och endast 7 bitar i 0,5 lux. För att förena sättet att läsa i 0,5 lux-läget kan du ladda den mest signifikanta byten i ett heltal utan tecken, rotera 8 bitar åt vänster, ladda den minst signifikanta byten och rotera hela det osignerade heltal 1 bit åt vänster. höger, bevara värdet på decimaldelen som indikerar LSB (minst signifikant bit) att tillämpa det senare.

    Logiskt, för 1 lux eller 4 lux lägen är det nödvändigt att använda heltal utan tecken (unsigned int) Varför då Arduino reservera inte MSB (den mest signifikanta biten) för tecknet och kunna arbeta direkt med det sanna värdet på mätningen, inte med ett negativt tal. I Arduino duett inte nödvändigt eftersom heltal använder 32 bitar, men samma program fungerar också om det används också unsigned int.

    Följande kod visar hur 0,5 lux-läget skulle användas

    Ladda ner dokumenten för exemplen på att mäta omgivande ljus med BH1750-sensorn och Arduino.

    Post kommentar

    Du kanske har missat