Project Digora IOT
Dependencies: libmDot-dev-mbed5
Lum_sensor.cpp@0:522ad8e780f6, 2017-05-19 (annotated)
- Committer:
- Niiippoooo
- Date:
- Fri May 19 09:26:49 2017 +0000
- Revision:
- 0:522ad8e780f6
project Digora IOT
Who changed what in which revision?
User | Revision | Line number | New 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 | } |