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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BH1750.cpp Source File

BH1750.cpp

00001 /*
00002  * mbed library program
00003  *  light intensity sensor module with built-in a 16 bit AD converter generating digital signal.
00004  *  BH1750 by ROHM Co.,Ltd.
00005  *
00006  * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
00007  *  http://www.page.sannet.ne.jp/kenjia/index.html
00008  *  http://mbed.org/users/kenjiArai/
00009  *      Created: March       7th, 2015
00010  *      Revised: August     23rd, 2017
00011  */
00012 
00013 #include "BH1750.h"
00014 
00015 BH1750::BH1750 (PinName p_sda, PinName p_scl)
00016  : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00017 {
00018     BH1750_addr = BH1750_G_CHIP_ADDR;
00019     init();
00020 }
00021 
00022 BH1750::BH1750 (PinName p_sda, PinName p_scl, uint8_t addr)
00023  : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00024 {
00025     BH1750_addr = addr;
00026     init();
00027 }
00028 
00029 BH1750::BH1750 (I2C& p_i2c)
00030  : _i2c(p_i2c)
00031 {
00032     BH1750_addr = BH1750_G_CHIP_ADDR;
00033     init();
00034 }
00035 
00036 BH1750::BH1750 (I2C& p_i2c, uint8_t addr)
00037  : _i2c(p_i2c)
00038 {
00039     BH1750_addr = addr;
00040     init();
00041 }
00042 
00043 /////////////// Read Lux from sensor //////////////////////
00044 float BH1750::lux()
00045 {
00046     float lux;
00047 
00048     _i2c.read(BH1750_addr, (char *)dt, 2, false);
00049     lux = (float)(dt[0] << 8 | dt[1]);
00050     lux = lux / 1.2f * ((float)sensitivity/69);
00051     return lux;
00052 }
00053 
00054 /////////////// Initialize ////////////////////////////////
00055 void BH1750::init()
00056 {
00057     _i2c.frequency(100000);
00058     power_up();
00059     sensitivity = SENS_1R00;
00060     set_sensitivity(sensitivity);
00061 }
00062 
00063 /////////////// Timing Register ///////////////////////////
00064 void BH1750::set_sensitivity(uint8_t parameter)
00065 {
00066     if (parameter > SENS_3R68){
00067         parameter = SENS_3R68;
00068     } else if (parameter < SENS_0R45){
00069         parameter = SENS_0R45;
00070     }
00071     dt[0] = CMD_M_TIME_H | (parameter >> 5);    // Set High byte
00072     _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
00073     dt[0] = CMD_M_TIME_L | (parameter & 0x1f);  // Set Low byte
00074     _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
00075     dt[0] = CMD_C_H_RES_M;      // Measurement mode: High Resolution
00076     _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
00077     wait_ms(240);   // need normal conversion time(120mS) x 2
00078 }
00079 
00080 /////////////// Power ON/OFF //////////////////////////////
00081 void BH1750::power_up()
00082 {
00083     dt[0] = CMD_PWR_UP;
00084     _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
00085 }
00086 
00087 void BH1750::power_down()
00088 {
00089     dt[0] = CMD_PWR_DWN;
00090     _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
00091 }
00092 
00093 /////////////// I2C Freq. /////////////////////////////////
00094 void BH1750::frequency(int hz)
00095 {
00096     _i2c.frequency(hz);
00097 }
00098 
00099