Project Digora IOT
Dependencies: libmDot-dev-mbed5
TempHum_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 "TempHum_sensor.h" |
Niiippoooo | 0:522ad8e780f6 | 2 | |
Niiippoooo | 0:522ad8e780f6 | 3 | |
Niiippoooo | 0:522ad8e780f6 | 4 | Capt_TH::Capt_TH() : 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); //on communique à la même fréquence qu'avec le capteur de luminosité |
Niiippoooo | 0:522ad8e780f6 | 7 | } |
Niiippoooo | 0:522ad8e780f6 | 8 | |
Niiippoooo | 0:522ad8e780f6 | 9 | void Capt_TH::WriteCommand() |
Niiippoooo | 0:522ad8e780f6 | 10 | { |
Niiippoooo | 0:522ad8e780f6 | 11 | i2c.start(); |
Niiippoooo | 0:522ad8e780f6 | 12 | i2c.write(0x88); // Initialisation du mode écriture à l'adresse 0x44 : 7 bits d'adresse (0x44 = 1000100) |
Niiippoooo | 0:522ad8e780f6 | 13 | // + 1 bit de mode (0x88 = 10001000 pour le mode écriture) |
Niiippoooo | 0:522ad8e780f6 | 14 | i2c.write(0x24); // Premier octet du message 0x240B correspondant au mode MEDIUM REPEATABILITY MEASUREMENT (cf. datasheet) |
Niiippoooo | 0:522ad8e780f6 | 15 | i2c.write(0x0B); // Second octet |
Niiippoooo | 0:522ad8e780f6 | 16 | i2c.stop(); |
Niiippoooo | 0:522ad8e780f6 | 17 | } |
Niiippoooo | 0:522ad8e780f6 | 18 | |
Niiippoooo | 0:522ad8e780f6 | 19 | void Capt_TH::ReadTempHum() |
Niiippoooo | 0:522ad8e780f6 | 20 | { |
Niiippoooo | 0:522ad8e780f6 | 21 | i2c.start(); |
Niiippoooo | 0:522ad8e780f6 | 22 | i2c.write(0x89); // Initialisation du mode lecture à l'adresse 0x44 : 7 bits d'adresse (0x44 = 1000100) |
Niiippoooo | 0:522ad8e780f6 | 23 | // + 1 bit de mode (0x89 = 10001001 pour le mode lecture) |
Niiippoooo | 0:522ad8e780f6 | 24 | |
Niiippoooo | 0:522ad8e780f6 | 25 | for (int i=0;i<6;i++) // Lecture des données envoyées par le capteur |
Niiippoooo | 0:522ad8e780f6 | 26 | { |
Niiippoooo | 0:522ad8e780f6 | 27 | readbuffer[i] = i2c.read(1); // readbuffer[0] et readbuffer[1] contiennent les valeurs de la température |
Niiippoooo | 0:522ad8e780f6 | 28 | // readbuffer[3] et readbuffer[4] contiennent les valeurs de l'humidité |
Niiippoooo | 0:522ad8e780f6 | 29 | // readbuffer[2] et readbuffer[5] contiennent des CRC checksum. |
Niiippoooo | 0:522ad8e780f6 | 30 | } |
Niiippoooo | 0:522ad8e780f6 | 31 | i2c.stop(); |
Niiippoooo | 0:522ad8e780f6 | 32 | |
Niiippoooo | 0:522ad8e780f6 | 33 | |
Niiippoooo | 0:522ad8e780f6 | 34 | ST = readbuffer[0]; // ST contient le bit de poids fort de la température. ex : ST = 01011111 (0x5F) |
Niiippoooo | 0:522ad8e780f6 | 35 | ST <<= 8; // Décalage de 8 bits pour récupérer les bits de poids faible. ex : 11101010 (0xEA) |
Niiippoooo | 0:522ad8e780f6 | 36 | ST |= readbuffer[1]; // Concaténation des 2 octets, ST = 01011111 11101010 (0x5FEA) |
Niiippoooo | 0:522ad8e780f6 | 37 | |
Niiippoooo | 0:522ad8e780f6 | 38 | SRH = readbuffer[3]; // Même principe pour l'humidité |
Niiippoooo | 0:522ad8e780f6 | 39 | SRH <<= 8; |
Niiippoooo | 0:522ad8e780f6 | 40 | SRH |= readbuffer[4]; |
Niiippoooo | 0:522ad8e780f6 | 41 | |
Niiippoooo | 0:522ad8e780f6 | 42 | temp = ST; // Conversion de la valeur reçue en degrés Celsius : T = -45 + 175*[ST/(2^16 - 1)] |
Niiippoooo | 0:522ad8e780f6 | 43 | temp *= 175; |
Niiippoooo | 0:522ad8e780f6 | 44 | temp /= 0xFFFF; |
Niiippoooo | 0:522ad8e780f6 | 45 | temp = -45 + temp; |
Niiippoooo | 0:522ad8e780f6 | 46 | |
Niiippoooo | 0:522ad8e780f6 | 47 | hum = SRH; // Conversion de la valeur reçue en humidité relative : RH = 100 * [SRH/(2^16 -1)] |
Niiippoooo | 0:522ad8e780f6 | 48 | hum *= 100; |
Niiippoooo | 0:522ad8e780f6 | 49 | hum /= 0xFFFF; |
Niiippoooo | 0:522ad8e780f6 | 50 | } |
Niiippoooo | 0:522ad8e780f6 | 51 | |
Niiippoooo | 0:522ad8e780f6 | 52 | void Capt_TH::getTempHum() |
Niiippoooo | 0:522ad8e780f6 | 53 | { |
Niiippoooo | 0:522ad8e780f6 | 54 | WriteCommand(); //indique au capteur quel type de mesure effectuer |
Niiippoooo | 0:522ad8e780f6 | 55 | ReadTempHum(); //récupère et convertit les données du capteur en température et humidité |
Niiippoooo | 0:522ad8e780f6 | 56 | } |
Niiippoooo | 0:522ad8e780f6 | 57 | |
Niiippoooo | 0:522ad8e780f6 | 58 | float Capt_TH::obtenirTemperature() |
Niiippoooo | 0:522ad8e780f6 | 59 | { if (temp<100) { //vérifie la cohérence de la mesure |
Niiippoooo | 0:522ad8e780f6 | 60 | printf("\n\rTempérature = %.2f °C\n\r", temp); //affiche la température en degrés Celsius |
Niiippoooo | 0:522ad8e780f6 | 61 | } |
Niiippoooo | 0:522ad8e780f6 | 62 | return (temp); //retourne la température pour l'envoi via le réseau LoRa |
Niiippoooo | 0:522ad8e780f6 | 63 | } |
Niiippoooo | 0:522ad8e780f6 | 64 | |
Niiippoooo | 0:522ad8e780f6 | 65 | float Capt_TH::obtenirHumidite() |
Niiippoooo | 0:522ad8e780f6 | 66 | { if (temp<100) { //vérifie la cohérence de la mesure |
Niiippoooo | 0:522ad8e780f6 | 67 | printf("\n\rHumidité Relative = %.2f %%\n\r", hum); //affiche l'humidité relative en pourcentage |
Niiippoooo | 0:522ad8e780f6 | 68 | } |
Niiippoooo | 0:522ad8e780f6 | 69 | return (hum); //retourne l'humidité pour l'envoi via le réseau LoRa |
Niiippoooo | 0:522ad8e780f6 | 70 | } |