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:
2022-01-17
Revision:
5:04cdce6242a6
Parent:
3:3c15665641ff

File content as of revision 5:04cdce6242a6:

/*
 * 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;
}

void BH1750::high_resolution2_trigger()
{
    dt[0] = CMD_1_H_RES_M2;      // Measurement mode: Single High Resolution 2
    _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
}

float BH1750::high_resolution2_read()
{
    float lux;
    Hres=2;
    
    _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;
}


float BH1750::high_resolution2_trigger_read()
{
    high_resolution2_trigger();
    wait_ms(180);   // wait 180ms
    return high_resolution2_read();
}

void BH1750::high_resolution_trigger(){
    dt[0] = CMD_1_H_RES_M;      // Measurement mode: Single High Resolution 2
    _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
}

float BH1750::high_resolution_read(){
    
    float lux;
    Hres=1;
    _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;
}
   
    
float BH1750::high_resolution_trigger_read(){
    high_resolution_trigger();
    wait_ms(180);   // wait 180ms
    return high_resolution_read();
}

void BH1750::low_resolution_trigger(){
    dt[0] = CMD_1_L_RES_M;      // Measurement mode: Single High Resolution 2
    _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
}

float BH1750::low_resolution_read(){
    float lux;
    _i2c.read(BH1750_addr, (char *)dt, 2, false);
    lux = (float)(dt[0] << 8 | dt[1]);
    lux = lux / 1.2f;
    return lux;
}
   
float BH1750::low_resolution_trigger_read(){
    low_resolution_trigger();
    wait_ms(24);
    return low_resolution_read();
}

/////////////// Initialize ////////////////////////////////
void BH1750::init()
{
    _i2c.frequency(100000);
    power_up();  
    set_sensitivity(SENS_2);
}

/////////////// set sensitivity ////////////////////////////////
void BH1750::set_sensitivity(uint8_t parameter)
{
    if (parameter > SENS_4){
        parameter = SENS_4;
    } else if (parameter < SENS_0){
        parameter = SENS_0;
    }
    sensitivity = parameter;
    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);
}

/////////////// Timing Register ///////////////////////////
void BH1750::set_high_resolution_continuous(uint8_t parameter)
{
    if (parameter > SENS_4){
        parameter = SENS_4;
    } else if (parameter < SENS_0){
        parameter = SENS_0;
    }
    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
}

void BH1750::set_high_resolution2_continuous(uint8_t parameter)
{
    if (parameter > SENS_4){
        parameter = SENS_4;
    } else if (parameter < SENS_0){
        parameter = SENS_0;
    }
    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
}

void BH1750::set_low_resolution_continuous(uint8_t parameter)
{
    if (parameter > SENS_4){
        parameter = SENS_4;
    } else if (parameter < SENS_0){
        parameter = SENS_0;
    }
    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_L_RES_M;      // 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);
}

/////////////// Power ON/OFF //////////////////////////////
void BH1750::reset()
{
    dt[0] = CMD_RESET;
    _i2c.write((int)BH1750_addr, (char *)dt, 1, false);
}