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.

Files at this revision

API Documentation at this revision

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
--- 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);
+}
 
+
--- 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;