František Naplechmočil / BH1750_V2

Files at this revision

API Documentation at this revision

Comitter:
civava
Date:
Mon Jan 15 05:25:09 2018 +0000
Commit message:
Updated version of BH1750 library.

Changed in this revision

BH1750.cpp Show annotated file Show diff for this revision Revisions of this file
BH1750.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 4edb4a6ae800 BH1750.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BH1750.cpp	Mon Jan 15 05:25:09 2018 +0000
@@ -0,0 +1,119 @@
+/*
+
+This is a library for the BH1750FVI (GY-30) Digital Light Sensor
+breakout board.
+
+The board uses I2C for communication.
+
+Datasheet:
+http://rohmfs.rohm.com/en/products/databook/datasheet/ic/sensor/light/bh1750fvi-e.pdf
+
+Inspired by Michal Stehlik, August, 2014.
+Written by Josef Křivský, January, 2018.
+
+*/
+
+#include "BH1750.h"
+
+BH1750::BH1750(PinName sda, PinName scl) : i2c(sda,scl)
+{
+    rawDataBuffer[0] = 0;
+    rawDataBuffer[1] = 0;
+    status = -1;
+    limit = 65535;
+}
+
+void BH1750::init(void)
+{
+    configure(BH1750_POWER_ON);
+}
+
+uint16_t BH1750::singleMeas(char mode)
+{
+    //char data[1];
+    uint16_t val = 0;;
+    switch (mode) 
+    {
+        case BH1750_ONE_TIME_HIGH_RES_MODE:
+        case BH1750_ONE_TIME_HIGH_RES_MODE_2:
+        case BH1750_ONE_TIME_LOW_RES_MODE:
+            configure(mode);
+            val = readIntesity();
+            return(val);
+        default:
+            return -1;
+    }
+}
+
+void BH1750::contMeas(char mode)
+{
+    switch (mode) 
+    {
+        case BH1750_CONTINUOUS_HIGH_RES_MODE:
+        case BH1750_CONTINUOUS_HIGH_RES_MODE_2:
+        case BH1750_CONTINUOUS_LOW_RES_MODE:
+            configure(mode);
+            break;
+        default:
+            break;
+    }
+}
+
+void BH1750::configure(char mode)
+{
+    char data[1];
+    switch (mode) 
+    {
+        case BH1750_CONTINUOUS_HIGH_RES_MODE:
+        case BH1750_CONTINUOUS_HIGH_RES_MODE_2:
+        case BH1750_CONTINUOUS_LOW_RES_MODE:
+        case BH1750_ONE_TIME_HIGH_RES_MODE:
+        case BH1750_ONE_TIME_HIGH_RES_MODE_2:
+        case BH1750_ONE_TIME_LOW_RES_MODE:
+            data[0] = mode;
+            status = i2c.write(BH1750_I2CADDR, data, sizeof(data), false);
+            wait_ms(10);
+            break;
+        default:
+            break;
+    }
+}
+
+
+uint16_t BH1750::readIntesity(void)
+{
+    status = i2c.read(BH1750_I2CADDR, rawDataBuffer, 2, false);
+    if(status != 0) 
+    {
+        return -1;
+    }
+    //success
+    uint16_t result = 0;
+    result = ((rawDataBuffer[0]<<8)|rawDataBuffer[1])/1.2;
+    return result;
+}
+
+int BH1750::getStatus(void)
+{
+    return status;
+}
+
+char* BH1750::getRawData(void)
+{
+    return rawDataBuffer;
+}
+
+uint16_t BH1750::getLimit(void)
+{
+    return limit;
+}
+
+void BH1750::setLimit(uint16_t lim)
+{
+    limit = lim;
+}
+
+void BH1750::setCurrentLimit(void)
+{
+    limit = readIntesity();
+}
\ No newline at end of file
diff -r 000000000000 -r 4edb4a6ae800 BH1750.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BH1750.h	Mon Jan 15 05:25:09 2018 +0000
@@ -0,0 +1,96 @@
+/*
+
+This is a library for the BH1750FVI (GY-30) Digital Light Sensor
+breakout board.
+
+The board uses I2C for communication.
+
+Datasheet:
+http://rohmfs.rohm.com/en/products/databook/datasheet/ic/sensor/light/bh1750fvi-e.pdf
+
+Inspired by Michal Stehlik, August, 2014.
+Written by Josef Křivský, January, 2018.
+
+*/
+
+#ifndef BH1750_h
+#define BH1750_h
+
+#include "mbed.h"
+
+#define BH1750_I2CADDR 0x46
+
+// Neaktivní stav
+#define BH1750_POWER_DOWN 0x00
+
+// Čekání na příkaz
+#define BH1750_POWER_ON 0x01
+
+// Reset datového registru senzoru - není akceptováno v neaktivním stavu
+#define BH1750_RESET 0x07
+
+// Start kontinuálního měření s rozlišením 1lx (trvání přibližně 120ms).
+#define BH1750_CONTINUOUS_HIGH_RES_MODE  0x10
+
+// Start kontinuálního měření s rozlišením 0.5lx (trvání přibližně 120ms).
+#define BH1750_CONTINUOUS_HIGH_RES_MODE_2  0x11
+
+// Start kontinuálního měření s rozlišením 4lx (trvání přibližně 16ms).
+#define BH1750_CONTINUOUS_LOW_RES_MODE  0x13
+
+// Start jednoho měření s rozlišením 1lx (trvání přibližně 120ms).
+// Zařízení je po přečtení naměřených dat automaticky vypnuto
+#define BH1750_ONE_TIME_HIGH_RES_MODE  0x20
+
+// Start jednoho měření s rozlišením 0.5lx (trvání přibližně 120ms).
+// Zařízení je po přečtení naměřených dat automaticky vypnuto
+#define BH1750_ONE_TIME_HIGH_RES_MODE_2  0x21
+
+// Start jednoho měření s rozlišením 4lx (trvání přibližně 16ms).
+// Zařízení je po přečtení naměřených dat automaticky vypnuto
+#define BH1750_ONE_TIME_LOW_RES_MODE  0x23
+
+/**
+* @code
+* #include "mbed.h"
+* #include "BH1750.h"
+*
+* BH1750 lightSensor(I2C_SDA, I2C_SCL);
+* Serial pc(SERIAL_TX, SERIAL_RX);
+*
+* int main() 
+* {
+*    lightSensor.init();
+*    lightsensor.contMeas();
+*
+*    while(1) {
+*        pc.printf("Light intensity: %.4f Lux\r\n", lightSensor.readIntesity());
+*        wait(5);
+*    }
+* }
+* @endcode
+*/
+
+class BH1750
+{
+public:
+    BH1750(PinName sda = I2C_SDA, PinName scl = I2C_SCL);
+    void init(void); // Inicializace senzoru
+    uint16_t singleMeas(char mode = BH1750_ONE_TIME_HIGH_RES_MODE); // Provedení jediného měření a vyčtení výsledku. Akceptované hodnoty jsou typu BH1750_ONE_TIME_...
+    void contMeas(char mode = BH1750_CONTINUOUS_HIGH_RES_MODE); // Začátek kontinuálního měření bez vyčtení výsledků.
+    void configure(char mode); // Konfigurace senzoru na specifikovaný mód
+    uint16_t readIntesity(void); // Vyčtení výsledku posledního měření
+    char* getRawData(void); // Vyčtení dat ze senzoru bez jejich úpravy
+    int getStatus(void); // Zjištění statusu senzoru a I2C komunikace
+    uint16_t getLimit(void); // Zjištění aktuálního limitu osvětlení
+    void setLimit(uint16_t lim); // Nastavení limitu osvětlení
+    void setCurrentLimit(void); // Nastavení limitu osvětlení na jeho aktuální hodnotu
+
+private:
+    I2C i2c;
+    char rawDataBuffer[2];
+    int status;
+    uint16_t limit;
+};
+
+#endif