TSL2561(照度センサ)のライブラリです

Dependents:   HYBRYD2018_IZU_ROCKET Hybrid_IZU2019

Revision:
3:f62d7ea19cbb
Parent:
2:276a177de00b
Child:
4:c1e82279b4bb
--- a/TSL2561.cpp	Wed Nov 14 09:13:55 2018 +0000
+++ b/TSL2561.cpp	Sat Jan 12 17:05:34 2019 +0000
@@ -1,85 +1,158 @@
 #include "mbed.h"
+#include "math.h"
 #include "TSL2561.h"
 
-//Serial DEBUG(USBTX,USBRX);
-
-myTSL2561::myTSL2561(I2C &i2cBus,AD0 celect)
-{
+myTSL2561::myTSL2561(I2C &i2cBus, AD0 celect){
     i2c = &i2cBus;
-    if(celect == AD0_LOW) _addr = SLV_ADDR_LOW;
-    else if(celect == AD0_HIGH) _addr = SLV_ADDR_HIGH;
-    else _addr = SLV_ADDR_OPEN;
+    if(celect == AD0_LOW){
+        _addr = SLV_ADDR_LOW;
+    }
+    else if(celect == AD0_HIGH){
+        _addr = SLV_ADDR_HIGH;
+    }
+    else{
+        _addr = SLV_ADDR_OPEN;
+    }
     SLV_WRITE_TSL = _addr;
     SLV_READ_TSL  = _addr | 1;
-    i2c->frequency(400000);
+    i2c -> frequency(400000);
 }
 
 
-void myTSL2561::begin()
-{
-    power_up_cmd[0] = COMMAND | CONTROL_REG;
-    power_up_cmd[1] = POWER_UP;
+void myTSL2561::begin(){
+    //power_up_cmd[0] = COMMAND | CONTROL_REG;
+    //power_up_cmd[1] = POWER_UP;
+    cmd[0] = COMMAND | CONTROL_REG;
+    cmd[1] = POWER_UP;
     
-    i2c->write(SLV_WRITE_TSL, power_up_cmd, 2);
-    
-    read_cmd = COMMAND | CHECK_REG;
+    //i2c -> write(SLV_WRITE_TSL, power_up_cmd, 2);
+    i2c -> write(SLV_WRITE_TSL, cmd, 2);
     
-    i2c->write(SLV_WRITE_TSL, &read_cmd, 1);
-    i2c->read(SLV_READ_TSL, &check_read, 1);
+    //read_cmd = COMMAND | CHECK_REG;
+    cmd[0] = COMMAND | CHECK_REG;
     
+    //i2c->write(SLV_WRITE_TSL, &read_cmd, 1);
+    //i2c->read(SLV_READ_TSL, &check_read, 1);
+    i2c -> write(SLV_WRITE_TSL, cmd, 1);
+    i2c -> read(SLV_READ_TSL, buff, 1);
 }
 
-int myTSL2561::connect_check()
-{
-    check_cmd = COMMAND | CHECK_REG;
+int myTSL2561::connectCheck(){
+    //check_cmd = COMMAND | CHECK_REG;
+    cmd[0] = COMMAND | CHECK_REG;
     
-    i2c->write(SLV_WRITE_TSL, &check_cmd, 1);
-    i2c->read(SLV_READ_TSL, &check_read, 1);
+    //i2c->write(SLV_WRITE_TSL, &check_cmd, 1);
+    //i2c->read(SLV_READ_TSL, &check_read, 1);
+    i2c -> write(SLV_WRITE_TSL, cmd, 1);
+    i2c -> read(SLV_READ_TSL, buff, 1);
     
     //DEBUG.printf("CHECK_REG read = %x\r\n",check_read);
     
-    if(check_read == ID_NUMBER){ return 1;}
-    else{ return 0;}
+    //if(check_read == ID_NUMBER){ return 1;}
+    if(buff[0] == ID_NUMBER){
+        return 1;
+    }
+    else{
+        return 0;
+    }
 }
 
-float myTSL2561::get_luminosity(unsigned int wait_time)
-{
-    read_cmd = COMMAND | RAW_DATA_LOW;
+//float myTSL2561::getLuminous0(unsigned int wait_time){
+//int myTSL2561::getLuminous0(unsigned int wait_time){
+int myTSL2561::getLuminous0(){
+    cmd[0] = COMMAND | RAW_DATA_LOW;
     
-    i2c->write(SLV_WRITE_TSL, &read_cmd, 1);
-    //wait_ms(wait_time);
-    i2c->read(SLV_READ_TSL, buff, 2);
+    //i2c->write(SLV_WRITE_TSL, &read_cmd, 1);
+    i2c -> write(SLV_WRITE_TSL, cmd, 1);
+    //i2c->read(SLV_READ_TSL, buff, 2);
+    i2c -> read(SLV_READ_TSL, buff, 2);
     
     val[0] = (int)buff[0];    
     val[1] = (int)buff[1] << 8;   
     
-    lux = (float)(val[1] | val[0]);
+    //lux = (float)(val[1] | val[0]);
+    //lux0 = (int)(val[1] | val[0]);
+    lux0 = (float)(val[1] | val[0]) / scale;
+    
+    //return lux;
+    return (int)lux0;
+}
+
+int myTSL2561::getLuminous1(){
+    cmd[0] = COMMAND | RAW_DATA_R_LOW;
     
-    return lux;
+    i2c -> write(SLV_WRITE_TSL, cmd, 1);
+    i2c -> read(SLV_READ_TSL, buff, 2);
+    
+    val[0] = (int)buff[0];    
+    val[1] = (int)buff[1] << 8;   
+    
+    //lux = (int)(val[1] | val[0]);
+    //lux1 = (int)(val[1] | val[0]);
+    lux1 = (float)(val[1] | val[0]) / scale;
+    
+    //return lux;
+    return (int)lux1;
 }
 
-unsigned int myTSL2561::set_rate(int channel)
-{
-    timing_cmd[0] = COMMAND | TIMING_REG;
+int myTSL2561::getLuminous(){
+    lux0 = getLuminous0();
+    lux1 = getLuminous1();
+    
+    ration = lux1 / lux0;
+    if(ration <= 0.50){
+        //lux = (int)(0.0304 * (float)lux0 - 0.062 * (float)lux0 * powf(ration, 1.4));
+        lux = 0.0304 * lux0 - 0.062 * lux0 * powf(ration, 1.4);
+    }
+    else if(ration <= 0.61){
+        //lux = (int)(0.0224 * (float)lux0 - 0.031 * (float)lux1);
+        lux = 0.0224 * lux0 - 0.031 * lux1;
+    }
+    else if(ration <= 0.80){
+        //lux = (int)(0.0128 * (float)lux0 - 0.0153 * (float)lux1);
+        lux = 0.0128 * lux0 - 0.0153 * lux1;
+    }
+    else if(ration <= 1.30){
+        //lux = (int)(0.00146 * (float)lux0 - 0.00112 * (float)lux1);
+        lux = 0.00146 * lux0 - 0.00112 * lux1;
+    }
+    else{
+        lux = 0;
+    }
+    
+    return (int)lux;
+}
+
+//unsigned int myTSL2561::setRate(int channel){
+void myTSL2561::setRate(int channel){
+    //timing_cmd[0] = COMMAND | TIMING_REG;
+    cmd[0] = COMMAND | TIMING_REG;
     
     if(channel == 0){
-        time = 14;
-        timing_cmd[1] = TIMING | 0x00;
-        i2c->write(SLV_WRITE_TSL, timing_cmd, 2);
+        //time = 14;
+        //timing_cmd[1] = TIMING | 0x00;
+        cmd[1] = TIMING | 0x00;
+        scale = 0.034;
+        //i2c->write(SLV_WRITE_TSL, timing_cmd, 2);
+        //i2c -> write(SLV_WRITE_TSL, cmd, 2);
     }
     else if(channel == 1){
-        time = 105;
-        timing_cmd[1] = TIMING | 0x01;
-        i2c->write(SLV_WRITE_TSL, timing_cmd, 2);
+        //time = 105;
+        //timing_cmd[1] = TIMING | 0x01;
+        cmd[1] = TIMING | 0x01;
+        scale = 0.252;
+        //i2c->write(SLV_WRITE_TSL, timing_cmd, 2);
+        //i2c -> write(SLV_WRITE_TSL, cmd, 2);
     }
     else if(channel == 2){
-        time = 405;
-        timing_cmd[1] = TIMING | 0x02;
-        i2c->write(SLV_WRITE_TSL, timing_cmd, 2);
+        //time = 405;
+        //timing_cmd[1] = TIMING | 0x02;
+        cmd[1] = TIMING | 0x02;
+        scale = 1;
+        //i2c->write(SLV_WRITE_TSL, timing_cmd, 2);
+        //i2c -> write(SLV_WRITE_TSL, cmd, 2);
     }
+    i2c -> write(SLV_WRITE_TSL, cmd, 2);
     
-    return time;
+    //return time;
 }
-    
-    
-    
\ No newline at end of file