Digital 16bit Serial Output Type Ambient Light Sensor IC by ROHM, Ambient light sensor (Illuminance to digital converter)
BH1750.cpp@0:d95f6ac4c8d6, 2015-03-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |