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.

Committer:
mmdonatti
Date:
Mon Jan 17 12:55:09 2022 +0000
Revision:
5:04cdce6242a6
Parent:
3:3c15665641ff
new methods for triggering and single acquisitions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:d95f6ac4c8d6 1 /*
kenjiArai 0:d95f6ac4c8d6 2 * mbed library program
kenjiArai 0:d95f6ac4c8d6 3 * light intensity sensor module with built-in a 16 bit AD converter generating digital signal.
kenjiArai 0:d95f6ac4c8d6 4 * BH1750 by ROHM Co.,Ltd.
kenjiArai 0:d95f6ac4c8d6 5 *
mmdonatti 3:3c15665641ff 6 * Copyright (c) 2019, Mauricio Donatti / LNLS (Brazilian Synchrotron Light Source
mmdonatti 3:3c15665641ff 7 * https://os.mbed.com/users/mmdonatti/
mmdonatti 3:3c15665641ff 8 * https://www.linkedin.com/in/mauriciodonatti
mmdonatti 3:3c15665641ff 9 * Created: September 2019
mmdonatti 3:3c15665641ff 10 * Revised: September 2019
mmdonatti 3:3c15665641ff 11 */
mmdonatti 3:3c15665641ff 12 /*
mmdonatti 3:3c15665641ff 13 *---------------- REFERENCE ----------------------------------------------------------------------
mmdonatti 3:3c15665641ff 14 * Original Information
mmdonatti 3:3c15665641ff 15 * http://www.rohm.co.jp/web/japan/products/-/product/BH1750FVI
mmdonatti 3:3c15665641ff 16 * Device kit
mmdonatti 3:3c15665641ff 17 * http://www.aitendo.com/product/10240
mmdonatti 3:3c15665641ff 18 * Initial Credits to Kenji Arai / JH1PJL (Forked from Kenji's library)
kenjiArai 0:d95f6ac4c8d6 19 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:d95f6ac4c8d6 20 * http://mbed.org/users/kenjiArai/
kenjiArai 0:d95f6ac4c8d6 21 */
kenjiArai 0:d95f6ac4c8d6 22
kenjiArai 0:d95f6ac4c8d6 23 #include "BH1750.h"
kenjiArai 0:d95f6ac4c8d6 24
kenjiArai 1:4a02a8fbf021 25 BH1750::BH1750 (PinName p_sda, PinName p_scl)
kenjiArai 1:4a02a8fbf021 26 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:d95f6ac4c8d6 27 {
kenjiArai 0:d95f6ac4c8d6 28 BH1750_addr = BH1750_G_CHIP_ADDR;
kenjiArai 0:d95f6ac4c8d6 29 init();
kenjiArai 0:d95f6ac4c8d6 30 }
kenjiArai 0:d95f6ac4c8d6 31
kenjiArai 1:4a02a8fbf021 32 BH1750::BH1750 (PinName p_sda, PinName p_scl, uint8_t addr)
kenjiArai 1:4a02a8fbf021 33 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:d95f6ac4c8d6 34 {
kenjiArai 0:d95f6ac4c8d6 35 BH1750_addr = addr;
kenjiArai 0:d95f6ac4c8d6 36 init();
kenjiArai 0:d95f6ac4c8d6 37 }
kenjiArai 0:d95f6ac4c8d6 38
kenjiArai 1:4a02a8fbf021 39 BH1750::BH1750 (I2C& p_i2c)
kenjiArai 1:4a02a8fbf021 40 : _i2c(p_i2c)
kenjiArai 0:d95f6ac4c8d6 41 {
kenjiArai 0:d95f6ac4c8d6 42 BH1750_addr = BH1750_G_CHIP_ADDR;
kenjiArai 0:d95f6ac4c8d6 43 init();
kenjiArai 0:d95f6ac4c8d6 44 }
kenjiArai 0:d95f6ac4c8d6 45
kenjiArai 1:4a02a8fbf021 46 BH1750::BH1750 (I2C& p_i2c, uint8_t addr)
kenjiArai 1:4a02a8fbf021 47 : _i2c(p_i2c)
kenjiArai 0:d95f6ac4c8d6 48 {
kenjiArai 0:d95f6ac4c8d6 49 BH1750_addr = addr;
kenjiArai 0:d95f6ac4c8d6 50 init();
kenjiArai 0:d95f6ac4c8d6 51 }
kenjiArai 0:d95f6ac4c8d6 52
kenjiArai 0:d95f6ac4c8d6 53 /////////////// Read Lux from sensor //////////////////////
kenjiArai 0:d95f6ac4c8d6 54 float BH1750::lux()
kenjiArai 0:d95f6ac4c8d6 55 {
kenjiArai 0:d95f6ac4c8d6 56 float lux;
kenjiArai 0:d95f6ac4c8d6 57
kenjiArai 0:d95f6ac4c8d6 58 _i2c.read(BH1750_addr, (char *)dt, 2, false);
kenjiArai 0:d95f6ac4c8d6 59 lux = (float)(dt[0] << 8 | dt[1]);
mmdonatti 3:3c15665641ff 60 lux = lux / 1.2f * ((float)sensitivity/69)/Hres;
kenjiArai 0:d95f6ac4c8d6 61 return lux;
kenjiArai 0:d95f6ac4c8d6 62 }
kenjiArai 0:d95f6ac4c8d6 63
mmdonatti 5:04cdce6242a6 64 void BH1750::high_resolution2_trigger()
mmdonatti 5:04cdce6242a6 65 {
mmdonatti 5:04cdce6242a6 66 dt[0] = CMD_1_H_RES_M2; // Measurement mode: Single High Resolution 2
mmdonatti 5:04cdce6242a6 67 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 68 }
mmdonatti 5:04cdce6242a6 69
mmdonatti 5:04cdce6242a6 70 float BH1750::high_resolution2_read()
mmdonatti 5:04cdce6242a6 71 {
mmdonatti 5:04cdce6242a6 72 float lux;
mmdonatti 5:04cdce6242a6 73 Hres=2;
mmdonatti 5:04cdce6242a6 74
mmdonatti 5:04cdce6242a6 75 _i2c.read(BH1750_addr, (char *)dt, 2, false);
mmdonatti 5:04cdce6242a6 76 lux = (float)(dt[0] << 8 | dt[1]);
mmdonatti 5:04cdce6242a6 77 lux = lux / 1.2f * ((float)sensitivity/69)/Hres;
mmdonatti 5:04cdce6242a6 78 return lux;
mmdonatti 5:04cdce6242a6 79 }
mmdonatti 5:04cdce6242a6 80
mmdonatti 5:04cdce6242a6 81
mmdonatti 5:04cdce6242a6 82 float BH1750::high_resolution2_trigger_read()
mmdonatti 5:04cdce6242a6 83 {
mmdonatti 5:04cdce6242a6 84 high_resolution2_trigger();
mmdonatti 5:04cdce6242a6 85 wait_ms(180); // wait 180ms
mmdonatti 5:04cdce6242a6 86 return high_resolution2_read();
mmdonatti 5:04cdce6242a6 87 }
mmdonatti 5:04cdce6242a6 88
mmdonatti 5:04cdce6242a6 89 void BH1750::high_resolution_trigger(){
mmdonatti 5:04cdce6242a6 90 dt[0] = CMD_1_H_RES_M; // Measurement mode: Single High Resolution 2
mmdonatti 5:04cdce6242a6 91 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 92 }
mmdonatti 5:04cdce6242a6 93
mmdonatti 5:04cdce6242a6 94 float BH1750::high_resolution_read(){
mmdonatti 5:04cdce6242a6 95
mmdonatti 5:04cdce6242a6 96 float lux;
mmdonatti 5:04cdce6242a6 97 Hres=1;
mmdonatti 5:04cdce6242a6 98 _i2c.read(BH1750_addr, (char *)dt, 2, false);
mmdonatti 5:04cdce6242a6 99 lux = (float)(dt[0] << 8 | dt[1]);
mmdonatti 5:04cdce6242a6 100 lux = lux / 1.2f * ((float)sensitivity/69)/Hres;
mmdonatti 5:04cdce6242a6 101 return lux;
mmdonatti 5:04cdce6242a6 102 }
mmdonatti 5:04cdce6242a6 103
mmdonatti 5:04cdce6242a6 104
mmdonatti 5:04cdce6242a6 105 float BH1750::high_resolution_trigger_read(){
mmdonatti 5:04cdce6242a6 106 high_resolution_trigger();
mmdonatti 5:04cdce6242a6 107 wait_ms(180); // wait 180ms
mmdonatti 5:04cdce6242a6 108 return high_resolution_read();
mmdonatti 5:04cdce6242a6 109 }
mmdonatti 5:04cdce6242a6 110
mmdonatti 5:04cdce6242a6 111 void BH1750::low_resolution_trigger(){
mmdonatti 5:04cdce6242a6 112 dt[0] = CMD_1_L_RES_M; // Measurement mode: Single High Resolution 2
mmdonatti 5:04cdce6242a6 113 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 114 }
mmdonatti 5:04cdce6242a6 115
mmdonatti 5:04cdce6242a6 116 float BH1750::low_resolution_read(){
mmdonatti 5:04cdce6242a6 117 float lux;
mmdonatti 5:04cdce6242a6 118 _i2c.read(BH1750_addr, (char *)dt, 2, false);
mmdonatti 5:04cdce6242a6 119 lux = (float)(dt[0] << 8 | dt[1]);
mmdonatti 5:04cdce6242a6 120 lux = lux / 1.2f;
mmdonatti 5:04cdce6242a6 121 return lux;
mmdonatti 5:04cdce6242a6 122 }
mmdonatti 5:04cdce6242a6 123
mmdonatti 5:04cdce6242a6 124 float BH1750::low_resolution_trigger_read(){
mmdonatti 5:04cdce6242a6 125 low_resolution_trigger();
mmdonatti 5:04cdce6242a6 126 wait_ms(24);
mmdonatti 5:04cdce6242a6 127 return low_resolution_read();
mmdonatti 5:04cdce6242a6 128 }
mmdonatti 5:04cdce6242a6 129
kenjiArai 0:d95f6ac4c8d6 130 /////////////// Initialize ////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 131 void BH1750::init()
kenjiArai 0:d95f6ac4c8d6 132 {
kenjiArai 0:d95f6ac4c8d6 133 _i2c.frequency(100000);
mmdonatti 5:04cdce6242a6 134 power_up();
mmdonatti 5:04cdce6242a6 135 set_sensitivity(SENS_2);
mmdonatti 5:04cdce6242a6 136 }
mmdonatti 5:04cdce6242a6 137
mmdonatti 5:04cdce6242a6 138 /////////////// set sensitivity ////////////////////////////////
mmdonatti 5:04cdce6242a6 139 void BH1750::set_sensitivity(uint8_t parameter)
mmdonatti 5:04cdce6242a6 140 {
mmdonatti 5:04cdce6242a6 141 if (parameter > SENS_4){
mmdonatti 5:04cdce6242a6 142 parameter = SENS_4;
mmdonatti 5:04cdce6242a6 143 } else if (parameter < SENS_0){
mmdonatti 5:04cdce6242a6 144 parameter = SENS_0;
mmdonatti 5:04cdce6242a6 145 }
mmdonatti 5:04cdce6242a6 146 sensitivity = parameter;
mmdonatti 5:04cdce6242a6 147 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
mmdonatti 5:04cdce6242a6 148 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 149 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
mmdonatti 5:04cdce6242a6 150 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 151 }
kenjiArai 0:d95f6ac4c8d6 152
kenjiArai 0:d95f6ac4c8d6 153 /////////////// Timing Register ///////////////////////////
mmdonatti 5:04cdce6242a6 154 void BH1750::set_high_resolution_continuous(uint8_t parameter)
kenjiArai 0:d95f6ac4c8d6 155 {
mmdonatti 5:04cdce6242a6 156 if (parameter > SENS_4){
mmdonatti 5:04cdce6242a6 157 parameter = SENS_4;
mmdonatti 5:04cdce6242a6 158 } else if (parameter < SENS_0){
mmdonatti 5:04cdce6242a6 159 parameter = SENS_0;
kenjiArai 0:d95f6ac4c8d6 160 }
mmdonatti 3:3c15665641ff 161 sensitivity = parameter;
mmdonatti 3:3c15665641ff 162 Hres = 1;
kenjiArai 0:d95f6ac4c8d6 163 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
kenjiArai 0:d95f6ac4c8d6 164 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 165 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
kenjiArai 0:d95f6ac4c8d6 166 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 167 dt[0] = CMD_C_H_RES_M; // Measurement mode: High Resolution
kenjiArai 0:d95f6ac4c8d6 168 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 169 wait_ms(240); // need normal conversion time(120mS) x 2
kenjiArai 0:d95f6ac4c8d6 170 }
kenjiArai 0:d95f6ac4c8d6 171
mmdonatti 5:04cdce6242a6 172 void BH1750::set_high_resolution2_continuous(uint8_t parameter)
mmdonatti 3:3c15665641ff 173 {
mmdonatti 5:04cdce6242a6 174 if (parameter > SENS_4){
mmdonatti 5:04cdce6242a6 175 parameter = SENS_4;
mmdonatti 5:04cdce6242a6 176 } else if (parameter < SENS_0){
mmdonatti 5:04cdce6242a6 177 parameter = SENS_0;
mmdonatti 3:3c15665641ff 178 }
mmdonatti 3:3c15665641ff 179 sensitivity = parameter;
mmdonatti 3:3c15665641ff 180 Hres = 2;
mmdonatti 3:3c15665641ff 181 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
mmdonatti 3:3c15665641ff 182 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 3:3c15665641ff 183 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
mmdonatti 3:3c15665641ff 184 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 3:3c15665641ff 185 dt[0] = CMD_C_H_RES_M2; // Measurement mode: High Resolution 2
mmdonatti 3:3c15665641ff 186 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 3:3c15665641ff 187 wait_ms(240); // need normal conversion time(120mS) x 2
mmdonatti 3:3c15665641ff 188 }
mmdonatti 3:3c15665641ff 189
mmdonatti 5:04cdce6242a6 190 void BH1750::set_low_resolution_continuous(uint8_t parameter)
mmdonatti 5:04cdce6242a6 191 {
mmdonatti 5:04cdce6242a6 192 if (parameter > SENS_4){
mmdonatti 5:04cdce6242a6 193 parameter = SENS_4;
mmdonatti 5:04cdce6242a6 194 } else if (parameter < SENS_0){
mmdonatti 5:04cdce6242a6 195 parameter = SENS_0;
mmdonatti 5:04cdce6242a6 196 }
mmdonatti 5:04cdce6242a6 197 sensitivity = parameter;
mmdonatti 5:04cdce6242a6 198 Hres = 2;
mmdonatti 5:04cdce6242a6 199 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
mmdonatti 5:04cdce6242a6 200 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 201 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
mmdonatti 5:04cdce6242a6 202 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 203 dt[0] = CMD_C_L_RES_M; // Measurement mode: High Resolution 2
mmdonatti 5:04cdce6242a6 204 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 205 wait_ms(240); // need normal conversion time(120mS) x 2
mmdonatti 5:04cdce6242a6 206 }
mmdonatti 5:04cdce6242a6 207
kenjiArai 0:d95f6ac4c8d6 208 /////////////// Power ON/OFF //////////////////////////////
kenjiArai 0:d95f6ac4c8d6 209 void BH1750::power_up()
kenjiArai 0:d95f6ac4c8d6 210 {
kenjiArai 0:d95f6ac4c8d6 211 dt[0] = CMD_PWR_UP;
kenjiArai 0:d95f6ac4c8d6 212 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 213 }
kenjiArai 0:d95f6ac4c8d6 214
kenjiArai 0:d95f6ac4c8d6 215 void BH1750::power_down()
kenjiArai 0:d95f6ac4c8d6 216 {
kenjiArai 0:d95f6ac4c8d6 217 dt[0] = CMD_PWR_DWN;
kenjiArai 0:d95f6ac4c8d6 218 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 219 }
kenjiArai 0:d95f6ac4c8d6 220
kenjiArai 0:d95f6ac4c8d6 221 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 222 void BH1750::frequency(int hz)
kenjiArai 0:d95f6ac4c8d6 223 {
kenjiArai 0:d95f6ac4c8d6 224 _i2c.frequency(hz);
kenjiArai 0:d95f6ac4c8d6 225 }
kenjiArai 1:4a02a8fbf021 226
mmdonatti 5:04cdce6242a6 227 /////////////// Power ON/OFF //////////////////////////////
mmdonatti 5:04cdce6242a6 228 void BH1750::reset()
mmdonatti 5:04cdce6242a6 229 {
mmdonatti 5:04cdce6242a6 230 dt[0] = CMD_RESET;
mmdonatti 5:04cdce6242a6 231 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 5:04cdce6242a6 232 }
kenjiArai 1:4a02a8fbf021 233
mmdonatti 5:04cdce6242a6 234