Project Digora IOT

Dependencies:   libmDot-dev-mbed5

Committer:
Niiippoooo
Date:
Fri May 19 09:26:49 2017 +0000
Revision:
0:522ad8e780f6
project Digora IOT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Niiippoooo 0:522ad8e780f6 1 #include "Lum_sensor.h"
Niiippoooo 0:522ad8e780f6 2
Niiippoooo 0:522ad8e780f6 3
Niiippoooo 0:522ad8e780f6 4 Capt_Lum::Capt_Lum() : i2c(PC_9, PA_8) //initialise la liaison I2C entre le capteur et les pins SDA et SCL du mDot
Niiippoooo 0:522ad8e780f6 5 {
Niiippoooo 0:522ad8e780f6 6 i2c.frequency(100000); //impose la fréquence de communication recommandée pour le capteur
Niiippoooo 0:522ad8e780f6 7 enablePower();
Niiippoooo 0:522ad8e780f6 8
Niiippoooo 0:522ad8e780f6 9 }
Niiippoooo 0:522ad8e780f6 10
Niiippoooo 0:522ad8e780f6 11 int Capt_Lum::enablePower(){
Niiippoooo 0:522ad8e780f6 12 int ack = writeSingleRegister( TSL_CONTROL, 3 ); //écrit le mot permettant d'allumer le capteur dans le registre CONTROL du capteur
Niiippoooo 0:522ad8e780f6 13 wait(0.1);
Niiippoooo 0:522ad8e780f6 14 return ack;
Niiippoooo 0:522ad8e780f6 15 }
Niiippoooo 0:522ad8e780f6 16
Niiippoooo 0:522ad8e780f6 17 int Capt_Lum::disablePower(){
Niiippoooo 0:522ad8e780f6 18 int ack = writeSingleRegister( TSL_CONTROL, 0 ); //écrit le mot permettant d'éteindre le capteur dans le registre CONTROLdu capteur
Niiippoooo 0:522ad8e780f6 19 wait(0.1);
Niiippoooo 0:522ad8e780f6 20 return ack;
Niiippoooo 0:522ad8e780f6 21 }
Niiippoooo 0:522ad8e780f6 22
Niiippoooo 0:522ad8e780f6 23 int Capt_Lum::writeSingleRegister( char address, char data ){
Niiippoooo 0:522ad8e780f6 24 char tx[2] = { address | 160, data }; //0d160 = 0b10100000 //on stocke l'addresse du registre et le mot à écrire dans tx
Niiippoooo 0:522ad8e780f6 25 int ack = i2c.write( TSL_SLAVE_ADDRESS << 1, tx, 2 ); //on écrit le mot data dans le registre d'addresse address
Niiippoooo 0:522ad8e780f6 26 return ack;
Niiippoooo 0:522ad8e780f6 27 }
Niiippoooo 0:522ad8e780f6 28
Niiippoooo 0:522ad8e780f6 29 char Capt_Lum::readSingleRegister( char address ){
Niiippoooo 0:522ad8e780f6 30 char output = 255;
Niiippoooo 0:522ad8e780f6 31 char command = address | 160; //0d160 = 0b10100000 //on stocke address dans un registre
Niiippoooo 0:522ad8e780f6 32 i2c.write( TSL_SLAVE_ADDRESS << 1, &command, 1, true ); //on indique que l'on veut lire le registre à l'addresse address
Niiippoooo 0:522ad8e780f6 33 i2c.read( TSL_SLAVE_ADDRESS << 1, &output, 1 ); //on lit un mot que l'on sotcke dans output
Niiippoooo 0:522ad8e780f6 34
Niiippoooo 0:522ad8e780f6 35 return output;
Niiippoooo 0:522ad8e780f6 36 }
Niiippoooo 0:522ad8e780f6 37
Niiippoooo 0:522ad8e780f6 38 int Capt_Lum::readMultipleRegisters( char address, char* output, int quantity ){
Niiippoooo 0:522ad8e780f6 39 char command = address | 160; //0d160 = 0b10100000 //on stocke address dans un registre
Niiippoooo 0:522ad8e780f6 40 i2c.write( TSL_SLAVE_ADDRESS << 1, &command, 1, true ); //on indique que l'on veut lire le registre à l'addresse address
Niiippoooo 0:522ad8e780f6 41 int ack = i2c.read( TSL_SLAVE_ADDRESS << 1, output, quantity ); //on lit un mot que l'on sotcke dans output
Niiippoooo 0:522ad8e780f6 42
Niiippoooo 0:522ad8e780f6 43 return ack;
Niiippoooo 0:522ad8e780f6 44 }
Niiippoooo 0:522ad8e780f6 45
Niiippoooo 0:522ad8e780f6 46
Niiippoooo 0:522ad8e780f6 47 int Capt_Lum::getVisibleAndIR(){
Niiippoooo 0:522ad8e780f6 48 char buffer[2] = { 0 };
Niiippoooo 0:522ad8e780f6 49 readMultipleRegisters( TSL_DATA0LOW, buffer, 2 ); //lecture du registre contenant la mesure de luminosité visible et IR
Niiippoooo 0:522ad8e780f6 50 int reading = (int)buffer[1] << 8 | (int)buffer[0];
Niiippoooo 0:522ad8e780f6 51
Niiippoooo 0:522ad8e780f6 52 return reading;
Niiippoooo 0:522ad8e780f6 53 }
Niiippoooo 0:522ad8e780f6 54
Niiippoooo 0:522ad8e780f6 55 int Capt_Lum::getIROnly(){
Niiippoooo 0:522ad8e780f6 56 char buffer[2] = { 0 };
Niiippoooo 0:522ad8e780f6 57 readMultipleRegisters( TSL_DATA1LOW, buffer, 2 ); //lecture du registre contenant la mesure d'infrarouge
Niiippoooo 0:522ad8e780f6 58 int reading = (int)buffer[1] << 8 | (int)buffer[0];
Niiippoooo 0:522ad8e780f6 59
Niiippoooo 0:522ad8e780f6 60 return reading;
Niiippoooo 0:522ad8e780f6 61 }
Niiippoooo 0:522ad8e780f6 62
Niiippoooo 0:522ad8e780f6 63
Niiippoooo 0:522ad8e780f6 64 float Capt_Lum::getLux(){
Niiippoooo 0:522ad8e780f6 65 int ch0 = getVisibleAndIR();
Niiippoooo 0:522ad8e780f6 66 int ch1 = getIROnly();
Niiippoooo 0:522ad8e780f6 67
Niiippoooo 0:522ad8e780f6 68 // on vérifie que le capteur n'a pas saturé (0xFFFF)
Niiippoooo 0:522ad8e780f6 69 // si c'est le cas on arrête (-1)
Niiippoooo 0:522ad8e780f6 70 if( (ch0 == 0xFFFF) || (ch1 == 0xFFFF) ){
Niiippoooo 0:522ad8e780f6 71
Niiippoooo 0:522ad8e780f6 72 return -1;
Niiippoooo 0:522ad8e780f6 73 }
Niiippoooo 0:522ad8e780f6 74
Niiippoooo 0:522ad8e780f6 75 // conversion en float
Niiippoooo 0:522ad8e780f6 76 float d0 = ch0;
Niiippoooo 0:522ad8e780f6 77 float d1 = ch1;
Niiippoooo 0:522ad8e780f6 78
Niiippoooo 0:522ad8e780f6 79 // We will need the ratio for subsequent calculations
Niiippoooo 0:522ad8e780f6 80 double ratio = d1 / d0;
Niiippoooo 0:522ad8e780f6 81
Niiippoooo 0:522ad8e780f6 82 // division par le temps d'intégration
Niiippoooo 0:522ad8e780f6 83 int itime = readIntegrationTime();
Niiippoooo 0:522ad8e780f6 84 d0 *= (402.0/itime);
Niiippoooo 0:522ad8e780f6 85 d1 *= (402.0/itime);
Niiippoooo 0:522ad8e780f6 86
Niiippoooo 0:522ad8e780f6 87 // division par le gain du capteur
Niiippoooo 0:522ad8e780f6 88 int gain = readGain();
Niiippoooo 0:522ad8e780f6 89 d0 /= gain;
Niiippoooo 0:522ad8e780f6 90 d1 /= gain;
Niiippoooo 0:522ad8e780f6 91
Niiippoooo 0:522ad8e780f6 92 // conversion en lux d'après les équations de la datasheet :
Niiippoooo 0:522ad8e780f6 93 if (ratio < 0.5)
Niiippoooo 0:522ad8e780f6 94 {
Niiippoooo 0:522ad8e780f6 95 lux = 0.0304 * d0 - 0.062 * d0 * pow(ratio,1.4);
Niiippoooo 0:522ad8e780f6 96 if (ratio<0.125)
Niiippoooo 0:522ad8e780f6 97 {
Niiippoooo 0:522ad8e780f6 98 lux = 0.0304*d0-0.0272*d1;
Niiippoooo 0:522ad8e780f6 99 }
Niiippoooo 0:522ad8e780f6 100 else if (ratio < 0.250)
Niiippoooo 0:522ad8e780f6 101 {
Niiippoooo 0:522ad8e780f6 102 lux = 0.0325*d0-0.0440*d1;
Niiippoooo 0:522ad8e780f6 103 }
Niiippoooo 0:522ad8e780f6 104 else if (ratio < 0.375)
Niiippoooo 0:522ad8e780f6 105 {
Niiippoooo 0:522ad8e780f6 106 lux = 0.0351*d0 - 0.0544*d1;
Niiippoooo 0:522ad8e780f6 107 }
Niiippoooo 0:522ad8e780f6 108 else
Niiippoooo 0:522ad8e780f6 109 {
Niiippoooo 0:522ad8e780f6 110 lux = 0.0381*d0 - 0.0624*d1;
Niiippoooo 0:522ad8e780f6 111 }
Niiippoooo 0:522ad8e780f6 112 }
Niiippoooo 0:522ad8e780f6 113 else if (ratio < 0.61)
Niiippoooo 0:522ad8e780f6 114 {
Niiippoooo 0:522ad8e780f6 115 lux = 0.0224 * d0 - 0.031 * d1;
Niiippoooo 0:522ad8e780f6 116 }
Niiippoooo 0:522ad8e780f6 117 else if (ratio < 0.80)
Niiippoooo 0:522ad8e780f6 118 {
Niiippoooo 0:522ad8e780f6 119 lux = 0.0128 * d0 - 0.0153 * d1;
Niiippoooo 0:522ad8e780f6 120 }
Niiippoooo 0:522ad8e780f6 121 else if (ratio < 1.30)
Niiippoooo 0:522ad8e780f6 122 {
Niiippoooo 0:522ad8e780f6 123 lux = 0.00146 * d0 - 0.00112 * d1;
Niiippoooo 0:522ad8e780f6 124 }
Niiippoooo 0:522ad8e780f6 125 else if (ratio >= 1.30)
Niiippoooo 0:522ad8e780f6 126 {
Niiippoooo 0:522ad8e780f6 127 lux = 0;
Niiippoooo 0:522ad8e780f6 128 }
Niiippoooo 0:522ad8e780f6 129 return lux;
Niiippoooo 0:522ad8e780f6 130 }
Niiippoooo 0:522ad8e780f6 131
Niiippoooo 0:522ad8e780f6 132 //calcule le temps d'inégration d'après les équations de la datasheet :
Niiippoooo 0:522ad8e780f6 133 float Capt_Lum::readIntegrationTime(){
Niiippoooo 0:522ad8e780f6 134 char timing = readSingleRegister( TSL_TIMING );
Niiippoooo 0:522ad8e780f6 135 char integ = ( timing << 6 ) >> 6; // keep bits 0 & 1
Niiippoooo 0:522ad8e780f6 136 int itime;
Niiippoooo 0:522ad8e780f6 137 switch (integ) {
Niiippoooo 0:522ad8e780f6 138 case 0:
Niiippoooo 0:522ad8e780f6 139 itime = 13.7;
Niiippoooo 0:522ad8e780f6 140 break;
Niiippoooo 0:522ad8e780f6 141 case 1:
Niiippoooo 0:522ad8e780f6 142 itime = 101;
Niiippoooo 0:522ad8e780f6 143 break;
Niiippoooo 0:522ad8e780f6 144 case 2:
Niiippoooo 0:522ad8e780f6 145 itime = 402;
Niiippoooo 0:522ad8e780f6 146 break;
Niiippoooo 0:522ad8e780f6 147 default:
Niiippoooo 0:522ad8e780f6 148 itime = 0;
Niiippoooo 0:522ad8e780f6 149 break;
Niiippoooo 0:522ad8e780f6 150 }
Niiippoooo 0:522ad8e780f6 151
Niiippoooo 0:522ad8e780f6 152 return itime;
Niiippoooo 0:522ad8e780f6 153 }
Niiippoooo 0:522ad8e780f6 154 //calcule le gain du capteur d'après les équations de la datasheet :
Niiippoooo 0:522ad8e780f6 155 int Capt_Lum::readGain(){
Niiippoooo 0:522ad8e780f6 156 char timing = readSingleRegister( TSL_TIMING );
Niiippoooo 0:522ad8e780f6 157 char gain_bit = ( timing << 3 ) >> 7; // keep only bit 4
Niiippoooo 0:522ad8e780f6 158 //printf("gain_bit = %i\n\r", gain_bit);
Niiippoooo 0:522ad8e780f6 159 int gain;
Niiippoooo 0:522ad8e780f6 160 switch (gain_bit) {
Niiippoooo 0:522ad8e780f6 161 case 0:
Niiippoooo 0:522ad8e780f6 162 gain = 1;
Niiippoooo 0:522ad8e780f6 163 break;
Niiippoooo 0:522ad8e780f6 164 case 1:
Niiippoooo 0:522ad8e780f6 165 gain = 16;
Niiippoooo 0:522ad8e780f6 166 break;
Niiippoooo 0:522ad8e780f6 167 default:
Niiippoooo 0:522ad8e780f6 168 gain = 0;
Niiippoooo 0:522ad8e780f6 169 break;
Niiippoooo 0:522ad8e780f6 170 }
Niiippoooo 0:522ad8e780f6 171
Niiippoooo 0:522ad8e780f6 172 return gain;
Niiippoooo 0:522ad8e780f6 173 }
Niiippoooo 0:522ad8e780f6 174
Niiippoooo 0:522ad8e780f6 175 float Capt_Lum::obtenirLuminosite()
Niiippoooo 0:522ad8e780f6 176 {
Niiippoooo 0:522ad8e780f6 177 float lux = getLux(); //mesure et calcule la luminosité
Niiippoooo 0:522ad8e780f6 178 if (lux>0)
Niiippoooo 0:522ad8e780f6 179 {
Niiippoooo 0:522ad8e780f6 180 printf("\n\rLuminosité : %.2f lux\n\r", lux); //affiche la luminosité
Niiippoooo 0:522ad8e780f6 181 }
Niiippoooo 0:522ad8e780f6 182 else
Niiippoooo 0:522ad8e780f6 183 {
Niiippoooo 0:522ad8e780f6 184 printf("\n\rErreur lecture luminosité\n\r");
Niiippoooo 0:522ad8e780f6 185 }
Niiippoooo 0:522ad8e780f6 186 return lux; //retourne la luminosité pour une utilisation ultérieure
Niiippoooo 0:522ad8e780f6 187 }