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:
3:3c15665641ff
Parent:
1:4a02a8fbf021
Child:
5:04cdce6242a6
--- a/BH1750.cpp	Thu Sep 12 10:51:25 2019 +0000
+++ b/BH1750.cpp	Fri Sep 13 12:51:31 2019 +0000
@@ -3,11 +3,21 @@
  *  light intensity sensor module with built-in a 16 bit AD converter generating digital signal.
  *  BH1750 by ROHM Co.,Ltd.
  *
- * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
+ * Copyright (c) 2019, Mauricio Donatti / LNLS (Brazilian Synchrotron Light Source
+ *  https://os.mbed.com/users/mmdonatti/
+ *  https://www.linkedin.com/in/mauriciodonatti
+ *      Created: September 2019
+ *      Revised: September 2019
+ */
+/*
+ *---------------- REFERENCE ----------------------------------------------------------------------
+ * Original Information
+ *  http://www.rohm.co.jp/web/japan/products/-/product/BH1750FVI
+ * Device kit
+ *  http://www.aitendo.com/product/10240
+ * Initial Credits to Kenji Arai / JH1PJL (Forked from Kenji's library)
  *  http://www.page.sannet.ne.jp/kenjia/index.html
  *  http://mbed.org/users/kenjiArai/
- *      Created: March       7th, 2015
- *      Revised: August     23rd, 2017
  */
 
 #include "BH1750.h"
@@ -47,7 +57,7 @@
 
     _i2c.read(BH1750_addr, (char *)dt, 2, false);
     lux = (float)(dt[0] << 8 | dt[1]);
-    lux = lux / 1.2f * ((float)sensitivity/69);
+    lux = lux / 1.2f * ((float)sensitivity/69)/Hres;
     return lux;
 }
 
@@ -56,18 +66,21 @@
 {
     _i2c.frequency(100000);
     power_up();
-    sensitivity = SENS_1R00;
-    set_sensitivity(sensitivity);
+    //sensitivity = SENS_1R00;
+    //NEED to call one set mode after init
+    //set_sensitivity(sensitivity);
 }
 
 /////////////// Timing Register ///////////////////////////
-void BH1750::set_sensitivity(uint8_t parameter)
+void BH1750::set_high_resolution(uint8_t parameter)
 {
     if (parameter > SENS_3R68){
         parameter = SENS_3R68;
     } else if (parameter < SENS_0R45){
         parameter = SENS_0R45;
     }
+    sensitivity = parameter;
+    Hres = 1;
     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
@@ -77,6 +90,25 @@
     wait_ms(240);   // need normal conversion time(120mS) x 2
 }
 
+/////////////// Timing Register ///////////////////////////
+void BH1750::set_high_resolution_2(uint8_t parameter)
+{
+    if (parameter > SENS_3R68){
+        parameter = SENS_3R68;
+    } else if (parameter < SENS_0R45){
+        parameter = SENS_0R45;
+    }
+    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_H_RES_M2;      // 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()
 {