Aparte de las resistencias LDR, que varían su resistencia según la luz que incide sobre ellas, también existen sensores de luz mas precisos y que devuelven la lectura obtenida en una unidad de medida estándar, en este caso en Lux.
El sensor que nos ocupa, el BH1750FVI, es un sensor digital que se comunica por I2C, permite obtener una lectura de 1 a 65.535 lux con una precisión de 1 lux, aunque según como se configure el sensor se puede cambiar la precisión a 0,5, 1 y 4 lux para aumentar así el rango de lectura, según el datasheet a 4 lux la medida leída puede ser de hasta 100.000 lux.
Para su funcionamiento puede emplearse este código:
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 49 50 51 |
#include <Wire.h> //IIC #include <math.h> int BH1750address = 0x23; byte buff[2]; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { uint16_t val; BH1750_Init(BH1750address); delay(200); if(2==BH1750_Read(BH1750address)) { val=((buff[0]<<8)|buff[1])/1.2; Serial.print(val,DEC); Serial.println("[lx]"); } delay(150); } int BH1750_Read(int address) { int i=0; Wire.beginTransmission(address); Wire.requestFrom(address, 2); while(Wire.available()) { buff[i] = Wire.read(); // receive one byte i++; } Wire.endTransmission(); return i; } void BH1750_Init(int address) { Wire.beginTransmission(address); Wire.write(0x10);//1lx reolution 120ms Wire.endTransmission(); } |
O esta librería de Christopher Laws que se emplea tal que así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <Wire.h> #include <BH1750.h> BH1750 lightMeter; void setup() { Serial.begin(9600); while(!Serial); lightMeter.begin(); lightMeter.configure(BH1750_CONTINUOUS_LOW_RES_MODE); } void loop() { unsigned short lux = lightMeter.readLightLevel(); Serial.print("Luz: "); Serial.print(lux); Serial.println(" lux"); delay(1000); } |