Capteur de Temperature / CO2 / Humidité avec afficheur

 Materiel :

 

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

  1.  // Capteur de confinement
  2.  // temps , Temperature , CO2 , humidité
  3.  // Enregistrement sur carte SD
  4.  #include <LSD.h>
  5.  #include <LBattery.h>
  6.  
  7.  //Capteur de co2
  8.  const unsigned char cmd_get_sensor[] = { 0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 };
  9.  unsigned char dataRevice[9];
  10.  int temperature;
  11.  int CO2PPM;
  12.  
  13.  //Capteur d'humidité et temperature
  14.  #include "DHT.h"
  15.  #define DHTPIN 2 // what pin we're connected to
  16.  #define DHTTYPE DHT22 // DHT 22 (AM2302)
  17.  DHT dht(DHTPIN, DHTTYPE);
  18.  float tDHT;
  19.  float hDHT;
  20.  
  21.  // Ecran LCD
  22.  #include <Wire.h>
  23.  #include "rgb_lcd.h"
  24.  rgb_lcd lcd;
  25.  const int switchLCDPin = 3;
  26.  int switchState = 0; // variable pour lire l'état de l'interupteur
  27.  // Caracteres spéciaux pour afficher le niveau de battrie sur l'écran LCD
  28.  
  29.  
  30.  void setup() {
  31.   dht.begin(); // initialise le capteur d'humidité
  32.   Serial1.begin(9600); //démarre la communication avec le capteur de CO2
  33.  
  34.   //Ouvre le port serie
  35.   Serial.begin(115200);
  36.   Serial.print("Initialisation de la carte SD...");
  37.   LSD.begin();
  38.   Serial.println("carte initialisée.");
  39.  
  40.   //Quelques infos
  41.   Serial.println(" 350~450 ppm : Environnement exterieur");
  42.   Serial.println(" 350~1000 ppm : L'air est frais");
  43.   Serial.println(" 1000~2000 ppm : L'air est stagnante et vous vous sentez fatigue");
  44.   Serial.println(" 2000~5000 ppm : Maux de tete, sommeil, incapable de vous concentrer et meme une legere nausee");
  45.   Serial.println(" >5000 ppm : grave epuisement de l'oxygene, des lesions cerebrales permanentes et meme la mort");
  46.  
  47.   pinMode(switchLCDPin, INPUT); // configuration de l'interrupteur
  48.   switchState = digitalRead(switchLCDPin); // Lecture de l'état de l'interupteur
  49.   lcd.begin(16, 2); // Initialisation de l'écran LCD
  50.   if (switchState){ // Si le bouton est sur On
  51.   lcd.display(); //Démarage de l'affichage
  52.   lcd.setRGB(5,5,5); //définition des couleurs du rétro-éclairage
  53.   lcd.createChar(0, bat100); //Enregistrement du caractere pour afficher le niveau de battrie a 100%
  54.   lcd.createChar(1, bat66); //Enregistrement du caractere pour afficher le niveau de battrie a 66%
  55.   lcd.createChar(2, bat33); //Enregistrement du caractere pour afficher le niveau de battrie a 33%
  56.   lcd.createChar(3, bat0); //Enregistrement du caractere pour afficher le niveau de battrie a 0%
  57.   } else { // Sinon
  58.   lcd.noDisplay(); // on éteind l'écran
  59.   }
  60.  }
  61.  
  62.  void loop() {
  63.   String dataString = ""; // Déclaration d'une chaine de caractere pour stoquer les données:
  64.   int ret = dht.readHT(&tDHT,&hDHT); // lecture de la temperature de l'humidité
  65.   if(dataRecieve() && hDHT > 0 ) //Si on a recus des donnée du capteur de CO2 et d'humidité
  66.   {
  67.   //Création de la chaine de caractere avec toutes les infos des capteurs
  68.   dataString += millis()/1000;
  69.   dataString += ",";
  70.   //dataString += String(temperature);
  71.   //dataString += ",";
  72.   dataString += String(CO2PPM);
  73.   dataString += ",";
  74.   dataString += String(tDHT);
  75.   dataString += ",";
  76.   dataString += String(hDHT);
  77.  
  78.   info(dataString); // Appel de la fonction qui gere l'affichage sur le LCD
  79.  
  80.   LFile dataFile = LSD.open("CO2.txt", FILE_WRITE); // ouverture du fichier CO2
  81.   // Si le fichier est ouvert on ecris les données
  82.   if (dataFile) {
  83.   dataFile.println(dataString); // Ajout dans le fichier de la chaine de caractere dataString
  84.   dataFile.close(); //Fermeture du fichier
  85.   } else {
  86.   Serial.println("erreur d'ouverture du fichier CO2.txt");
  87.   }
  88.   }
  89.   delay(2000); // On attend 2 secondes
  90.  }
  91.  
  92.  bool dataRecieve(void)
  93.  {
  94.   byte data[9];
  95.   int i = 0;
  96.   //transmt command data
  97.   for(i=0; i<sizeof(cmd_get_sensor); i++)
  98.   {
  99.   Serial1.write(cmd_get_sensor[i]);
  100.   }
  101.   delay(10);
  102.   //begin reveiceing data
  103.   if(Serial1.available())
  104.   {
  105.   while(Serial1.available())
  106.   {
  107.   for(int i=0;i<9; i++) { data[i] = Serial1.read(); }
  108.   }
  109.   }
  110.   if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3]
  111.   + data[4] + data[5] + data[6] + data[7]))) != data[8])
  112.   {
  113.   return false;
  114.   }
  115.   CO2PPM = (int)data[2] * 256 + (int)data[3];
  116.   temperature = (int)data[4] - 40;
  117.  
  118.   return true;
  119.  }
  120.  
  121.  void info(String data)
  122.  {
  123.   switchState = digitalRead(switchLCDPin);
  124.   if (switchState){
  125.   lcd.display();
  126.   lcd.setRGB(map(CO2PPM,350,5000,0,100),5,map(CO2PPM,350,5000,20,5));
  127.   lcd.clear();
  128.   lcd.print("CO2:");
  129.   lcd.setCursor(4,0);
  130.   lcd.print(CO2PPM);
  131.   lcd.setCursor(0,1);
  132.   lcd.print("T:");
  133.   lcd.setCursor(2,1);
  134.   lcd.print(tDHT);
  135.   lcd.setCursor(9,1);
  136.   lcd.print("H:");
  137.   lcd.setCursor(11,1);
  138.   lcd.print(hDHT);
  139.   lcd.setCursor(10,0);
  140.   char buffer[16];
  141.   sprintf(buffer, "%02d:%02d", millis()/1000/60 , (millis()/1000)%60);
  142.   lcd.print(buffer);
  143.   lcd.setCursor(15,0);
  144.   switch (LBattery.level()) {
  145.   case 100:
  146.   lcd.write((unsigned char)0);
  147.   break;
  148.   case 66:
  149.   lcd.write((unsigned char)1);
  150.   break;
  151.   case 33:
  152.   lcd.write((unsigned char)2);
  153.   break;
  154.   default:
  155.   lcd.write((unsigned char)3);
  156.   break;
  157.   }
  158.   } else {
  159.   lcd.setRGB(0,0,0);
  160.   lcd.noDisplay();
  161.   Serial.println(data);
  162.   }
  163.  }