Überwachung von CO2, Temperatur und Luftfeuchtigkeit mit MQ-135 und DHT11 - AZ-Delivery

La contribution suivante nous a été envoyée par le lecteur Miguel Torres Gordo. Après que Bernd Albrecht ait commencé la série de blog sur un sujet similaire avec MQ-2 et DHT22 sur ESP8266, voici une alternative pour les microcontrôleurs ATmega328 et les capteurs MQ-135 / DHT11.
Bonne lecture et bon bricolage :

Comme il est très important de connaître le niveau de saturation de l'environnement, par exemple sur le lieu de travail, j'ai cherché sur Internet un capteur pouvant être utilisé avec Arduino pour mesurer la teneur en CO2. Heureusement, j'ai trouvé un capteur qui mesure la qualité de l'air. Il s'agit du MQ-135, qui, comme vous pouvez le voir dans la fiche technique, peut mesurer certaines substances, comme le NH3, l'alcool, le benzène, la fumée, le CO2, etc. C'est ainsi que je suis tombé sur ce capteur.

Sachant qu'il était possible de l'utiliser avec notre microcontrôleur ATmega328, la première chose que j'ai faite a été de rechercher les limites de sécurité pour le CO2 en parties par million (ppm) pour les maisons, les pièces et les bâtiments, qui, selon diverses études, peuvent aller de 400 à 800 ppm. Maintenant que je disposais du bon capteur et des limites de sécurité, il était temps de concevoir un projet utile qui nous montrerait ces informations et nous renseignerait également sur la température et l'humidité.

L'objectif de ce projet est donc de mesurer la concentration de CO2 en parties par million, de l'afficher sur un écran et de nous donner un avertissement sonore lorsqu'elle atteint une concentration dangereuse, ainsi que de nous informer sur la température et l'humidité. Pour prolonger la durée de vie de l'écran, j'ai pensé qu'il serait bon de fixer trois LED de couleurs différentes pour nous donner des informations visuelles rapides sur le niveau de concentration de CO2 sans avoir à voir les données. Une fois tout cela installé, nous pouvons nous mettre au travail.

Matériel nécessaire

Nombre Composantes
1 Nano V3.0 CH340 avec câble USB
1 Module de qualité de l'air du capteur de gaz MQ-135
1 Capteur de température et d'humidité DHT11
1 Adaptateur MT3608 DC-DC
1 Led : 1x rouge ; 1x jaune ; 1x vert
1 1,3 pouce OLED I2C 128 x 64 pixels d’affichage
2 Résistance 1K
1 Résistance 220 ohms
1 Buzzer.

    Logiciels requis

    Description du fonctionnement du circuit

    Le fonctionnement de ce circuit est très simple. Le capteur MQ-135 mesure la concentration de CO2 en parties par million, le capteur DHT-11 mesure la température et l'humidité. Ces trois données sont envoyées à un écran OLED bicolore de 0,96 pouce qui affiche chaque valeur pendant 3 secondes à intervalles d'une minute. L'écran reste éteint pendant ce temps. Ces valeurs de temps peuvent être configurées. Alors que l'écran reste éteint, les trois LEDs nous informent visuellement des valeurs de CO2 présentes. Le voyant vert s'allume lorsque la concentration est égale ou inférieure à 550. La LED jaune s'allume lorsque la concentration est comprise entre 551 et 799 parties par million de CO2 et la LED rouge s'allume avec un signal sonore lorsque la concentration dépasse 799 parties par million. Ces trois valeurs peuvent également être configurées.

    Préparation et ajustement de la référence de la résistance RZERO pour la concentration de CO2 atmosphérique

    La première chose à faire est de préparer le capteur du MQ-135 afin qu'il mesure les valeurs correctes que nous utiliserons à l'étape suivante. Pour ce faire, le capteur doit être mis sous 5 volts pendant environ 2 heures lorsqu'il est neuf, afin d'éliminer les impuretés créées lors de la fabrication. Ensuite, il est préférable d'effectuer le réglage de référence de la résistance RZERO dans le circuit final, car cela se fait avec les tensions d'alimentation et de fonctionnement normalement utilisées et la mesure est optimale.

    Cycle

    Cycle

    L'objectif de cet étalonnage est d'ajuster la résistance du niveau de CO2 atmosphérique afin que le capteur MQ-135 mesure une concentration comprise entre 300 et 450 ppm, ce qui correspond à la concentration normale de ce gaz dans l'environnement. Il est très important d'alimenter le capteur de manière indépendante avec 5 VDC, car il consomme 850 mW.

    Quand tout est connecté, on démarre l'IDE Arduino, on charge et on lance le sketch "MQ135_calibration.ino". Avant cela, la bibliothèque MQ135 doit être installée. On ouvre le moniteur série et on voit la lecture ppm ; on doit changer la valeur RZERO dans le fichier MQ135.h dans le dossier library de l'IDE Arduino et sauvegarder jusqu'à ce que la lecture ppm soit celle qu'on veut laisser comme référence de travail du circuit. La valeur à modifier est la valeur colorée en vert.

     Résistance à l'étalonnage au niveau atmosphérique de CO2
     Changez cette valeur jusqu'à ce que la valeur ppm soit de 450.
     « 35; définition R0 22500

    Pour effectuer l'ajustement, on doit changer la valeur de RZERO, enregistrer les changements dans le fichier MQ135.h de la bibliothèque dans son dossier Arduino IDE et recharger le sketch de calibration, vérifier la nouvelle valeur de la concentration de CO2 dans le moniteur série et répéter le processus pour régler RZERO avec la valeur que nous voulons laisser comme référence pour la concentration de CO2 dans l'air pour les limites d'avertissement dans le sketch de notre projet.

    Sketch MQ135_Calibration pour le réglage de RZERO (Télécharger):

     « 35; y compris « mq135.h»
     « 35; définition R0 1
     
     Mq135 Gaz = Mq135(A0);
     Int Sélectionner;
     Int Sensation de relâchement = A0;
     Int Valeur du capteur = 0;
     
     Vide Paramètres() {
       En série.C'est parti.(115200);
       Pinmode(Sensation de relâchement, Entrée);
     }
     
     Vide Exécution() {
       Sélectionner = Simulation(A0);
       En série.Imprimer ("Original =");
       En série.Publications imprimées (Sélectionner);
       Flottant Zéro. = Gaz.Getrzero();
       En série.Imprimer ("Criro:);
       En série.Publications imprimées (Zéro.);
       Flottant Parties par million = Gaz.Getppm();
       En série.Imprimer ("Parties par million:);
       En série.Publications imprimées (Parties par million);
       Retard(2000);
     }

    Lorsque nous avons correctement lu la concentration de CO2 en parties par million, il est temps de charger le sketch CO2_monitor.ino, qui nous donne les informations sur cette concentration, l'humidité et la température à l'endroit où l'on veut mesurer les valeurs.

    Sketch CO2_monitor (Télécharger):

     Bibliothèques nécessaires au projet
     35; y compris < wire.h >
     « 35; y compris < adafruit'u gfx.h >
     « 35; comprend < adafruit < ssd1306.h >
     « 35; y compris < dht.h >
     « 35; y compris « pitches.h»
     
     Paramètres de l'écran
     "; définir la largeur de l'écran" U "128
     "35; définir l'écran" U hauteur 64
     Adafruit ssd1306 Afficher(Largeur de l'écran, Permissions de filtrage, &Fils électriques, -1);
     
     Capteur d'humidité et de température DHT - 11 paramètres et variables
     35; définition dhtpin 2
     35; définition du type DHT dht11
     DHT T(Dhtpine, Objet);
     Flottant T, H;
     
     Paramètres et variables du capteur MQ - 135
     « 35; définition R0 1
     « 35; y compris « mq135.h»
     Mq135 Gaz = Mq135(A0);
     Int Sélectionner;
     Int Sensation de relâchement = A0;
     Int Valeur du capteur = 0;
     Flottant Parties par million, Zéro.;
     
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     Définir la glace verte 3
     « 35; définition de la glace Amarillo
     "35; glace définie
     
     C'est inapproprié. Long Tibia antérieur;  Minuterie
     
     Bloc de configuration
     Vide Paramètres( )
     {
       En série.C'est parti.(115200);
       T.C'est parti.();              Initialisation DHT - 11
       
       Si(!Afficher.C'est parti.(Commutateur capvcc ssd1306, 0x3c)) { Vérifier la présence de l'affichage
         En série.Publications imprimées(F("L'allocation ssd1306 a échoué"));
         Pour(;;);
      }
       Retard(2000);
       Afficher.C'est clair.();        Initialiser les écrans et
       Afficher.Settextcolor(Blanc);  Configurer la couleur du texte
       
       Pinmode(Sensation de relâchement, Entrée);    MQ - 135 pin Data
     
       Pinmode(Vert glace, Produits);
       Pinmode(Amarillo Ice Hotel, Produits);
       Pinmode(Crème glacée, Produits);
       Écriture numérique(Vert glace, Faible);
       Écriture numérique(Amarillo Ice Hotel, Faible);
       Écriture numérique(Crème glacée, Faible);
     
     }
     
     Bloc d'anneau
     Vide Exécution( ) {
     
       T = T.Lire la température();    Lire la température
       H = T.Lecture de l'humidité();        Lire l'humidité
     
       Si (Ethan.(H) || Ethan.(T)) {    S'il n'y a pas de température et de température
         En série.Publications imprimées("DHT Sensor Reading fallo!!!"); Lecture de l'humidité, affichage des messages à notifier
      }
     
       Sélectionner = Simulation(A0);        Lecture du CO2
       Zéro. = Gaz.Getrzero();  Valeur d'étalonnage du capteur MQ - 135
       Parties par million = Gaz.Getppm();      Formule utilisée dans la bibliothèque pour obtenir les ppm de CO2
     
       Czech ice ();              Aller et exécuter la méthode de vérification LED
       
       En série.Imprimer( "T =" );        Afficher les valeurs via le port série
       En série.Imprimer(T);
       En série.Imprimer("C, h =");
       En série.Imprimer(H);
       En série.Imprimer( "%, " );
       En série.Imprimer ("Original =");
       En série.Imprimer (Sélectionner);
       En série.Imprimer ("Corde:" corde);
       En série.Imprimer (Zéro.);
       En série.Imprimer ("Un millionième, un millionième);
       En série.Publications imprimées (Parties par million);
       Retard (1000);
     
       Si ( Millis.()-Tibia antérieur >= 60000) { Si le temps passé est égal ou supérieur à 60 SG
             Pandalum nsendido();    Exécute la méthode d'ouverture de l'écran.
             Tibia antérieur = Millis.(); Enregistrer l'heure actuelle.
      }
     }
     
     Vide Czech ice() {
       Si (Parties par million >= 800) {              Si la concentration de CO2 est égale ou supérieure à 800
         Écriture numérique(Crème glacée, Élevé);        Allumez la LED rouge
         Tonnes(8, Note C5, 5000);            Buzzer Sound
         Afficher.C'est clair.();            Définir les paramètres de l'écran pour afficher les valeurs PPM
         Afficher.Settexsize(2);
         Afficher.Définir le curseur(7,0);
         Afficher.Imprimer(Dioxyde de carbone (PPM):);
         Afficher.Settexsize(3);
         Afficher.Définir le curseur(40,35);
         Afficher.Imprimer(Parties par million,0);
         Afficher.Afficher();
         Retard(10000);
      } Temps de décollage estimé {
         Écriture numérique(Crème glacée, Faible);
         Afficher.C'est clair.();
         Afficher.Afficher(); }
       
       Si (Parties par million >= 551 && Parties par million <= 799) {
         Écriture numérique(Amarillo Ice Hotel, Élevé); Si la concentration de CO2 augmente, la LED jaune s'allume
      } Temps de décollage estimé {
         Écriture numérique(Amarillo Ice Hotel, Faible); }    Entre 551 et 799
       
       Si (Parties par million <= 550) {
         Écriture numérique(Vert glace, Élevé); La LED verte ne s'allume que lorsque le dioxyde de carbone est libéré
      } Temps de décollage estimé {
         Écriture numérique(Vert glace, Faible); }      Concentration inférieure à 551
     }
     
     Vide Pandalum nsendido() {    Méthode d'ouverture de l'écran
       Afficher.C'est clair.();              Définir les paramètres de l'écran et afficher les valeurs PPM
       Afficher.Settexsize(2);
       Afficher.Définir le curseur(7,0);
       Afficher.Imprimer(Dioxyde de carbone (PPM):);
       Afficher.Settexsize(3);
       Afficher.Définir le curseur(40,35);
       Afficher.Imprimer(Parties par million,0);
       Afficher.Afficher();
       Retard(3000);
       
       Afficher.C'est clair.();              Définir les paramètres d'affichage et afficher les valeurs d'humidité
       Afficher.Settexsize(2);
       Afficher.Définir le curseur(20,0);
       Afficher.Imprimer(Maison:);
       Afficher.Settexsize(3);
       Afficher.Définir le curseur(20,35);
       Afficher.Imprimer(H,1);
       Afficher.Définir le curseur(90,35);
       Afficher.Imprimer("%");
       Afficher.Afficher();
       Retard(3000);
       
       Afficher.C'est clair.();              Définir les paramètres d'affichage et afficher les valeurs de température
       Afficher.Settexsize(2);
       Afficher.Définir le curseur(40,0);
       Afficher.Imprimer(Personnel temporaire:);
       Afficher.Settexsize(3);
       Afficher.Définir le curseur(5,35);
       Afficher.Imprimer(T,1);
       Afficher.Définir le curseur(85,35);
       Afficher.Cp437(C'est vrai.);
       Afficher.Écris.(167);
       Afficher.Définir le curseur(107,35);
       Afficher.Imprimer(C);
       Afficher.Afficher();
       Retard(3000);
       
       Afficher.C'est clair.();
       Afficher.Afficher();
     }

    Cycle
    Cycle

    Merci à Miguel Torres Gordo pour sa contribution.

    DisplaysFür arduinoProjekte für anfängerSensoren

    12 commentaires

    Georg Franke

    Georg Franke

    Fazit vorweg: Der MQ135 kann kein CO2 (Kohlenstoffdioxid, Kohlendioxid) messen.
    Ich habe zunächst auch gehofft und geglaubt, dass der MQ135 dies könnte. Ich hatte aus Laubabfällen im Garten Biogas hergestellt, das mitunter brennbar ist oder nicht. Biogas kann u.a. Methan(brennbar) und CO2 enthalten. Um das Gasgemisch zu analysieren, habe ich einen Gaschromatographen(GC) von CMA gekauft und wollte den MQ135 als Gasdetektor verwenden. Der GC trennt die einzelnen Gaskomponenten und führt sie nacheinander zum Detektor. Das hat bei mir bei allen brennbaren Gasen (z.B. Wasserstoff, Propan, Butan, Alkoholdampf, Azetondampf) funktioniert nur eben nicht mit CO2. Im Nachhinein ist mir auch klar geworden, warum es auch theoretisch gar nicht geht: Der MQ135 besitzt eine SnO2-Schicht zur Detektion reduzierender Substanzen. Dieses SnO2 wird dabei teilweise reduziert und dadurch elektrisch leitfähiger, d.h. der Widerstand sinkt. Leider ist CO2 keine reduzierende Verbindung und kann daher nicht mit dem SnO2 reagieren. In einigen früheren Kommentaren wurde bereits darauf hingewiesen, worauf Miguel Torres auf das Datenblatt verwies. Ich habe das Datenblatt gesehen. In einem Diagramm wird der Zusammenhang zwischen Gaskonzentration verschiedener Gase in ppm und dem Widerstand des MQ135 dargestellt. Meine Lehrer hätten mir wahrscheinlich eine glatte 6 gegeben, In der Legende rechts oben stehen einige Gase: Al R oder AI R soll vermutlich Luft (Air) bedeuten, dann kann man mit etwas Fantasie CO2 und CO erkennen, sowie NH4 (soll vielleicht Ammoniak sein, also NH3), den Rest kann ich mir gar nicht zusammenreimen. Es wurden 3 Messpunkte pro Gas eingezeichnet. Über die Messunsicherheit (Toleranzen), sowie Quelle und Reinheit der verwendeten Gase wurden keine Angaben gemacht. Wie gesagt, wir messen im ppm-Bereich, da wirken sich geringste Verunreinigungen stark auf das Messergebnis aus und gaukeln z. B. beim CO2 etwas vor, was gar nicht vorhanden ist.
    Übrigens: Anbieter des MQ135, wie AZ-Delivery oder Reichelt verzichten auf die Nennung von CO2 als detektierbares Gas

    Mario Bluhm

    Mario Bluhm

    Hallo,

    Ich habe den MQ-135 am Pico-w.
    Habe die PI Daten herunter geladen, angeglichen und er liefert werte. Habe zusätzlich einen DHT-11 angeschlossen.

    Jetzt komme ich mit den gelieferten Werten nicht klar. was wird mir angezeigt. Temperatur und Luftfeuchte ist mir klar.

    DHT11 Temperature: 22 Humidity: 48
    MQ135 RZero: 90.50353 Corrected RZero: 92.92871 Resistance: 56.37128 PPM: 261.504 Corrected PPM: 236.589ppm

    Was soll da CO2 sein? Das sollte ein Wert um die 412ppm sein.

    Andreas Wolter

    Andreas Wolter

    @Sirko: könnten Sie bitte so nett sein und dazu schreiben, was aus Ihrer Sicht nicht korrekt ist und was Sie geändert haben?
    Ich kann das an den Autoren weiterleiten und wir korrigieren das dann im Beitrag.
    Vielen Dank.

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Sirko

    Sirko

    Das ganze mal etwas Richtiger (achte auf die auswahl dhd 11 oder dht 22)

    #include
    #include

    /* MQ135 + DHT Temp Sensor

    Combination of the MQ135 air quality sensor and a DHT11/22 temperature sensor to accurately measure ppm values through the library correction. Uses the Adafruit DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library Written by: https://github.com/Phoenix1747/MQ135

    */

    #define PIN_MQ135 A2 // MQ135 Analog Input Pin
    #define DHTPIN 2 // DHT Digital Input Pin
    #define DHTTYPE DHT22 // DHT11 or DHT22, depends on your sensor

    MQ135 mq135_sensor(PIN_MQ135);
    DHT dht(DHTPIN, DHTTYPE);

    float temperature, humidity; // Temp and Humid floats, will be measured by the DHT

    void setup() {
    Serial.begin(9600);

    dht.begin();

    }

    void loop() {
    humidity = dht.readHumidity();
    temperature = dht.readTemperature();

    // Check if any reads failed and exit early (to try again). if (isnan(humidity) || isnan(temperature)) { Serial.println(F(“Failed to read from DHT sensor!”)); return; } float rzero = mq135_sensor.getRZero(); float correctedRZero = mq135_sensor.getCorrectedRZero(temperature, humidity); float resistance = mq135_sensor.getResistance(); float ppm = mq135_sensor.getPPM(); float correctedPPM = mq135_sensor.getCorrectedPPM(temperature, humidity); Serial.print("MQ135 RZero: "); Serial.print(rzero); Serial.print("\t Corrected RZero: "); Serial.print(correctedRZero); Serial.print("\t Resistance: "); Serial.print(resistance); Serial.print("\t PPM: "); Serial.print(ppm); Serial.print(“ppm”); Serial.print("\t Corrected PPM: "); Serial.print(correctedPPM); Serial.print(“ppm”); Serial.print( "\t T = " ); Serial.print(temperature); Serial.print("\t ºC, H = "); Serial.print(humidity); Serial.println( "%, " ); delay(10000);

    }

    Andreas Wolter

    Andreas Wolter

    @Erik Huber: Danke für den Hinweis. Ich habe das an den Autoren weitergegeben. Wir checken das und ändern das dann.

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Erik Huber

    Erik Huber

    Hi, Im Code ist ein Fehler.
    #define RZERO 1
    Es ist zwar definiert, aber nirgends wird es angewendet. Der Korrekte Befehl lautet daher nicht: MQ135 gasSensor = MQ135;
    Sondern: MQ135 gasSensor(A0, RZERO);

    Erst dann kann man den RZERO Wert nutzen.
    Also, den Wert von RZERO auf 1 lassen, dann 12 Stunden den Sensor an der guten Luft lassen mit Stormversorgung. Danach den RZERO Wert ablesen und den Wert im Code bei "#define RZERO " eintragen. Also nur die “1” mit dem Wert austauschen.

    iberotecno

    iberotecno

    Good work, but the problem is the library. The library author Georg Krocker’s says “The library also provides functions to apply the temperature/humidity correction that is shown in Fig 4 of the datasheet, but I do not trust the datasheet there, so this should not be used for the moment.” Source: https://hackaday.io/project/3475-sniffing-trinket/log/12363-mq135-arduino-library I also tryed with this method and the measures are inaccurate. More inaccurate than measures without temperature and humidity correction. We need another solution.

    Miguel Torres

    Miguel Torres

    Hello Philipp,

    The difference in price of the MQ-135 sensor versus the MHZ-19 is very significant for Arduino projects.

    Miguel Torres

    Miguel Torres

    According to the data sheet for this sensor, this also measures CO2. I leave a link where it shows the sensitivity for different gases.
    https://www.olimex.com/Products/Components/Sensors/Gas/SNS-MQ135/resources/SNS-MQ135.pdf

    mi

    mi

    hmmmm – kann es sein, dass der MQ-135 kein CO2 sondern nur CO misst ?

    Philipp Landhäußer

    Philipp Landhäußer

    Hallo,
    ein sehr guter Bericht aber das Problem ist, dass der MG-135 nur CO misst und kein CO2. Dafür wäre eher der MHZ-19 geeignet.

    Mfg

    Andreas Waldbrenner

    Andreas Waldbrenner

    Wäre super, wenn man mit einem Knopfdruck alle Teile im Warenkorb hätte. Oder habe ich diese Funktion übersehen? Andi

    Laisser un commentaire

    Tous les commentaires sont modérés avant d'être publiés

    Articles de blog recommandés

    1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
    2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
    3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
    4. ESP32 - das Multitalent - AZ-Delivery