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:
Fri Sep 13 12:51:31 2019 +0000
Revision:
3:3c15665641ff
Parent:
1:4a02a8fbf021
Child:
5:04cdce6242a6
High Resolution Mode 2 added to library

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
kenjiArai 0:d95f6ac4c8d6 64 /////////////// Initialize ////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 65 void BH1750::init()
kenjiArai 0:d95f6ac4c8d6 66 {
kenjiArai 0:d95f6ac4c8d6 67 _i2c.frequency(100000);
kenjiArai 0:d95f6ac4c8d6 68 power_up();
mmdonatti 3:3c15665641ff 69 //sensitivity = SENS_1R00;
mmdonatti 3:3c15665641ff 70 //NEED to call one set mode after init
mmdonatti 3:3c15665641ff 71 //set_sensitivity(sensitivity);
kenjiArai 0:d95f6ac4c8d6 72 }
kenjiArai 0:d95f6ac4c8d6 73
kenjiArai 0:d95f6ac4c8d6 74 /////////////// Timing Register ///////////////////////////
mmdonatti 3:3c15665641ff 75 void BH1750::set_high_resolution(uint8_t parameter)
kenjiArai 0:d95f6ac4c8d6 76 {
kenjiArai 0:d95f6ac4c8d6 77 if (parameter > SENS_3R68){
kenjiArai 0:d95f6ac4c8d6 78 parameter = SENS_3R68;
kenjiArai 0:d95f6ac4c8d6 79 } else if (parameter < SENS_0R45){
kenjiArai 0:d95f6ac4c8d6 80 parameter = SENS_0R45;
kenjiArai 0:d95f6ac4c8d6 81 }
mmdonatti 3:3c15665641ff 82 sensitivity = parameter;
mmdonatti 3:3c15665641ff 83 Hres = 1;
kenjiArai 0:d95f6ac4c8d6 84 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
kenjiArai 0:d95f6ac4c8d6 85 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 86 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
kenjiArai 0:d95f6ac4c8d6 87 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 88 dt[0] = CMD_C_H_RES_M; // Measurement mode: High Resolution
kenjiArai 0:d95f6ac4c8d6 89 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 90 wait_ms(240); // need normal conversion time(120mS) x 2
kenjiArai 0:d95f6ac4c8d6 91 }
kenjiArai 0:d95f6ac4c8d6 92
mmdonatti 3:3c15665641ff 93 /////////////// Timing Register ///////////////////////////
mmdonatti 3:3c15665641ff 94 void BH1750::set_high_resolution_2(uint8_t parameter)
mmdonatti 3:3c15665641ff 95 {
mmdonatti 3:3c15665641ff 96 if (parameter > SENS_3R68){
mmdonatti 3:3c15665641ff 97 parameter = SENS_3R68;
mmdonatti 3:3c15665641ff 98 } else if (parameter < SENS_0R45){
mmdonatti 3:3c15665641ff 99 parameter = SENS_0R45;
mmdonatti 3:3c15665641ff 100 }
mmdonatti 3:3c15665641ff 101 sensitivity = parameter;
mmdonatti 3:3c15665641ff 102 Hres = 2;
mmdonatti 3:3c15665641ff 103 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
mmdonatti 3:3c15665641ff 104 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 3:3c15665641ff 105 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
mmdonatti 3:3c15665641ff 106 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 3:3c15665641ff 107 dt[0] = CMD_C_H_RES_M2; // Measurement mode: High Resolution 2
mmdonatti 3:3c15665641ff 108 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
mmdonatti 3:3c15665641ff 109 wait_ms(240); // need normal conversion time(120mS) x 2
mmdonatti 3:3c15665641ff 110 }
mmdonatti 3:3c15665641ff 111
kenjiArai 0:d95f6ac4c8d6 112 /////////////// Power ON/OFF //////////////////////////////
kenjiArai 0:d95f6ac4c8d6 113 void BH1750::power_up()
kenjiArai 0:d95f6ac4c8d6 114 {
kenjiArai 0:d95f6ac4c8d6 115 dt[0] = CMD_PWR_UP;
kenjiArai 0:d95f6ac4c8d6 116 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 117 }
kenjiArai 0:d95f6ac4c8d6 118
kenjiArai 0:d95f6ac4c8d6 119 void BH1750::power_down()
kenjiArai 0:d95f6ac4c8d6 120 {
kenjiArai 0:d95f6ac4c8d6 121 dt[0] = CMD_PWR_DWN;
kenjiArai 0:d95f6ac4c8d6 122 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 123 }
kenjiArai 0:d95f6ac4c8d6 124
kenjiArai 0:d95f6ac4c8d6 125 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 126 void BH1750::frequency(int hz)
kenjiArai 0:d95f6ac4c8d6 127 {
kenjiArai 0:d95f6ac4c8d6 128 _i2c.frequency(hz);
kenjiArai 0:d95f6ac4c8d6 129 }
kenjiArai 1:4a02a8fbf021 130
kenjiArai 1:4a02a8fbf021 131