BH1750. Ümbritseva valguse andur I2C siiniga.
BH1750 on suhteliselt kõrge eraldusvõime ja tundlikkusega ümbritseva valguse andur. See käitub nähtava valguse käes inimsilmaga võrreldaval viisil ja seda ei mõjuta infrapunakiirgus ega sõltu valgustuse tüübi värvitemperatuurist, st töötab hästi loomuliku valgusega ja erinevat tüüpi kunstlik valgustus. See suhtleb digitaalselt mikrokontrolleriga I2C buss, seega on see häirete suhtes vastupidav, kui see asetatakse seda lugevast vooluringist teatud kaugusele. Selle reaktsiooniaeg on üsna madal, kõige ebasoodsamatel asjaoludel alla 200 ms.
Elektroonilisest vaatenurgast on selle rakendamine väga lihtne. Lihtsalt ühendage toide (2,4–3,6 V) ja I2C buss. Valikuliselt saab siini aadressi muuta kahe seadme ühendamiseks (madala taseme ADDR-iga on see 0B0100011 või 0x23 ja kõrge taseme ADDR-iga 0B1011100 või 0x5C) ja VDI-liini saab kasutada lähtestamisfunktsiooniks mikrokontroller.
BH1750 ühendamiseks Arduino, lisaks sellele, et toiteallikaks on 3,3 V väljund, on kõige õigem kasutada lisaks nivoomuundurile tõmbetakistid jaoks I2C buss. Kuigi komponent toetab otseühendust siiniga I2C buss Ei ole soovitatav määrata vooluringi suurust ilma taseme teisendamist kaalumata.
Tänu oma populaarsusele, mis on tingitud täpsuse suhtes väga odavusest, on mitmeid mooduleid, näiteks tuntud GY-30, mis on näha alguses fotol. Nende mugavamaks ühendamiseks mikrokontrolleriga prototüüpimisel sisaldavad need tavaliselt nivoomuundureid I2C buss ja pingeregulaatorid, et toita neid 5 V väljundi asemel kõrgema pingega (kuni 3,3 V) Arduino.
Mudelil BH1750 on kaks lugemisrežiimi, pidev ja individuaalne, mis vastavad kahele olekule, aktiivsele ja väikese võimsusega või unerežiimile. Kui pideva lugemise režiimi kasutamisel jääb BH1750 aktiivseks ka pärast proovivõttu, siis pärast individuaalset mõõtmist lülitub see automaatselt puhke- ja vähese energiatarbega režiimi. Esimene lugemine pidevas režiimis võtab maksimaalselt 180 ms ja järgnevad 16 ms kuni 120 ms olenevalt eraldusvõimest.
Andur on võimeline mõõtma intervallidega (eraldusvõime) 4 luksi, 1 luksi ja 0,5 luksi. BH1750 soovitab oma andmelehel kasutada eraldusvõimet 1 luksi, mis võimaldab eristada alla 10 luksi valgustust (mis vastab hämarusele) ja on immuunsem müra suhtes, mis võib mõõtmist mõjutada.
Eraldusvõimed 1 luksi ja 4 luksi kasutavad täisarvu esindamiseks 16 bitti andmeid, nii et on võimalik saavutada maksimaalne mõõtmine 65535 luksi (päikseline päev ilma otsese valguseta). Režiim 0,5 luksi kasutab kümnendkoha jaoks kõige vähem olulist bitti (mõõdetakse 0,5 luksi kuni 0,5 luksi), nii et ülejäänud 15 bitiga on võimalik esitada maksimaalne väärtus 32767 luksi (välispind ilma otsese valguseta)
Tavaliselt vastab optiline aken, mille järgi ümbritsevat valgust mõõdetakse, kogu nähtavale spektrile ja eesmärk on saavutada selles inimese omaga võrreldav tundlikkuse jaotus. Kui optilist akent vähendada (valgust mõõdetakse madalamas lainepikkuse vahemikus), saab BH1750 tundlikkust suurendada (kuni 0,11 luksi) optilise akna mõju reguleerimise tühistamise režiimiga, suurendades aja näitu. proportsioonis. Kuna selles erirežiimis (ülegabariidilises) režiimis võetakse eraldi näidud, peab kontekst seda võimaldama ilma mõõtmistingimusi eriti muutmata (näiteks andur peab jääma väga stabiilseks, ei tohi liikuda erinevate valgustingimustega piirkonda)
BH1750 operatsioonikoodid
Estado
5>
-
0B00000000
(0x00
) Väikese võimsusega või jõuderežiim. -
0B00000001
(0x01
) Sisse lülitatud. -
0B00000111
(0x07
) Lähtesta. Kustutab BH1750 andmelogid.
Resolutsioon
5>
-
0B00010011
(0x13
) Pidev mõõtmine eraldusvõimega 4 luksi (vahemikus 16 ms ja lugemisaeg) -
0B00010000
(0x10
) Pidev mõõtmine eraldusvõimega 1 luksi (lugemisaeg 120 ms) -
0B00010001
(0x11
) Pidev mõõtmine eraldusvõimega 0,5 luksi (lugemisaeg 120 ms) -
0B00100011
(0x23
) Mõõtmine eraldusvõimega 4 luksi (lugemisaeg 16 ms) -
0B00100000
(0x20
) Mõõtmine eraldusvõimega 1 luksi (lugemisaeg 120 ms) -
0B00100001
(0x21
) Mõõtmine eraldusvõimega 0,5 luksi (lugemisaeg 120 ms)
Reguleerimine optilise akna muutmiseks
5>
-
0B011MT
[0,1,2,3,4] MTREG (Measurement Time REGister) registri madal bitt. -
0B01000MT
[5,6,7] MTREG registri kõrge bitt.
Lugege Arduino BH1750
Ümbritseva valgustuse mõõtmiseks BH1750-ga alates Arduino raamatukogu kasutatakse Traat mis haldab suhtlust I2C buss. Protsess on seda tüüpi suhtluses tavaline, esmalt aktiveeritakse need (üks kord programmis) koos Wire.begin()
, algab side BH1750-ga Wire.beginTransmission()
ja teie aadress I2C (0x5C või 0x23 sõltuvalt sellest, kas ADDR on vastavalt kõrge või madal), konfigureeritakse, saates vastava koodi Wire.write()
ja buss vabastatakse koos Wire.endTransmission()
15
|
Wire.begin();
|
17
18
19
|
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_UN_LUX_BH1750);
Wire.endTransmission();
|
Kui kasutatakse üht pideva lugemise režiimidest, kasutatakse aadressiga andmete hankimiseks Wire.beginTransmission() I2C BH1750-le juurdepääsu saamiseks palutakse teil sisestada kaks baiti (eraldusvõime on 16 bitti) Wire.requestFrom()
mida loetakse, kasutatakse Wire.read()
, ja laaditakse märgita täisarvuks, pöörates esimest baiti 8 bitti. Buss vabastatakse hiljem koos Wire.endTransmission()
. Lõpptulemus saadakse tagastatud väärtuse jagamisel täpsusteguriga (1,2, kui optilist akent ei muudeta)
28
29
|
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.requestFrom(DIRECCION_BH1750_0,2);
|
37
38
|
lectura_BH1750=Wire.read()<<8; // Leer el primer byte y rotarlo 8 bits
lectura_BH1750|=Wire.read(); // Leer el segundo byte y «juntarlo» con el anterior on OR
|
40
|
iluminacion=long(100.0*(float)lectura_BH1750/DIVISOR_PRECISION)/100; // Resultado corregido y sin decimales
|
Individuaalse lugemise režiimi kasutamisel lülitub BH1750 puhkerežiimi.Aktiivsesse režiimi naasmiseks saab saata konfiguratsiooni (sama lugemisrežiimi või uue) või sisselülituskoodi (0x01). Väljalülituskoodi (1750x0) saab kasutada BH00 puhkerežiimi sundimiseks.
Oluline on järgida anduri lugemisaega, mis sõltub eraldusvõimest. Kui ootamine pole kriitiline, saab selle kõigi juhtumite jaoks ühendada väärtuseks, mis võib olla eeldatavast maksimumist veidi suurem, et tagada lugemise lõpuleviimine.
Et muuta BH1750 jaoks koodi kirjutamine mugavamaks Arduino, leiate kõige asjakohasemad toimingukoodid järgmisest päisdokumendist.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#define REPOSAR_BH1750 0x00 // Modo de reposo o bajo consumo
#define ENCENDER_BH1750 0x01
#define RESETEAR_BH1750 0x07
#define MEDIDA_CONTINUA_CUATRO_LUX_BH1750 0x13
#define MEDIDA_CONTINUA_UN_LUX_BH1750 0x10
#define MEDIDA_CONTINUA_MEDIO_LUX_BH1750 0x11
#define MEDIDA_SIMPLE_CUATRO_LUX_BH1750 0x23
#define MEDIDA_SIMPLE_UN_LUX_BH1750 0x20
#define MEDIDA_SIMPLE_MEDIO_LUX_BH1750 0x21
#define ESPERA_BH1750_0 250 // 250 milisegundos de espera de lectura del BH1750 (mayor que la máxima)
#define TIMEOUT_I2C 10 // 10 milisegundos de espera antes de renunciar a leer el bus I2C
#define DIVISOR_PRECISION 1.2 // valor por el que dividir la lectura para calcular la luminosidad 1.2 si no hay cambios en la ventana óptica
#define DIRECCION_BH1750_0 0x23
#define DIRECCION_BH1750_1 0x5C
|
Järgmine näidiskood näitab valgusanduri kõige levinumat lugemisrežiimi I2C BH1750. Eraldusvõime on 1 luks ja lugemisrežiim on pidev. Näide näitab jadakonsooli kasutamist Arduino, iga mõõdetud väärtusest saadud tulemus.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include “BH1750.h” // Cargar los códigos de operación del BH1750
#include <Wire.h>
unsigned int lectura_BH1750;
unsigned int iluminacion;
//float iluminacion; // Mostrar el valor con decimales
long cronometro_lecturas=0;
long tiempo_transcurrido;
long cronometro_timeout_i2c;
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(ESPERA_BH1750_0); // Espera inicial para estabilizar el BH1750
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_UN_LUX_BH1750);
Wire.endTransmission();
}
void loop()
{
tiempo_transcurrido=millis()–cronometro_lecturas;
if(tiempo_transcurrido>ESPERA_BH1750_0)
{
cronometro_lecturas=millis();
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.requestFrom(DIRECCION_BH1750_0,2);
do
{
tiempo_transcurrido=millis()–cronometro_timeout_i2c;
}
while(Wire.available()<2&&tiempo_transcurrido<TIMEOUT_I2C);
if(Wire.available()>1)
{
lectura_BH1750=Wire.read()<<8; // Leer el primer byte y rotarlo 8 bits
lectura_BH1750|=Wire.read(); // Leer el segundo byte y «juntarlo» con el anterior on OR
//iluminacion=lectura_BH1750/DIVISOR_PRECISION; // Resultado corregido y con decimales (mínimamente más preciso pero menos legible)
iluminacion=long(100.0*(float)lectura_BH1750/DIVISOR_PRECISION)/100; // Resultado corregido y sin decimales
Serial.print(“La iluminación es de “);
Serial.print(iluminacion);
Serial.println(” lux”);
}
}
}
|
Nagu ma eespool ütlesin, kasutavad nii 1 luksi kui ka 4 luksi eraldusvõime režiimid mõõtmise täisarvuna väljendamiseks 16 bitti andmeid. Teisest küljest tähistab 0,5 luksi režiimis viimane bitt kümnendosa, see tähendab, et kogumõõtmisele kaasa aitavat väärtust nihutatakse kahe võrra paremale. 1 luksi või 4 luksi režiimis viimane bit (LSB) on väärt 20, eelviimane 21, järgmised 22…0,5 luksi režiimis viimane bit (LSB) on väärt 2-1, eelviimane 20, järgmised 21...
Vastavalt sellele andmestruktuurile ja arvestades, et tuleb teha kaks lugemist I2C baidist, tuleb 16-bitise väärtuse saamiseks laadida baidi kõige olulisemad bitid, esimesed, mida loetakse, ja pöörata neid 8 bitti vasakule 1 luksi eraldusvõime režiimis ja 4 luksi eraldusvõime režiimis ning ainult 7 bitti 0,5 luksis. Lugemisviisi ühtlustamiseks 0,5 luksi režiimis saate laadida kõige olulisema baidi märgita täisarvuks, pöörata 8 bitti vasakule, laadida kõige vähemtähtsaim bait ja pöörata kogu märgita täisarvu 1 biti võrra vasakule. paremale, säilitades kümnendosa väärtus, mis näitab LSB (kõige vähem oluline bitt) et seda hiljem rakendada.
Loogiliselt on 1 luksi või 4 luksi režiimide puhul vaja kasutada märgita täisarve (unsigned int
) milleks Arduino ära broneeri MSB (kõige olulisem bitt) märgi jaoks ja suutma opereerida otse mõõtmise tegeliku väärtusega, mitte negatiivse arvuga. sisse Arduino duett pole vajalik, kuna täisarvud kasutavad 32 bitti, kuid sama programm töötab ka siis, kui seda kasutatakse unsigned int
.
Järgmine kood näitab, kuidas 0,5 luksi režiimi kasutatakse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include “BH1750.h” // Cargar los códigos de operación del BH1750
#include <Wire.h>
unsigned int lectura_BH1750;
//unsigned int iluminacion;
float iluminacion; // Mostrar el valor con decimales
long cronometro_lecturas=0;
long tiempo_transcurrido;
long cronometro_timeout_i2c;
bool parte_decimal;
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(ESPERA_BH1750_0); // Espera inicial para estabilizar el BH1750
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_MEDIO_LUX_BH1750);
Wire.endTransmission();
}
void loop()
{
tiempo_transcurrido=millis()–cronometro_lecturas;
if(tiempo_transcurrido>ESPERA_BH1750_0)
{
cronometro_lecturas=millis();
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.requestFrom(DIRECCION_BH1750_0,2);
do
{
tiempo_transcurrido=millis()–cronometro_timeout_i2c;
}
while(Wire.available()<2&&tiempo_transcurrido<TIMEOUT_I2C);
if(Wire.available()>1)
{
lectura_BH1750=Wire.read()<<8; // Leer el primer byte y rotarlo 8 bits
lectura_BH1750|=Wire.read(); // Leer el segundo byte y «juntarlo» con el anterior on OR
parte_decimal=(lectura_BH1750<<15)>0;
lectura_BH1750>>=1;
iluminacion=((float)lectura_BH1750+(parte_decimal?0.5:0.0))/DIVISOR_PRECISION;
Serial.print(“La iluminación es de “);
Serial.print(iluminacion);
Serial.println(” lux”);
}
}
}
|
Laadige alla BH1750 anduri ja Arduino abil ümbritseva valguse mõõtmise näidete dokumendid.
Postita kommentaar