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.
BH1750.cpp
- Committer:
- mmdonatti
- Date:
- 2019-09-13
- Revision:
- 3:3c15665641ff
- Parent:
- 1:4a02a8fbf021
- Child:
- 5:04cdce6242a6
File content as of revision 3:3c15665641ff:
/* * mbed library program * light intensity sensor module with built-in a 16 bit AD converter generating digital signal. * BH1750 by ROHM Co.,Ltd. * * 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/ */ #include "BH1750.h" BH1750::BH1750 (PinName p_sda, PinName p_scl) : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) { BH1750_addr = BH1750_G_CHIP_ADDR; init(); } BH1750::BH1750 (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) { BH1750_addr = addr; init(); } BH1750::BH1750 (I2C& p_i2c) : _i2c(p_i2c) { BH1750_addr = BH1750_G_CHIP_ADDR; init(); } BH1750::BH1750 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c) { BH1750_addr = addr; init(); } /////////////// Read Lux from sensor ////////////////////// float BH1750::lux() { float lux; _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; } /////////////// Initialize //////////////////////////////// void BH1750::init() { _i2c.frequency(100000); power_up(); //sensitivity = SENS_1R00; //NEED to call one set mode after init //set_sensitivity(sensitivity); } /////////////// Timing Register /////////////////////////// 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 _i2c.write((int)BH1750_addr, (char *)dt, 1, false); dt[0] = CMD_C_H_RES_M; // Measurement mode: High Resolution _i2c.write((int)BH1750_addr, (char *)dt, 1, false); 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() { dt[0] = CMD_PWR_UP; _i2c.write((int)BH1750_addr, (char *)dt, 1, false); } void BH1750::power_down() { dt[0] = CMD_PWR_DWN; _i2c.write((int)BH1750_addr, (char *)dt, 1, false); } /////////////// I2C Freq. ///////////////////////////////// void BH1750::frequency(int hz) { _i2c.frequency(hz); }