BH1750. Ympäristön valoanturi I2C-väylällä.
BH1750 on ympäristön valaistusanturi, jolla on kohtuullisen korkea resoluutio ja herkkyys. Se käyttäytyy näkyvän valon edessä ihmissilmään verrattavissa olevalla tavalla, eikä infrapunasäteily vaikuta siihen eikä se riipu valaistustyypin värilämpötilasta, eli se toimii hyvin luonnonvalossa ja erilaisia keinovaloja. Se kommunikoi digitaalisesti mikro-ohjaimen kanssa I2C-väylä, joten se kestää häiriöitä, jos se sijoitetaan tietylle etäisyydelle sitä lukevasta piiristä. Sen vasteaika on melko pieni, alle 200 ms epäsuotuisimmissa olosuhteissa.
Sähköisestä näkökulmasta sen toteuttaminen on hyvin yksinkertaista. Liitä vain virta (2,4–3,6 V) ja I2C-väylä. Vaihtoehtoisesti väyläosoitetta voidaan muuttaa kahden laitteen yhdistämiseksi (ADDR:llä matalalla tasolla se on 0B0100011 tai 0x23 ja ADDR:llä korkealla tasolla 0B1011100 tai 0x5C) ja VDI-linjaa voidaan käyttää nollaustoimintoon mikro-ohjain.
BH1750:n liittäminen Työläs3,3 V ulostulon lisäksi on oikein käyttää tasomuunninta. vetovastukset varten I2C-väylä. Vaikka komponentti tukee suoraa yhteyttä väylään I2C-väylä Ei ole suositeltavaa mitoittaa piiriä harkitsematta tason muuntamista.
Sen suosion vuoksi, joka johtuu tarkkuuteensa nähden erittäin halvasta, on olemassa useita moduuleja, kuten tuttu GY-30, joka näkyy valokuvassa alussa. Niiden yhdistämiseksi mukavammin, kun prototyyppiä tehdään mikro-ohjaimella, ne sisältävät yleensä tasomuuntimet I2C-väylä ja jännitesäätimet, jotta ne syöttävät suuremmalla jännitteellä (jopa 5 V) 3,3 V:n ulostulon sijaan Työläs.
BH1750:ssä on kaksi lukutilaa, jatkuva ja yksilöllinen, jotka vastaavat kahta tilaa, aktiivista ja matalatehoista tai lepotilaa. Jos jatkuvaa lukutilaa käytetään, BH1750 pysyy aktiivisena näytteenoton jälkeen, mutta yksittäisen mittauksen jälkeen se siirtyy automaattisesti lepotilaan ja virransäästötilaan. Ensimmäinen luku jatkuvassa tilassa kestää enintään 180 ms ja seuraavat 16 ms ja 120 ms välillä resoluutiosta riippuen.
Anturi pystyy mittaamaan 4 luksia, 1 luksia ja 0,5 luksia välein (resoluutio). BH1750 suosittelee teknisissä tiedoissaan käyttämään 1 luxin resoluutiota, jonka avulla voit erottaa alle 10 luksia (joka vastaa hämärää) ja joka on immuuni mittaukseen mahdollisesti vaikuttavalle melulle.
Resoluutiot 1 lux ja 4 luksia käyttävät 16 bittiä dataa edustamaan kokonaislukuosaa, joten maksimimittaus 65535 luksia voidaan saavuttaa (aurinkoinen päivä ilman suoraa valoa). 0,5 luksia käyttää vähiten merkitsevää bittiä desimaaliosalle (mitat 0,5 - 0,5 luksia), joten jäljellä olevilla 15 bitillä on mahdollista esittää maksimiarvo 32767 luksia (ulkopuolinen ilman suoraa valoa)
Normaalisti optinen ikkuna, jonka mukaan ympäristön valoa mitataan, vastaa koko näkyvää spektriä ja siinä pyritään saavuttamaan ihmisen herkkyysjakauma. Jos optista ikkunaa pienennetään (valoa mitataan pienemmällä aallonpituusalueella), BH1750:n herkkyyttä voidaan lisätä (jopa 0,11 luksia) optisen ikkunan vaikutuksen säädön peruutustavalla lisäämällä aikalukemaa suhteessa. Koska tässä erikoistilassa (ylimitoitettu) otetaan erilliset lukemat, kontekstin tulee sallia tämä muuttamatta erityisesti mittausolosuhteita (esim. anturin tulee pysyä erittäin vakaana, se ei saa siirtyä alueelle, jossa on erilaiset valaistusolosuhteet)
BH1750 käyttökoodit
Estado
5>
-
0B00000000
(0x00
) Vähäinen teho tai tyhjäkäyntitila. -
0B00000001
(0x01
) Kytketty päälle. -
0B00000111
(0x07
) Nollaa. Tyhjentää BH1750-tietolokit.
päätöslauselma
5>
-
0B00010011
(0x13
) Jatkuva mittaus 4 luksin resoluutiolla (16 ms ja lukuajan välillä) -
0B00010000
(0x10
) Jatkuva mittaus 1 luxin resoluutiolla (120 ms lukuaika) -
0B00010001
(0x11
) Jatkuva mittaus 0,5 luxin resoluutiolla (120 ms lukuaika) -
0B00100011
(0x23
) Mittaus 4 luksin resoluutiolla (16 ms lukuaika) -
0B00100000
(0x20
) Mittaus 1 luksin resoluutiolla (120 ms lukuaika) -
0B00100001
(0x21
) Mittaus 0,5 luksin resoluutiolla (120 ms lukuaika)
Säätö optisen ikkunan muutoksille
5>
-
0B011MT
[0,1,2,3,4] MTREG-rekisterin (Measurement Time REGister) matala bitti. -
0B01000MT
[5,6,7] MTREG-rekisterin korkea bitti.
Lue Arduinon BH1750
Mittaa ympäristön valaistusta BH1750:lla alkaen Työläs kirjastoa käytetään Johdin joka hallitsee viestintää I2C-väylä. Prosessi on tavallinen tämäntyyppisessä viestinnässä, ensin ne aktivoidaan (kerran ohjelmassa) kanssa Wire.begin()
, viestintä BH1750:n kanssa alkaa Wire.beginTransmission()
ja osoitteesi I2C (0x5C tai 0x23 riippuen siitä, onko ADDR korkea vai matala), se määritetään lähettämällä vastaava koodi Wire.write()
ja bussi vapautetaan kanssa Wire.endTransmission()
15
|
Wire.begin();
|
17
18
19
|
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_UN_LUX_BH1750);
Wire.endTransmission();
|
Jos käytetään yhtä jatkuvan lukumuodon tiloja, Wire.beginTransmission() käytetään osoitteen sisältävien tietojen hakemiseen. I2C BH1750:n käyttöä vastaavasti sinua pyydetään antamaan kaksi tavua (resoluutio on 16 bittiä) Wire.requestFrom()
joita luetaan, käytetään Wire.read()
, ja ne ladataan etumerkittömäksi kokonaisluvuksi kiertäen ensimmäistä tavua 8 bittiä. Bussi vapautetaan myöhemmin kanssa Wire.endTransmission()
. Lopputulos saadaan jakamalla palautettu arvo tarkkuuskertoimella (1,2, jos optista ikkunaa ei muuteta)
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
|
Jos käytetään yksittäistä lukutilaa, BH1750 siirtyy lepotilaan.Palauttaaksesi aktiiviseen tilaan, voidaan lähettää konfiguraatio (sama lukutila tai uusi) tai käynnistyskoodi (0x01). Sammutuskoodia (1750x0) voidaan käyttää pakottamaan BH00 lepotilaan.
On tärkeää kunnioittaa anturin lukuaikaa, joka riippuu resoluutiosta. Jos odotus ei ole kriittinen, se voidaan yhdistää arvoksi kaikille tapauksille, joka voi olla hieman odotettua maksimiarvoa suurempi, jotta voidaan varmistaa, että luku on valmis.
Jotta koodin kirjoittaminen BH1750:lle olisi mukavampaa Työläs, tärkeimmät toimintakoodit löytyvät seuraavasta otsikkoasiakirjasta.
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
|
Seuraava esimerkkikoodi näyttää yleisimmän valoanturin lukutilan I2C BH1750. Tarkkuus on 1 luksia ja lukutila on jatkuva. Esimerkki näyttää sarjakonsolin käyttämisen Työläs, jokainen mitatusta arvosta saatu tulos.
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”);
}
}
}
|
Kuten edellä sanoin, sekä 1 luxin että 4 luxin resoluutiotilat käyttävät 16 bitin dataa mittauksen ilmaisemiseen kokonaislukuna. Toisaalta 0,5 luksin tilassa viimeinen bitti edustaa desimaaliosaa, eli kokonaismittaukseen vaikuttava arvo siirtyy potenssilla kaksi oikealle. 1 luksia tai 4 luksia -tilassa viimeinen bitti (LSB) on 2 arvoinen0, toiseksi viimeinen 21, seuraava 22…0,5 luksia -tilassa viimeinen bitti (LSB) on 2 arvoinen-1, toiseksi viimeinen 20, seuraava 21...
Tämän tietorakenteen mukaan ja ottaen huomioon, että on suoritettava kaksi lukemaa I2C tavun verran, saadaksesi 16-bittisen arvon, sinun on ladattava tavun merkittävimmät bitit, ensimmäiset luettavat, ja käännettävä niitä 8 bittiä vasemmalle 1 luxin resoluutiotilassa ja 4 luksen resoluutiotilassa ja vain 7 bittiä 0,5 luxissa. Lukutavan yhtenäistämiseksi 0,5 luksia -tilassa voit ladata merkitsevimmän tavun etumerkittömäksi kokonaisluvuksi, kiertää 8 bittiä vasemmalle, ladata vähiten merkitsevän tavun ja kiertää koko etumerkitöntä kokonaislukua 1 bitin vasemmalle oikealle, säilyttäen desimaaliosan arvo, joka osoittaa LSB (vähiten merkitsevä bitti) soveltaa sitä myöhemmin.
Loogisesti 1 lux tai 4 lux -tiloissa on tarpeen käyttää etumerkittömiä kokonaislukuja (unsigned int
) mitä varten Työläs älä varaa MSB (merkittävin bitti) etumerkille ja pystyä toimimaan suoraan mittauksen todellisen arvon kanssa, ei negatiivisen luvun kanssa. Sisään Arduino Duetti ei ole välttämätöntä, koska kokonaisluvut käyttävät 32 bittiä, mutta sama ohjelma toimii myös jos sitä käytetään unsigned int
.
Seuraava koodi näyttää kuinka 0,5 luksia käytetään
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”);
}
}
}
|
Lataa asiakirjat esimerkkeihin ympäristön valon mittaamisesta BH1750-anturilla ja Arduinolla.
Post Comment