Digital 16bit Serial Output Type Ambient Light Sensor IC by ROHM, Ambient light sensor (Illuminance to digital converter)

Committer:
kenjiArai
Date:
Wed Aug 23 09:21:39 2017 +0000
Revision:
1:4a02a8fbf021
Parent:
0:d95f6ac4c8d6
countermeasure for  NonCopyable

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 *
kenjiArai 1:4a02a8fbf021 6 * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
kenjiArai 0:d95f6ac4c8d6 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:d95f6ac4c8d6 8 * http://mbed.org/users/kenjiArai/
kenjiArai 1:4a02a8fbf021 9 * Created: March 7th, 2015
kenjiArai 1:4a02a8fbf021 10 * Revised: August 23rd, 2017
kenjiArai 0:d95f6ac4c8d6 11 */
kenjiArai 0:d95f6ac4c8d6 12
kenjiArai 0:d95f6ac4c8d6 13 #include "BH1750.h"
kenjiArai 0:d95f6ac4c8d6 14
kenjiArai 1:4a02a8fbf021 15 BH1750::BH1750 (PinName p_sda, PinName p_scl)
kenjiArai 1:4a02a8fbf021 16 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:d95f6ac4c8d6 17 {
kenjiArai 0:d95f6ac4c8d6 18 BH1750_addr = BH1750_G_CHIP_ADDR;
kenjiArai 0:d95f6ac4c8d6 19 init();
kenjiArai 0:d95f6ac4c8d6 20 }
kenjiArai 0:d95f6ac4c8d6 21
kenjiArai 1:4a02a8fbf021 22 BH1750::BH1750 (PinName p_sda, PinName p_scl, uint8_t addr)
kenjiArai 1:4a02a8fbf021 23 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:d95f6ac4c8d6 24 {
kenjiArai 0:d95f6ac4c8d6 25 BH1750_addr = addr;
kenjiArai 0:d95f6ac4c8d6 26 init();
kenjiArai 0:d95f6ac4c8d6 27 }
kenjiArai 0:d95f6ac4c8d6 28
kenjiArai 1:4a02a8fbf021 29 BH1750::BH1750 (I2C& p_i2c)
kenjiArai 1:4a02a8fbf021 30 : _i2c(p_i2c)
kenjiArai 0:d95f6ac4c8d6 31 {
kenjiArai 0:d95f6ac4c8d6 32 BH1750_addr = BH1750_G_CHIP_ADDR;
kenjiArai 0:d95f6ac4c8d6 33 init();
kenjiArai 0:d95f6ac4c8d6 34 }
kenjiArai 0:d95f6ac4c8d6 35
kenjiArai 1:4a02a8fbf021 36 BH1750::BH1750 (I2C& p_i2c, uint8_t addr)
kenjiArai 1:4a02a8fbf021 37 : _i2c(p_i2c)
kenjiArai 0:d95f6ac4c8d6 38 {
kenjiArai 0:d95f6ac4c8d6 39 BH1750_addr = addr;
kenjiArai 0:d95f6ac4c8d6 40 init();
kenjiArai 0:d95f6ac4c8d6 41 }
kenjiArai 0:d95f6ac4c8d6 42
kenjiArai 0:d95f6ac4c8d6 43 /////////////// Read Lux from sensor //////////////////////
kenjiArai 0:d95f6ac4c8d6 44 float BH1750::lux()
kenjiArai 0:d95f6ac4c8d6 45 {
kenjiArai 0:d95f6ac4c8d6 46 float lux;
kenjiArai 0:d95f6ac4c8d6 47
kenjiArai 0:d95f6ac4c8d6 48 _i2c.read(BH1750_addr, (char *)dt, 2, false);
kenjiArai 0:d95f6ac4c8d6 49 lux = (float)(dt[0] << 8 | dt[1]);
kenjiArai 1:4a02a8fbf021 50 lux = lux / 1.2f * ((float)sensitivity/69);
kenjiArai 0:d95f6ac4c8d6 51 return lux;
kenjiArai 0:d95f6ac4c8d6 52 }
kenjiArai 0:d95f6ac4c8d6 53
kenjiArai 0:d95f6ac4c8d6 54 /////////////// Initialize ////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 55 void BH1750::init()
kenjiArai 0:d95f6ac4c8d6 56 {
kenjiArai 0:d95f6ac4c8d6 57 _i2c.frequency(100000);
kenjiArai 0:d95f6ac4c8d6 58 power_up();
kenjiArai 0:d95f6ac4c8d6 59 sensitivity = SENS_1R00;
kenjiArai 0:d95f6ac4c8d6 60 set_sensitivity(sensitivity);
kenjiArai 0:d95f6ac4c8d6 61 }
kenjiArai 0:d95f6ac4c8d6 62
kenjiArai 0:d95f6ac4c8d6 63 /////////////// Timing Register ///////////////////////////
kenjiArai 0:d95f6ac4c8d6 64 void BH1750::set_sensitivity(uint8_t parameter)
kenjiArai 0:d95f6ac4c8d6 65 {
kenjiArai 0:d95f6ac4c8d6 66 if (parameter > SENS_3R68){
kenjiArai 0:d95f6ac4c8d6 67 parameter = SENS_3R68;
kenjiArai 0:d95f6ac4c8d6 68 } else if (parameter < SENS_0R45){
kenjiArai 0:d95f6ac4c8d6 69 parameter = SENS_0R45;
kenjiArai 0:d95f6ac4c8d6 70 }
kenjiArai 0:d95f6ac4c8d6 71 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
kenjiArai 0:d95f6ac4c8d6 72 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 73 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
kenjiArai 0:d95f6ac4c8d6 74 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 75 dt[0] = CMD_C_H_RES_M; // Measurement mode: High Resolution
kenjiArai 0:d95f6ac4c8d6 76 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 77 wait_ms(240); // need normal conversion time(120mS) x 2
kenjiArai 0:d95f6ac4c8d6 78 }
kenjiArai 0:d95f6ac4c8d6 79
kenjiArai 0:d95f6ac4c8d6 80 /////////////// Power ON/OFF //////////////////////////////
kenjiArai 0:d95f6ac4c8d6 81 void BH1750::power_up()
kenjiArai 0:d95f6ac4c8d6 82 {
kenjiArai 0:d95f6ac4c8d6 83 dt[0] = CMD_PWR_UP;
kenjiArai 0:d95f6ac4c8d6 84 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 85 }
kenjiArai 0:d95f6ac4c8d6 86
kenjiArai 0:d95f6ac4c8d6 87 void BH1750::power_down()
kenjiArai 0:d95f6ac4c8d6 88 {
kenjiArai 0:d95f6ac4c8d6 89 dt[0] = CMD_PWR_DWN;
kenjiArai 0:d95f6ac4c8d6 90 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 91 }
kenjiArai 0:d95f6ac4c8d6 92
kenjiArai 0:d95f6ac4c8d6 93 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 94 void BH1750::frequency(int hz)
kenjiArai 0:d95f6ac4c8d6 95 {
kenjiArai 0:d95f6ac4c8d6 96 _i2c.frequency(hz);
kenjiArai 0:d95f6ac4c8d6 97 }
kenjiArai 1:4a02a8fbf021 98
kenjiArai 1:4a02a8fbf021 99