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

Committer:
kenjiArai
Date:
Sat Mar 07 23:44:42 2015 +0000
Revision:
0:d95f6ac4c8d6
Child:
1:4a02a8fbf021
Digital 16bit Serial Output Type Ambient Light Sensor IC by ROHM,  Ambient light sensor (Illuminance to digital converter)

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 0:d95f6ac4c8d6 6 * Copyright (c) 2015 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 0:d95f6ac4c8d6 9 * Created: March 7th, 2015
kenjiArai 0:d95f6ac4c8d6 10 * Revised: March 8th, 2015
kenjiArai 0:d95f6ac4c8d6 11 *
kenjiArai 0:d95f6ac4c8d6 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:d95f6ac4c8d6 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:d95f6ac4c8d6 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:d95f6ac4c8d6 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:d95f6ac4c8d6 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:d95f6ac4c8d6 17 */
kenjiArai 0:d95f6ac4c8d6 18
kenjiArai 0:d95f6ac4c8d6 19 #include "BH1750.h"
kenjiArai 0:d95f6ac4c8d6 20
kenjiArai 0:d95f6ac4c8d6 21 BH1750::BH1750 (PinName p_sda, PinName p_scl) : _i2c(p_sda, p_scl)
kenjiArai 0:d95f6ac4c8d6 22 {
kenjiArai 0:d95f6ac4c8d6 23 BH1750_addr = BH1750_G_CHIP_ADDR;
kenjiArai 0:d95f6ac4c8d6 24 init();
kenjiArai 0:d95f6ac4c8d6 25 }
kenjiArai 0:d95f6ac4c8d6 26
kenjiArai 0:d95f6ac4c8d6 27 BH1750::BH1750 (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl)
kenjiArai 0:d95f6ac4c8d6 28 {
kenjiArai 0:d95f6ac4c8d6 29 BH1750_addr = addr;
kenjiArai 0:d95f6ac4c8d6 30 init();
kenjiArai 0:d95f6ac4c8d6 31 }
kenjiArai 0:d95f6ac4c8d6 32
kenjiArai 0:d95f6ac4c8d6 33 BH1750::BH1750 (I2C& p_i2c) : _i2c(p_i2c)
kenjiArai 0:d95f6ac4c8d6 34 {
kenjiArai 0:d95f6ac4c8d6 35 BH1750_addr = BH1750_G_CHIP_ADDR;
kenjiArai 0:d95f6ac4c8d6 36 init();
kenjiArai 0:d95f6ac4c8d6 37 }
kenjiArai 0:d95f6ac4c8d6 38
kenjiArai 0:d95f6ac4c8d6 39 BH1750::BH1750 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
kenjiArai 0:d95f6ac4c8d6 40 {
kenjiArai 0:d95f6ac4c8d6 41 BH1750_addr = addr;
kenjiArai 0:d95f6ac4c8d6 42 init();
kenjiArai 0:d95f6ac4c8d6 43 }
kenjiArai 0:d95f6ac4c8d6 44
kenjiArai 0:d95f6ac4c8d6 45 /////////////// Read Lux from sensor //////////////////////
kenjiArai 0:d95f6ac4c8d6 46 float BH1750::lux()
kenjiArai 0:d95f6ac4c8d6 47 {
kenjiArai 0:d95f6ac4c8d6 48 float lux;
kenjiArai 0:d95f6ac4c8d6 49
kenjiArai 0:d95f6ac4c8d6 50 _i2c.read(BH1750_addr, (char *)dt, 2, false);
kenjiArai 0:d95f6ac4c8d6 51 lux = (float)(dt[0] << 8 | dt[1]);
kenjiArai 0:d95f6ac4c8d6 52 lux = lux / 1.2 * ((float)sensitivity/69);
kenjiArai 0:d95f6ac4c8d6 53 return lux;
kenjiArai 0:d95f6ac4c8d6 54 }
kenjiArai 0:d95f6ac4c8d6 55
kenjiArai 0:d95f6ac4c8d6 56 /////////////// Initialize ////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 57 void BH1750::init()
kenjiArai 0:d95f6ac4c8d6 58 {
kenjiArai 0:d95f6ac4c8d6 59 _i2c.frequency(100000);
kenjiArai 0:d95f6ac4c8d6 60 power_up();
kenjiArai 0:d95f6ac4c8d6 61 sensitivity = SENS_1R00;
kenjiArai 0:d95f6ac4c8d6 62 set_sensitivity(sensitivity);
kenjiArai 0:d95f6ac4c8d6 63 }
kenjiArai 0:d95f6ac4c8d6 64
kenjiArai 0:d95f6ac4c8d6 65 /////////////// Timing Register ///////////////////////////
kenjiArai 0:d95f6ac4c8d6 66 void BH1750::set_sensitivity(uint8_t parameter)
kenjiArai 0:d95f6ac4c8d6 67 {
kenjiArai 0:d95f6ac4c8d6 68 if (parameter > SENS_3R68){
kenjiArai 0:d95f6ac4c8d6 69 parameter = SENS_3R68;
kenjiArai 0:d95f6ac4c8d6 70 } else if (parameter < SENS_0R45){
kenjiArai 0:d95f6ac4c8d6 71 parameter = SENS_0R45;
kenjiArai 0:d95f6ac4c8d6 72 }
kenjiArai 0:d95f6ac4c8d6 73 dt[0] = CMD_M_TIME_H | (parameter >> 5); // Set High byte
kenjiArai 0:d95f6ac4c8d6 74 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 75 dt[0] = CMD_M_TIME_L | (parameter & 0x1f); // Set Low byte
kenjiArai 0:d95f6ac4c8d6 76 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 77 dt[0] = CMD_C_H_RES_M; // Measurement mode: High Resolution
kenjiArai 0:d95f6ac4c8d6 78 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 79 wait_ms(240); // need normal conversion time(120mS) x 2
kenjiArai 0:d95f6ac4c8d6 80 }
kenjiArai 0:d95f6ac4c8d6 81
kenjiArai 0:d95f6ac4c8d6 82 /////////////// Power ON/OFF //////////////////////////////
kenjiArai 0:d95f6ac4c8d6 83 void BH1750::power_up()
kenjiArai 0:d95f6ac4c8d6 84 {
kenjiArai 0:d95f6ac4c8d6 85 dt[0] = CMD_PWR_UP;
kenjiArai 0:d95f6ac4c8d6 86 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 87 }
kenjiArai 0:d95f6ac4c8d6 88
kenjiArai 0:d95f6ac4c8d6 89 void BH1750::power_down()
kenjiArai 0:d95f6ac4c8d6 90 {
kenjiArai 0:d95f6ac4c8d6 91 dt[0] = CMD_PWR_DWN;
kenjiArai 0:d95f6ac4c8d6 92 _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
kenjiArai 0:d95f6ac4c8d6 93 }
kenjiArai 0:d95f6ac4c8d6 94
kenjiArai 0:d95f6ac4c8d6 95 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:d95f6ac4c8d6 96 void BH1750::frequency(int hz)
kenjiArai 0:d95f6ac4c8d6 97 {
kenjiArai 0:d95f6ac4c8d6 98 _i2c.frequency(hz);
kenjiArai 0:d95f6ac4c8d6 99 }