Kenji Arai / TSL2561

Dependents:   MusicBoxForFathersDay FTHR_SensorHub Affich_Lum_Moist Projetv0 ... more

Files at this revision

API Documentation at this revision

Comitter:
kenjiArai
Date:
Sun Feb 22 01:19:56 2015 +0000
Child:
1:25a700e9b8ec
Commit message:
Luminosity sensor by Texas Advanced Optoelectronic Solutions Inc.. Device combines one broadband photodiode (visible plus infrared) and one infrared-responding photodiode. Set Gain x1 and 402mS as default.

Changed in this revision

TSL2561.cpp Show annotated file Show diff for this revision Revisions of this file
TSL2561.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TSL2561.cpp	Sun Feb 22 01:19:56 2015 +0000
@@ -0,0 +1,131 @@
+/*
+ * mbed library program
+ *  Luminosity sensor -- LIGHT-TO-DIGITAL CONVERTER (light intensity to a digital signal output)
+ *  TSL2561 by Texas Advanced Optoelectronic Solutions Inc.
+ *
+ * Copyright (c) 2015 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created: Feburary  21st, 2015
+ *      Revised: Feburary  22nd, 2015
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "TSL2561.h"
+
+TSL2561::TSL2561 (PinName p_sda, PinName p_scl) : _i2c(p_sda, p_scl)
+{
+    TSL2561_addr = TSL2561_ADDRESS_GND;
+    init();
+}
+
+TSL2561::TSL2561 (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl)
+{
+    TSL2561_addr = addr;
+    init();
+}
+
+TSL2561::TSL2561 (I2C& p_i2c) : _i2c(p_i2c)
+{
+    TSL2561_addr = TSL2561_ADDRESS_GND;
+    init();
+}
+
+TSL2561::TSL2561 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
+{
+    TSL2561_addr = addr;
+    init();
+}
+
+/////////////// Read Lux from sensor //////////////////////
+/*
+For 0    < CH1/CH0 < 0.50 Lux = 0.0304  x CH0-0.062  x CH0 x ((CH1/CH0)1.4)
+For 0.50 < CH1/CH0 < 0.61 Lux = 0.0224  x CH0-0.031  x CH1
+For 0.61 < CH1/CH0 < 0.80 Lux = 0.0128  x CH0-0.0153 x CH1
+For 0.80 < CH1/CH0 < 1.30 Lux = 0.00146 x CH0-0.00112x CH1
+For        CH1/CH0 > 1.30 Lux = 0
+ */
+float TSL2561::lux()
+{
+    double lux0, lux1;
+    double ratio;
+    double dlux;
+
+    dt[0] = CMD_MULTI + TSL2561_DATA0LOW;
+    _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
+    _i2c.read(TSL2561_addr, (char *)dt, 2, false);
+    ch0 = dt[1] << 8 | dt[0];
+    dt[0] = CMD_MULTI + TSL2561_DATA1LOW;
+    _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
+    _i2c.read(TSL2561_addr, (char *)dt, 2, false);
+    ch1 = dt[1] << 8 | dt[0];
+    lux0 = ch0;
+    lux1 = ch1;
+    ratio = lux1 / lux0;
+    if (ratio <= 0.5) {
+        dlux = 0.03040 * lux0 - 0.06200 * lux0 * pow(ratio,1.4);
+    } else if (ratio <= 0.61) {
+        dlux = 0.02240 * lux0 - 0.03100 * lux1;
+    } else if (ratio <= 0.80) {
+        dlux = 0.01280 * lux0 - 0.01530 * lux1;
+    } else if (ratio <= 1.30) {
+        dlux = 0.00146 * lux0 - 0.00112 * lux1;
+    } else {
+        dlux = 0;
+    }
+    return (float)dlux;
+}
+
+/////////////// Initialize ////////////////////////////////
+void TSL2561::init()
+{
+    _i2c.frequency(100000);
+    power_up();
+    read_ID();
+}
+
+/////////////// ID ////////////////////////////////////////
+uint16_t TSL2561::read_ID()
+{
+    dt[0] = CMD_SINGLE + TSL2561_ID;
+    _i2c.write((int)TSL2561_addr, (char *)dt, 1, true);
+    _i2c.read(TSL2561_addr, (char *)dt, 2, false);
+    id_number = dt[0] << 8 | dt[1];
+    return id_number;
+}
+
+uint8_t TSL2561::who_am_i()
+{
+    read_ID();
+    if ((id_number >> 4) == I_AM_TSL2561) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+/////////////// Power ON/OFF //////////////////////////////
+void TSL2561::power_up()
+{
+    dt[0] = CMD_SINGLE + TSL2561_CONTROL;
+    dt[1] = 3;
+    _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
+}
+
+void TSL2561::power_down()
+{
+    dt[0] = CMD_SINGLE + TSL2561_CONTROL;
+    dt[1] = 0;
+    _i2c.write((int)TSL2561_addr, (char *)dt, 2, false);
+}
+
+/////////////// I2C Freq. /////////////////////////////////
+void TSL2561::frequency(int hz)
+{
+    _i2c.frequency(hz);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TSL2561.h	Sun Feb 22 01:19:56 2015 +0000
@@ -0,0 +1,150 @@
+/*
+ * mbed library program
+ *  Luminosity sensor -- LIGHT-TO-DIGITAL CONVERTER (light intensity to a digital signal output)
+ *  TSL2561 by Texas Advanced Optoelectronic Solutions Inc.
+ *
+ * Copyright (c) 2015 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created: Feburary  21st, 2015
+ *      Revised: Feburary  21st, 2015
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/*
+ *---------------- REFERENCE ----------------------------------------------------------------------
+ *  https://docs.google.com/viewer?url=http%3A%2F%2Fwww.adafruit.com%2Fdatasheets%2FTSL256x.pdf
+ *  https://learn.adafruit.com/tsl2561?view=all
+ *  http://www.adafruit.com/products/439
+ *  http://akizukidenshi.com/catalog/g/gM-08219/
+ */
+
+#ifndef TSL2561_H
+#define TSL2561_H
+
+#include "mbed.h"
+
+// Luminosity sensor, TSL2561
+// Address b7=0,b6=1,b5=1,b4=1,b3=0,b2=0,b1=1, b0=R/W
+#define TSL2561_ADDRESS_GND         (0x29 << 1)
+#define TSL2561_ADDRESS_FLOAT       (0x39 << 1)
+#define TSL2561_ADDRESS_VDD         (0x49 << 1)
+
+////////////// Registers //////////////////////////////////
+// Register definition
+#define TSL2561_CONTROL             0x00
+#define TSL2561_TIMING              0x01
+#define TSL2561_THRESHLOWLOW        0x02
+#define TSL2561_THRESHHIGHLOW       0x04
+#define TSL2561_INTERRUPT           0x06
+#define TSL2561_CRC                 0x08
+#define TSL2561_ID                  0x0A
+#define TSL2561_DATA0LOW            0x0C
+#define TSL2561_DATA0HIGH           0x0D
+#define TSL2561_DATA1LOW            0x0E
+#define TSL2561_DATA1HIGH           0x0F
+
+////////////// ID /////////////////////////////////////////
+#define I_AM_TSL2561                0x50
+#define REG_NO_MASK                 0x0F
+
+////////////// COMMAND ////////////////////////////////////
+#define CMD_CMDMODE                 (1UL << 7)
+#define CMD_CLEAR                   (1UL << 6)
+#define CMD_WORD                    (1UL << 5)
+#define CMD_BLOCK                   (1UL << 4)
+#define CMD_SINGLE                  (CMD_CMDMODE)
+#define CMD_MULTI                   (CMD_CMDMODE + CMD_WORD)
+
+/** Interface for Luminosity sensor, TSL2561
+ * @code
+ * #include "mbed.h"
+ * #include "TSL2561.h"
+ *
+ * // I2C Communication
+ *  TSL2561      lum(dp5,dp27);    // TSL2561 SDA, SCL
+ * // If you connected I2C line not only this device but also other devices,
+ * //     you need to declare following method.
+ *  I2C          i2c(dp5,dp27);     // SDA, SCL
+ *  TSL2561      lum(i2c);         // TSL2561 SDA, SCL (Data available every 400mSec)
+ *
+ * int main() {;
+ *   while(true){
+ *      printf("Illuminance: %+7.2f [Lux]\r\n", lum.lux());
+ *      wait(1.0);
+ *   }
+ * }
+ * @endcode
+ */
+
+class TSL2561
+{
+public:
+    /** Configure data pin
+      * @param data SDA and SCL pins
+      */
+    TSL2561(PinName p_sda, PinName p_scl);
+    TSL2561(PinName p_sda, PinName p_scl, uint8_t addr);
+
+    /** Configure data pin (with other devices on I2C line)
+      * @param I2C previous definition
+      */
+    TSL2561(I2C& p_i2c);
+    TSL2561(I2C& p_i2c, uint8_t addr);
+
+    /** Get approximates the human eye response
+      *  in the commonly used Illuminance unit of Lux
+      * @param none
+      * @return Lux
+      */
+    float lux(void);
+
+    /** Set config register
+      * @param config parameter
+      * @return config read data
+      */
+    uint16_t set_config(uint16_t cfg);
+
+    /** Set I2C clock frequency
+      * @param freq.
+      * @return none
+      */
+    void frequency(int hz);
+
+    /** check Device ID number
+      * @param none
+      * @return TSL2561 = 1, others  0
+      */
+    uint8_t who_am_i(void);
+
+    /** Read ID and Revision Number
+      * @param none
+      * @return ID + REVNO
+      */
+    uint16_t read_ID(void);
+
+    /** Power Up/Down
+      * @param none
+      * @return none
+      */
+    void power_up(void);
+    void power_down(void);
+
+protected:
+    I2C  _i2c;
+
+    void init(void);
+
+private:
+    uint8_t  TSL2561_addr;
+    uint8_t  dt[4];
+    uint16_t ch0;
+    uint16_t ch1;
+    uint8_t id_number;
+};
+
+#endif      // TSL2561_H