BH1750. Omgivelseslyssensor med I2C-buss.

BH1750. Omgivelseslyssensor med I2C-buss.

BH1750. Omgivelseslyssensor med I2C-buss.

BH1750 er en omgivelseslyssensor med rimelig høy oppløsning og følsomhet. Den oppfører seg i møte med synlig lys på en måte som kan sammenlignes med det menneskelige øyet og påvirkes ikke av infrarød stråling og er heller ikke avhengig av fargetemperaturen til belysningstypen, det vil si at den fungerer godt med naturlig lys og med ulike typer kunstig belysning. Den kommuniserer digitalt med mikrokontrolleren, med I2C buss, så den er motstandsdyktig mot forstyrrelser hvis den plasseres i en viss avstand fra kretsen som leser den. Responstiden er ganske lav, mindre enn 200 ms under de mest ugunstige omstendighetene.

Innholdsfortegnelse

    BH1750 Sensor for omgivelseslys

    Fra et elektronisk synspunkt er implementeringen veldig enkel. Bare koble til strømmen (mellom 2,4V og 3,6V) og I2C buss. Eventuelt kan bussadressen endres for å koble til to enheter (med ADDR på et lavt nivå er det 0B0100011 eller 0x23 og med ADDR på et høyt nivå er det 0B1011100 eller 0x5C) og VDI-linjen kan brukes til tilbakestillingsfunksjonen med mikrokontroller.

    For å koble BH1750 til Arduino, i tillegg til å drives av 3,3 V-utgangen, er det mest riktig å bruke en nivåomformer i tillegg til pull-up motstander for I2C buss. Selv om komponenten vil støtte en direkte forbindelse til bussen I2C buss Det er ikke tilrådelig å dimensjonere en krets uten å vurdere å konvertere nivået.

    BH1750 sensor for omgivelseslys. Applikasjonskrets

    På grunn av sin popularitet, som skyldes at den er veldig billig i forhold til sin presisjon, finnes det flere moduler, som den velkjente GY-30, som kan sees på bildet i begynnelsen. For å koble dem mer komfortabelt ved prototyping med en mikrokontroller, inkluderer de vanligvis nivåomformere for I2C buss og spenningsregulatorer for å drive dem med en høyere spenning (opptil 5V) i stedet for 3,3V-utgangen på Arduino.

    BH1750 har to lesemoduser, kontinuerlig og individuell, som tilsvarer to tilstander, aktiv og lav strøm eller dvale. Mens hvis den kontinuerlige lesemodusen brukes, forblir BH1750 aktiv etter prøvetaking, etter å ha utført en individuell måling går den automatisk inn i dvale- og lavstrømsmodus. Den første avlesningen i kontinuerlig modus tar maksimalt 180 ms og påfølgende mellom 16 ms og 120 ms avhengig av oppløsningen.

    Sensoren er i stand til å måle med intervaller (oppløsning) på 4 lux, 1 lux og 0,5 lux. BH1750 anbefaler i sitt datablad å bruke oppløsningen på 1 lux, som lar deg skille mellom belysninger under 10 lux (som tilsvarer skumring) og som er mer immun mot støy som kan påvirke målingen.

    Oppløsningene på 1 lux og 4 lux bruker de 16 bitene med data for å representere heltallsdelen, slik at en maksimal måling på 65535 lux kan oppnås (solrik dag uten direkte lys). 0,5 lux-modusen bruker den minst signifikante biten for desimaldelen (måler fra 0,5 lux til 0,5 lux), så med de resterende 15 bitene er det mulig å representere en maksimal verdi på 32767 lux (eksteriør uten direkte lys)

    Teoretisk solbelysning kontra gjennomsnittskapasiteten til BH1750
    Teoretisk solbelysning av stedet og dagen for skriving av artikkelen (lovlig tid, ikke solenergi) versus gjennomsnittlig kapasitet til BH1750 ved 1 lux

    Normalt tilsvarer det optiske vinduet som omgivelseslyset måles i henhold til hele det synlige spekteret, og målet er å oppnå en følsomhetsfordeling i det som kan sammenlignes med menneskers. Hvis det optiske vinduet reduseres (lys måles i et kortere bølgelengdeområde) kan følsomheten til BH1750 økes (opptil 0,11 lux) med en modus for kansellering av justeringen av påvirkningen til det optiske vinduet ved å øke tidsavlesningen i proporsjon. Siden det i denne spesielle (overdimensjonerte) modusen tas separate avlesninger, må konteksten tillate dette uten å endre måleforholdene spesielt (f.eks. må sensoren forbli veldig stabil, den må ikke flytte til et område med forskjellige lysforhold)

    BH1750 Driftskoder

    By
    5>

    • 0B00000000 (0x00) Lav strøm eller hvilemodus.

    • 0B00000001 (0x01) Skrudd på.

    • 0B00000111 (0x07) Nullstille. Tømmer BH1750-dataloggene.

    Oppløsning
    5>

    • 0B00010011 (0x13) Kontinuerlig måling ved 4 lux oppløsning (mellom 16 ms og lesetid)

    • 0B00010000 (0x10) Kontinuerlig måling ved 1 lux oppløsning (120 ms lesetid)

    • 0B00010001 (0x11) Kontinuerlig måling ved 0,5 lux oppløsning (120 ms lesetid)

    • 0B00100011 (0x23) En måling ved 4 lux oppløsning (16 ms lesetid)

    • 0B00100000 (0x20) En måling ved 1 lux oppløsning (120 ms lesetid)

    • 0B00100001 (0x21) En måling ved 0,5 lux oppløsning (120 ms lesetid)

    Justering for endring i optisk vindu
    5>

    • 0B011MT [0,1,2,3,4] Lav bit av MTREG (Measurement Time REGister) registeret.

    • 0B01000MT [5,6,7] MTREG register høy bit.

    Les BH1750 fra Arduino

    For å måle omgivelseslys med BH1750 fra Arduino biblioteket brukes Metalltråd som styrer kommunikasjonen med I2C buss. Prosessen er den vanlige i denne typen kommunikasjon, først aktiveres de (en gang i programmet) med Wire.begin(), kommunikasjon med BH1750 starter med Wire.beginTransmission() og adressen din I2C (0x5C eller 0x23 avhengig av om ADDR er henholdsvis høy eller lav), konfigureres den ved å sende den tilsvarende koden med Wire.write() og bussen slippes med Wire.endTransmission()

    Hvis en av de kontinuerlige lesemodusene brukes, brukes Wire.beginTransmission() for å hente dataene med adressen I2C som tilsvarer tilgang til BH1750, blir du bedt om to byte (oppløsning er 16 biter) med Wire.requestFrom() som leses, ved hjelp av Wire.read(), og lastes inn i et heltall uten fortegn, og roterer den første byten med 8 biter. Bussen slippes i ettertid med Wire.endTransmission(). Det endelige resultatet oppnås ved å dele den returnerte verdien med presisjonsfaktoren (1,2 hvis det optiske vinduet ikke endres)

    Hvis den individuelle avlesningsmodusen brukes, går BH1750 i dvalemodus For å gå tilbake til aktiv modus kan en konfigurasjon (samme lesemodus eller en ny) eller oppstartskoden (0x01) sendes. Avslutningskoden (1750x0) kan brukes til å tvinge BH00 i hvilemodus.

    Det er viktig å respektere sensorens lesetid, som avhenger av oppløsningen. Hvis ventetiden ikke er kritisk, kan den forenes til en verdi for alle tilfeller som kan være litt større enn forventet maksimum for å sikre at lesingen fullføres.

    For å gjøre det mer behagelig å skrive kode for BH1750 Arduino, de mest relevante operasjonskodene finnes i følgende overskriftsdokument.

    Følgende eksempelkode viser den vanligste lesemodusen i lyssensoren I2C BH1750. Oppløsningen er 1 lux og lesemodusen er kontinuerlig. Eksemplet viser bruk av seriekonsollen Arduino, hvert resultat oppnådd fra den målte verdien.

    Som jeg sa ovenfor, bruker både 1 lux og 4 lux oppløsningsmodus de 16 bitene med data for å uttrykke målingen som et heltall. På den annen side, i 0,5 lux-modus, representerer den siste biten en desimaldel, det vil si at verdien som bidrar til den totale målingen forskyves med en potens på to til høyre. I 1 lux eller 4 lux modus den siste biten (LSB) er verdt 20, den nest siste 21, de neste 22…i 0,5 lux-modus den siste biten (LSB) er verdt 2-1, den nest siste 20, de neste 21...

    I henhold til denne datastrukturen, og med tanke på at to avlesninger må utføres I2C av en byte, for å oppnå 16-bits verdien må du laste inn de mest signifikante bitene av byten, de første som skal leses, og rotere dem 8 biter til venstre i 1 lux oppløsningsmodus og i 4 lux oppløsningsmodus og bare 7 bits i 0,5 lux. For å forene måten å lese på i 0,5 lux-modus kan du laste den mest signifikante byten inn i et heltall uten fortegn, rotere 8 biter til venstre, laste inn den minst signifikante byten og rotere hele usignerte heltall 1 bit til venstre. høyre, og bevare verdien av desimaldelen som indikerer LSB (minst signifikant bit) å bruke det senere.

    Logisk, for 1 lux eller 4 lux moduser er det nødvendig å bruke heltall uten fortegn (unsigned int) for hva Arduino ikke reserver MSB (den viktigste biten) for tegnet og kunne operere direkte med den sanne verdien av målingen, ikke med et negativt tall. I Arduino duett ikke nødvendig siden heltall bruker 32 biter, men det samme programmet vil også fungere hvis det brukes også unsigned int.

    Følgende kode viser hvordan 0,5 lux-modusen vil bli brukt

    Last ned dokumentene for eksempler på måling av omgivelseslys med BH1750-sensoren og Arduino.

    Legg inn kommentar

    Du kan ha gått glipp av