Digital 16bit Serial Output Type Ambient Light Sensor IC by ROHM, Ambient light sensor (Illuminance to digital converter). Forked from Kenji Arai BH1750, minor changes.
Revision 5:04cdce6242a6, committed 2022-01-17
- Comitter:
- mmdonatti
- Date:
- Mon Jan 17 12:55:09 2022 +0000
- Parent:
- 4:47d7e70dc9b8
- Commit message:
- new methods for triggering and single acquisitions
Changed in this revision
BH1750.cpp | Show annotated file Show diff for this revision Revisions of this file |
BH1750.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 47d7e70dc9b8 -r 04cdce6242a6 BH1750.cpp --- a/BH1750.cpp Fri Sep 13 14:22:17 2019 +0000 +++ b/BH1750.cpp Mon Jan 17 12:55:09 2022 +0000 @@ -61,23 +61,102 @@ return lux; } +void BH1750::high_resolution2_trigger() +{ + dt[0] = CMD_1_H_RES_M2; // Measurement mode: Single High Resolution 2 + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); +} + +float BH1750::high_resolution2_read() +{ + float lux; + Hres=2; + + _i2c.read(BH1750_addr, (char *)dt, 2, false); + lux = (float)(dt[0] << 8 | dt[1]); + lux = lux / 1.2f * ((float)sensitivity/69)/Hres; + return lux; +} + + +float BH1750::high_resolution2_trigger_read() +{ + high_resolution2_trigger(); + wait_ms(180); // wait 180ms + return high_resolution2_read(); +} + +void BH1750::high_resolution_trigger(){ + dt[0] = CMD_1_H_RES_M; // Measurement mode: Single High Resolution 2 + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); +} + +float BH1750::high_resolution_read(){ + + float lux; + Hres=1; + _i2c.read(BH1750_addr, (char *)dt, 2, false); + lux = (float)(dt[0] << 8 | dt[1]); + lux = lux / 1.2f * ((float)sensitivity/69)/Hres; + return lux; +} + + +float BH1750::high_resolution_trigger_read(){ + high_resolution_trigger(); + wait_ms(180); // wait 180ms + return high_resolution_read(); +} + +void BH1750::low_resolution_trigger(){ + dt[0] = CMD_1_L_RES_M; // Measurement mode: Single High Resolution 2 + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); +} + +float BH1750::low_resolution_read(){ + float lux; + _i2c.read(BH1750_addr, (char *)dt, 2, false); + lux = (float)(dt[0] << 8 | dt[1]); + lux = lux / 1.2f; + return lux; +} + +float BH1750::low_resolution_trigger_read(){ + low_resolution_trigger(); + wait_ms(24); + return low_resolution_read(); +} + /////////////// Initialize //////////////////////////////// void BH1750::init() { _i2c.frequency(100000); - power_up(); - //sensitivity = SENS_1R00; - //NEED to call one set mode after init - //set_sensitivity(sensitivity); + power_up(); + set_sensitivity(SENS_2); +} + +/////////////// set sensitivity //////////////////////////////// +void BH1750::set_sensitivity(uint8_t parameter) +{ + if (parameter > SENS_4){ + parameter = SENS_4; + } else if (parameter < SENS_0){ + parameter = SENS_0; + } + sensitivity = parameter; + dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); + dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); } /////////////// Timing Register /////////////////////////// -void BH1750::set_high_resolution(uint8_t parameter) +void BH1750::set_high_resolution_continuous(uint8_t parameter) { - if (parameter > SENS_3R68){ - parameter = SENS_3R68; - } else if (parameter < SENS_0R45){ - parameter = SENS_0R45; + if (parameter > SENS_4){ + parameter = SENS_4; + } else if (parameter < SENS_0){ + parameter = SENS_0; } sensitivity = parameter; Hres = 1; @@ -90,13 +169,12 @@ wait_ms(240); // need normal conversion time(120mS) x 2 } -/////////////// Timing Register /////////////////////////// -void BH1750::set_high_resolution_2(uint8_t parameter) +void BH1750::set_high_resolution2_continuous(uint8_t parameter) { - if (parameter > SENS_3R68){ - parameter = SENS_3R68; - } else if (parameter < SENS_0R45){ - parameter = SENS_0R45; + if (parameter > SENS_4){ + parameter = SENS_4; + } else if (parameter < SENS_0){ + parameter = SENS_0; } sensitivity = parameter; Hres = 2; @@ -109,6 +187,24 @@ wait_ms(240); // need normal conversion time(120mS) x 2 } +void BH1750::set_low_resolution_continuous(uint8_t parameter) +{ + if (parameter > SENS_4){ + parameter = SENS_4; + } else if (parameter < SENS_0){ + parameter = SENS_0; + } + sensitivity = parameter; + Hres = 2; + dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); + dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); + dt[0] = CMD_C_L_RES_M; // Measurement mode: High Resolution 2 + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); + wait_ms(240); // need normal conversion time(120mS) x 2 +} + /////////////// Power ON/OFF ////////////////////////////// void BH1750::power_up() { @@ -128,4 +224,11 @@ _i2c.frequency(hz); } +/////////////// Power ON/OFF ////////////////////////////// +void BH1750::reset() +{ + dt[0] = CMD_RESET; + _i2c.write((int)BH1750_addr, (char *)dt, 1, false); +} +
diff -r 47d7e70dc9b8 -r 04cdce6242a6 BH1750.h --- a/BH1750.h Fri Sep 13 14:22:17 2019 +0000 +++ b/BH1750.h Mon Jan 17 12:55:09 2022 +0000 @@ -44,11 +44,11 @@ #define CMD_M_TIME_L 0x60 ////////////// SENSITIVITY //////////////////////////////// -#define SENS_1R00 69 //Default -#define SENS_3R68 254 //High Sensitivity -#define SENS_0R45 31 -#define SENS_2R00 138 -#define SENS_0R50 35 +#define SENS_2 69 //Default +#define SENS_4 254 //High Sensitivity +#define SENS_0 31 +#define SENS_3 138 +#define SENS_1 35 /** Interface for Luminosity sensor, BH1750 //@code @@ -94,23 +94,46 @@ * @return Lux */ float lux(void); + + void set_sensitivity(uint8_t parameter); + + float high_resolution2_trigger_read(); + + float high_resolution_trigger_read(); + + float low_resolution_trigger_read(); + + void high_resolution2_trigger(); + + void high_resolution_trigger(); + + void low_resolution_trigger(); + + float high_resolution2_read(); + + float high_resolution_read(); + + float low_resolution_read(); /** Set sensor to high resolution mode * @param sensitivity parameter * @return none */ - void set_high_resolution(uint8_t parameter); + void set_high_resolution_continuous(uint8_t parameter); /** Set sensor to high resolution mode * @param sensitivity parameter * @return none */ - void set_high_resolution_2(uint8_t parameter); + void set_high_resolution2_continuous(uint8_t parameter); /** Set I2C clock frequency * @param freq. * @return none */ + + void set_low_resolution_continuous(uint8_t parameter); + void frequency(int hz); /** Power Up/Down @@ -119,6 +142,8 @@ */ void power_up(void); void power_down(void); + + void reset(void); protected: I2C *_i2c_p;