Capteur de Temperature / CO2 / Humidité avec afficheur
Materiel :
- 1 Linkit One
- 1 Grove Co2 Sensor
- 1 Grove temperature&Humidity Sensor Pro v1.2
- 1 Grove Switch
- 1 Grove-LCD RGB Backlight V2.0
Spécifications
Capteur de CO2 :
Plage de mesure : 0-2000 parties par million (PPM)Voltage de 4.5 a 6V
Courant maximum de moins de 100 mA, le courant moyen de moins est de 50 mA
Mode de sortie UART
http://wiki.seeedstudio.com/Grove-CO2_Sensor/
350~450 ppm : Environnement exterieur
350~1000 ppm : L'air est frais
1000~2000 ppm : L'air est stagnante et vous vous sentez fatigue
2000~5000 ppm : Maux de tete, sommeil, incapable de vous concentrer et meme une legere nausee
>5000 ppm : grave epuisement de l'oxygene, des lesions cerebrales permanentes et meme la mort
Capteur de temperature et Humidité
Plage de mesure :
Humidité de 5% à 99% HR (humidité relative)
Temperature de -40 a 80°C
Voltage de 3.3 a 6V
Temps de réponse entre 6 et 20 secondes
http://wiki.seeedstudio.com/Grove-Temperature_and_Humidity_Sensor_Pro/
Une humidité relative de 70% signifie que l'air contient 70% du maximum de vapeur d'eau qu'il peut absorber à cette température. Ainsi votre confort dépend directement d'un subtil équilibre entre la température de l'air et le pourcentage d'humidité : à 60% d'humidité relative, l'inconfort suscité par l'humidité sera plus grand s'il fait 30°C que s'il en fait 20. En effet, l'air à 30°C étant moins vite saturé, c'est à dire pouvant contenir plus de vapeur d'eau que l'air à 20°C, l'être humain ressentira davantage les effets désagréables de l'humidité à 30°C (même si l'humidité est la même). Inversement, une journée humide semblera plus chaude qu'une journée où la température est plus élevée mais l'air plus sec.
L'humidité relative idéale recommandée
D'une manière générale, une humidité relative située entre 30 et 70% recouvre toutes les fourchettes d'humidité conseillées. En Belgique, il est officiellement recommandé d'avoir une humidité située entre 40 et 70%, tandis que selon des experts français, l'humidité relative conseillée se trouve entre 45 et 65%. Dans le milieu médicale, on recommande un taux entre 40 et 60%, une humidité trop faible pouvant occasionner des complications respiratoires. Ainsi, une humidité relative inférieure à 30% est trop peu pour un logement : les personnes confrontées à un tel environnement devront aérer pour renouveler l'air.
Les valeurs critiques de l'humidité relative
Un taux d'humidité relative idéale se situe donc entre 30% et 70%. En France, l'air ambiant extérieur est à 70-80% de degré d'hygrométrie. Naturellement, cette tendance est une moyenne et dépend de la localisation et de la température. Aux Philippines, l'air est littéralement saturé d'humidité puisqu'il frôle les 100% : les crèmes hydratantes ne sont pas commercialisées dans ces contrées. Si vous avez des fleurs, prévoyez au moins 50% d'hygrométrie pour leur bien-être. En revanche, en hiver, l'humidité relative se situera plutôt entre 30 et 50% afin de prévenir la formation de condensation sur les fenêtres, pour une température moyenne située entre 18 et 24°C.
Le montage
Capteur de CO2 sur prise UART
Capteur d'humidité et temperature sur D2
Interrupeteur sur D3
Ecran LCD sur un des I2C
La captation peut se faire soit sur batterie ou branchée sur une prise USB d'un ordinateur ou d'un adaptateur pour téléphone portable 5V
L'interrupteur permet d'allumer ou d'éteindre l'écran LCD (5V) qui doit être éteint quand on est sur la batterie qui ne fournit que 3.3V
Les informations sont enregistrées sur la carte micro SD dans un fichier CO2.txt (un adaptateur SD est fournit)
Pensez à récupérer le fichier une fois votre captation terminée et supprimez-le pour les prochains utilisateurs.
Il faut quelques minutes pour que les capteurs se stabilisent.
Les informations sont enregistré sous la forme suivante:
secondes , co2 , temperature , humidité
les interupteurs de la carte linkit one
1) Mode normal en bas / Mode lecteur de carte en haut
2) Alimenté par la batterie en bas / par le port micro USB en haut (éteint si pas branché)
3) Pour enregistrer sur la carte SD en bas / en haut pour enregistrer sur la mémoire intégrée (10mo)
Code source
// Capteur de confinement // temps , Temperature , CO2 , humidité // Enregistrement sur carte SD #include <LSD.h> #include <LBattery.h> //Capteur de co2 const unsigned char cmd_get_sensor[] = { 0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; unsigned char dataRevice[9]; int temperature; int CO2PPM; //Capteur d'humidité et temperature #include "DHT.h" #define DHTPIN 2 // what pin we're connected to #define DHTTYPE DHT22 // DHT 22 (AM2302) DHT dht(DHTPIN, DHTTYPE); float tDHT; float hDHT; // Ecran LCD #include <Wire.h> #include "rgb_lcd.h" rgb_lcd lcd; const int switchLCDPin = 3; int switchState = 0; // variable pour lire l'état de l'interupteur // Caracteres spéciaux pour afficher le niveau de battrie sur l'écran LCD void setup() { dht.begin(); // initialise le capteur d'humidité Serial1.begin(9600); //démarre la communication avec le capteur de CO2 //Ouvre le port serie Serial.begin(115200); Serial.print("Initialisation de la carte SD..."); LSD.begin(); Serial.println("carte initialisée."); //Quelques infos Serial.println(" 350~450 ppm : Environnement exterieur"); Serial.println(" 350~1000 ppm : L'air est frais"); Serial.println(" 1000~2000 ppm : L'air est stagnante et vous vous sentez fatigue"); Serial.println(" 2000~5000 ppm : Maux de tete, sommeil, incapable de vous concentrer et meme une legere nausee"); Serial.println(" >5000 ppm : grave epuisement de l'oxygene, des lesions cerebrales permanentes et meme la mort"); pinMode(switchLCDPin, INPUT); // configuration de l'interrupteur switchState = digitalRead(switchLCDPin); // Lecture de l'état de l'interupteur lcd.begin(16, 2); // Initialisation de l'écran LCD if (switchState){ // Si le bouton est sur On lcd.display(); //Démarage de l'affichage lcd.setRGB(5,5,5); //définition des couleurs du rétro-éclairage lcd.createChar(0, bat100); //Enregistrement du caractere pour afficher le niveau de battrie a 100% lcd.createChar(1, bat66); //Enregistrement du caractere pour afficher le niveau de battrie a 66% lcd.createChar(2, bat33); //Enregistrement du caractere pour afficher le niveau de battrie a 33% lcd.createChar(3, bat0); //Enregistrement du caractere pour afficher le niveau de battrie a 0% } else { // Sinon lcd.noDisplay(); // on éteind l'écran } } void loop() { String dataString = ""; // Déclaration d'une chaine de caractere pour stoquer les données: int ret = dht.readHT(&tDHT,&hDHT); // lecture de la temperature de l'humidité if(dataRecieve() && hDHT > 0 ) //Si on a recus des donnée du capteur de CO2 et d'humidité { //Création de la chaine de caractere avec toutes les infos des capteurs dataString += millis()/1000; dataString += ","; //dataString += String(temperature); //dataString += ","; dataString += String(CO2PPM); dataString += ","; dataString += String(tDHT); dataString += ","; dataString += String(hDHT); info(dataString); // Appel de la fonction qui gere l'affichage sur le LCD LFile dataFile = LSD.open("CO2.txt", FILE_WRITE); // ouverture du fichier CO2 // Si le fichier est ouvert on ecris les données if (dataFile) { dataFile.println(dataString); // Ajout dans le fichier de la chaine de caractere dataString dataFile.close(); //Fermeture du fichier } else { Serial.println("erreur d'ouverture du fichier CO2.txt"); } } delay(2000); // On attend 2 secondes } bool dataRecieve(void) { byte data[9]; int i = 0; //transmt command data for(i=0; i<sizeof(cmd_get_sensor); i++) { Serial1.write(cmd_get_sensor[i]); } delay(10); //begin reveiceing data if(Serial1.available()) { while(Serial1.available()) { for(int i=0;i<9; i++) { data[i] = Serial1.read(); } } } if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7]))) != data[8]) { return false; } CO2PPM = (int)data[2] * 256 + (int)data[3]; temperature = (int)data[4] - 40; return true; } void info(String data) { switchState = digitalRead(switchLCDPin); if (switchState){ lcd.display(); lcd.setRGB(map(CO2PPM,350,5000,0,100),5,map(CO2PPM,350,5000,20,5)); lcd.clear(); lcd.print("CO2:"); lcd.setCursor(4,0); lcd.print(CO2PPM); lcd.setCursor(0,1); lcd.print("T:"); lcd.setCursor(2,1); lcd.print(tDHT); lcd.setCursor(9,1); lcd.print("H:"); lcd.setCursor(11,1); lcd.print(hDHT); lcd.setCursor(10,0); char buffer[16]; sprintf(buffer, "%02d:%02d", millis()/1000/60 , (millis()/1000)%60); lcd.print(buffer); lcd.setCursor(15,0); switch (LBattery.level()) { case 100: lcd.write((unsigned char)0); break; case 66: lcd.write((unsigned char)1); break; case 33: lcd.write((unsigned char)2); break; default: lcd.write((unsigned char)3); break; } } else { lcd.setRGB(0,0,0); lcd.noDisplay(); Serial.println(data); } }