BH1750. Környezeti fényérzékelő I2C busszal.
A BH1750 egy meglehetősen nagy felbontású és érzékeny környezeti megvilágítás-érzékelő. Látható fénnyel szemben az emberi szeméhez hasonló módon viselkedik, és nem befolyásolja az infravörös sugárzás, és nem függ a világítás típusának színhőmérsékletétől sem, vagyis jól működik természetes fénnyel és különböző típusú mesterséges világítás. Digitálisan kommunikál a mikrokontrollerrel, a I2C busz, tehát ellenáll az interferenciának, ha bizonyos távolságra van elhelyezve az azt olvasó áramkörtől. Válaszideje meglehetősen alacsony, a legkedvezőtlenebb körülmények között kevesebb, mint 200 ms.
Elektronikus szempontból a megvalósítása nagyon egyszerű. Egyszerűen csatlakoztassa a tápfeszültséget (2,4 V és 3,6 V között) és a I2C busz. Opcionálisan a buszcím megváltoztatható két eszköz csatlakoztatására (alacsony ADDR esetén 0B0100011 vagy 0x23, magas szintű ADDR esetén pedig 0B1011100 vagy 0x5C), és a VDI vonal használható a reset funkcióhoz a mikrokontroller.
A BH1750 csatlakoztatásához Arduino, amellett, hogy a 3,3 V-os kimenet táplálja, a leghelyesebb a szintátalakító használata mellett a felhúzó ellenállások a I2C busz. Bár a komponens támogatni fogja a buszhoz való közvetlen csatlakozást I2C busz Nem tanácsos az áramkör méretét a szint átalakítása nélkül méretezni.
Népszerűsége miatt, ami a pontosságához képest rendkívül olcsónak köszönhető, több modul is létezik, mint például a jól ismert GY-30, ami az elején látható a fényképen. Ahhoz, hogy mikrokontrollerrel való prototípuskészítéskor kényelmesebben csatlakoztassák őket, általában szintátalakítókat tartalmaznak a I2C busz és feszültségszabályozókkal, hogy a 5 V-os kimenet helyett magasabb feszültséggel (legfeljebb 3,3 V-tal) táplálják őket. Arduino.
A BH1750 két olvasási móddal rendelkezik, folyamatos és egyéni, amelyek két állapotnak felelnek meg, az aktív és az alacsony fogyasztású vagy alvó állapotnak. Míg folyamatos olvasási mód esetén a BH1750 a mintavétel után is aktív marad, addig egyedi mérés elvégzése után automatikusan alvó és alacsony fogyasztású üzemmódba lép. Az első leolvasás folyamatos üzemmódban maximum 180 ms-ig tart, a továbbiak pedig 16 ms és 120 ms között a felbontástól függően.
Az érzékelő 4 lux, 1 lux és 0,5 lux időközönként (felbontás) képes mérni. A BH1750 adatlapján az 1 lux felbontás használatát javasolja, ami lehetővé teszi a 10 lux alatti megvilágítás megkülönböztetését (ami szürkületnek felel meg), és immunisabb a mérést befolyásoló zajokra.
Az 1 lux és 4 lux felbontás a 16 bites adatot használja az egész rész reprezentálására, így 65535 lux maximális mérés érhető el (napsütéses nappal közvetlen fény nélkül). A 0,5 lux mód a legkevésbé szignifikáns bitet használja a decimális részhez (0,5 lux és 0,5 lux közötti mérték), így a fennmaradó 15 bittel 32767 lux maximális értéket lehet megjeleníteni (külsőben közvetlen fény nélkül)
Általában az optikai ablak, amely alapján a környezeti fényt mérik, megfelel a teljes látható spektrumnak, és a cél az, hogy az emberéhez hasonló érzékenységi eloszlást érjünk el benne. Ha az optikai ablakot csökkentjük (a fényt alacsonyabb hullámhossz-tartományban mérjük), a BH1750 érzékenysége növelhető (akár 0,11 lux-ig) az optikai ablak hatásának beállításának törlésével az idő leolvasásának növelésével. arányosan. Mivel ebben a speciális (túlméretezett) módban külön leolvasás történik, a környezetnek lehetővé kell tennie ezt a mérési feltételek különösebb megváltoztatása nélkül (például az érzékelőnek nagyon stabilnak kell maradnia, nem szabad elmozdulnia eltérő megvilágítású területre).
BH1750 működési kódok
Estado
5>
-
0B00000000
(0x00
) Alacsony fogyasztású vagy üresjárati üzemmód. -
0B00000001
(0x01
) Bekapcsolva. -
0B00000111
(0x07
) Visszaállítás. Törli a BH1750 adatnaplóit.
felbontás
5>
-
0B00010011
(0x13
) Folyamatos mérés 4 lux felbontással (16 ms és olvasási idő között) -
0B00010000
(0x10
) Folyamatos mérés 1 lux felbontással (120 ms olvasási idő) -
0B00010001
(0x11
) Folyamatos mérés 0,5 lux felbontással (120 ms olvasási idő) -
0B00100011
(0x23
) Mérés 4 lux felbontással (16 ms olvasási idő) -
0B00100000
(0x20
) Mérés 1 lux felbontással (120 ms olvasási idő) -
0B00100001
(0x21
) Mérés 0,5 lux felbontással (120 ms olvasási idő)
Beállítás az optikai ablak változásához
5>
-
0B011MT
[0,1,2,3,4] Az MTREG (Measurement Time REGister) regiszter alacsony bitje. -
0B01000MT
[5,6,7] MTREG regiszter magas bit.
Olvassa el a BH1750-et az Arduino-tól
Környezeti megvilágítás mérésére a BH1750 készülékkel Arduino a könyvtárat használják Huzal amely kezeli a kommunikációt a I2C busz. A folyamat a szokásos az ilyen típusú kommunikációban, először aktiválják (a programban egyszer) -val Wire.begin()
, a BH1750-el való kommunikáció azzal kezdődik Wire.beginTransmission()
és a címed I2C (0x5C vagy 0x23 attól függően, hogy az ADDR magas vagy alacsony), a megfelelő kód elküldésével konfigurálható Wire.write()
és a buszt kiengedik vele Wire.endTransmission()
15
|
Wire.begin();
|
17
18
19
|
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_UN_LUX_BH1750);
Wire.endTransmission();
|
Ha a folyamatos olvasási módok egyikét használjuk, a Wire.beginTransmission() segítségével kapja meg az adatokat a címmel I2C a BH1750 eléréséhez a rendszer két bájt megadását kéri (a felbontás 16 bit) Wire.requestFrom()
amelyeket olvasnak, használnak Wire.read()
, és egy előjel nélküli egész számba töltődnek be, az első bájtot 8 bittel elforgatva. A buszt ezt követően kiadják Wire.endTransmission()
. A végeredményt úgy kapjuk meg, hogy a visszaadott értéket elosztjuk a pontossági tényezővel (1,2, ha az optikai ablak nem változik)
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
|
Egyedi leolvasási mód használata esetén a BH1750 alvó üzemmódba lép, az aktív módba való visszatéréshez konfigurációt (ugyanazt az olvasási módot vagy újat) vagy a bekapcsolási kódot (0x01) lehet küldeni. A leállítási kóddal (1750x0) a BH00 alvó módba kényszeríthető.
Fontos betartani az érzékelő leolvasási idejét, amely a felbontástól függ. Ha a várakozás nem kritikus, akkor minden esetben egyesíthető olyan értékké, amely valamivel nagyobb lehet a várt maximumnál, így biztosítva az olvasás befejezését.
Hogy kényelmesebb legyen a kódírás a BH1750-hez Arduino, a legfontosabb műveleti kódok a következő fejléc dokumentumban találhatók.
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
|
A következő példakód a fényérzékelő legáltalánosabb olvasási módját mutatja I2C BH1750. A felbontás 1 lux, az olvasási mód pedig folyamatos. A példa a soros konzol használatával mutatja be Arduino, a mért értékből kapott minden eredmény.
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”);
}
}
}
|
Ahogy fentebb mondtam, mind az 1 lux, mind a 4 lux felbontású mód a 16 bites adatot használja a mérés egész számkénti kifejezésére. Ezzel szemben 0,5 lux módban az utolsó bit egy decimális részt képvisel, vagyis a teljes méréshez hozzájáruló érték kettővel jobbra tolódik el. 1 lux vagy 4 lux módban az utolsó bit (LSB) 2-t ér0, az utolsó előtti 21, a következő 22…0,5 lux módban az utolsó bit (LSB) 2-t ér-1, az utolsó előtti 20, a következő 21...
Ennek az adatszerkezetnek megfelelően, és figyelembe véve, hogy két leolvasást kell végezni I2C Egy bájtból a 16 bites érték eléréséhez be kell tölteni a bájt legjelentősebb bitjeit, az elsőket, amelyeket be kell olvasni, és 8 bittel balra kell forgatni 1 lux felbontású és 4 lux felbontású módban és csak 7 bit a 0,5 luxban. A 0,5 lux módban történő olvasás egységesítéséhez betöltheti a legjelentősebb bájtot egy előjel nélküli egész számba, elforgathatja 8 bittel balra, betöltheti a legkisebb jelentőségű bájtot és elforgathatja a teljes előjel nélküli egészet 1 bittel balra. jobbra, megőrizve a tizedes rész értéke, amely a LSB (legkisebb jelentőségű bit) hogy később alkalmazzuk.
Logikus, hogy 1 lux vagy 4 lux módokhoz előjel nélküli egész számokat kell használni (unsigned int
) miért Arduino ne foglalja le a MSB (legjelentősebb bit) előjelre, és közvetlenül a mérés valódi értékével tudjon működni, ne negatív számmal. Ban ben Arduino Duett nem szükséges, mivel az egész számok 32 bitet használnak, de ugyanaz a program is működik, ha használják is unsigned int
.
A következő kód a 0,5 lux mód használatának módját mutatja
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”);
}
}
}
|
Töltse le a dokumentumokat a környezeti fény mérésére a BH1750 érzékelővel és az Arduino-val.
Hozzászólás Comment