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

Der folgende Beitrag wurde uns von dem Leser Miguel Torres Gordo zugesandt. Nachdem Bernd Albrecht die Blogreihe zu einem ähnlichen Thema mit MQ-2 und DHT22 am ESP8266 gestartet hat, gibt es hier eine Alternative für ATmega328 Mikrocontroller und MQ-135 / DHT11 Sensoren. Viel Spaß beim Lesen und nachbasteln!

Da es sehr wichtig ist, den Sättigungsgrad der Umgebung zu kennen, zum Beispiel am Arbeitsplatz, habe ich im Internet nach einem Sensor gesucht, der mit Arduino verwendet werden kann, um den CO2-Gehalt zu messen. Glücklicherweise habe ich einen Sensor gefunden, der die Luftqualität misst. Es handelt sich um den MQ-135, der, wie man im Datenblatt sehen kann, bestimmte Stoffe messen kann, wie NH3, Alkohol, Benzol, Rauch, CO2 usw. So bin ich auf diesen Sensor gestoßen.

Da ich wusste, dass es die Möglichkeit gab, ihn zusammen mit unserem ATmega328 Mikrocontroller zu verwenden, suchte ich als erstes nach den Sicherheitsgrenzwerten für CO2 in Teilen pro Million (ppm) für Wohnungen, Räume und Gebäude, die laut verschiedenen Studien zwischen 400 und 800 ppm liegen können. Jetzt, da ich den richtigen Sensor und die Sicherheitsgrenzwerte kannte, war es an der Zeit, ein nützliches Projekt zu entwerfen, das uns diese Informationen anzeigt und uns auch über Temperatur und Luftfeuchtigkeit informiert.

Ziel dieses Projekts ist es daher, die CO2-Konzentration in Teilen pro Million zu messen, sie auf einem Bildschirm anzuzeigen und uns eine akustische Warnung zu geben, wenn sie eine gefährliche Konzentration erreicht, sowie uns über die Temperatur und Luftfeuchtigkeit zu informieren. Um die Lebensdauer des Bildschirms zu verlängern, hielt ich es für eine gute Option, drei verschiedenfarbige LEDs anzubringen, die uns eine schnelle visuelle Information über die Höhe der CO2-Konzentration geben, ohne dass wir die Daten sehen müssen. Nachdem das alles installiert ist, können wir uns an die Arbeit machen.

Benötigte Hardware

Anzahl Bauteil
1 ATmega328p Mikrocontroller
1 MQ-135 Luftqualitätssensor
1 DHT-11 Temperatur- und Feuchtigkeitssensor
1 MT3608 DC-DC-Adapter
1 LED 1x rot, 1x gelb, 1x grün
1 Zweifarbiges OLED I2C 128x64 Pixel Display 1,3 Zoll (hier in SW)
2 1K-Widerstände
1 Widerstand 220 Ohm
1 Buzzer

    Die erforderliche Software

    Beschreibung der Funktionsweise der Schaltung

    Die Funktionsweise dieser Schaltung ist sehr einfach. Der MQ-135-Sensor misst die CO2-Konzentration in Teilen pro Million, der DHT-11-Sensor misst die Temperatur und die Luftfeuchtigkeit. Diese drei Daten werden an einen zweifarbigen OLED-Bildschirm mit 0,96 Zoll gesendet, um jeden Wert für 3 Sekunden in Intervallen von 1 Minute anzuzeigen. Der Bildschirm bleibt während dieser Zeit ausgeschaltet. Diese Zeitwerte können konfiguriert werden. Während der Bildschirm ausgeschaltet bleibt, informieren uns die drei LEDs visuell über die vorhandenen CO2-Werte. Die grüne LED leuchtet, wenn die Konzentration gleich oder kleiner als 550 ist. Die gelbe LED leuchtet, wenn die Konzentration zwischen 551 und 799 Teilen pro Million CO2 liegt und die rote LED leuchtet zusammen mit einem Summerton, wenn die Konzentration 799 Teile pro Million übersteigt. Diese drei Werte können auch konfiguriert werden.

    Vorbereitung und Einstellung der RZERO-Widerstandsreferenz für den atmosphärischen CO2-Gehalt

    Als erstes muss der MQ-135-Sensor vorbereitet werden, damit er die richtigen Werte misst, die wir im nächsten Schritt verwenden werden. Dazu muss der Sensor im Neuzustand etwa 2 Stunden lang mit 5 Volt betrieben werden, damit die bei der Herstellung entstandenen Verunreinigungen beseitigt werden. Danach ist es am besten, den Referenzabgleich des RZERO-Widerstands in der endgültigen Schaltung vorzunehmen, da dies mit den normalerweise verwendeten Versorgungs- und Betriebsspannungen geschieht und die Messung optimal ist.

    Schaltungsaufbau

    Schaltungsaufbau

    Ziel dieser Kalibrierung ist es, den Widerstand des atmosphärischen CO2-Niveaus so einzustellen, dass der MQ-135-Sensor eine Konzentration zwischen 300 und 450 ppm misst, was der normalen Konzentration dieses Gases in der Umwelt entspricht. Es ist sehr wichtig, den Sensor unabhängig mit 5 VDC zu versorgen, da er 850 mW verbraucht.

    Wenn alles angeschlossen ist, starten wir die Arduino-IDE, laden und starten den Sketch "MQ135_calibration.ino". Zuvor muss die MQ135-Bibliothek installiert werden. Wir öffnen den seriellen Monitor und sehen den ppm-Messwert; wir müssen den RZERO-Wert in der Datei MQ135.h im Bibliotheksordner der Arduino IDE ändern und speichern, bis der ppm-Messwert derjenige ist, den wir als Arbeitsreferenz der Schaltung belassen wollen. Der zu ändernde Wert ist der grün gefärbte Wert.

     /// Kalibrierungswiderstand bei atmosphärischem CO2-Niveau
     /// Ändern Sie diesen Wert, bis der ppm-Wert 450 beträgt.
     #define RZERO 22500

    Um die Einstellung vorzunehmen, müssen wir den Wert von RZERO ändern, die Änderungen der Datei MQ135.h der Bibliothek in ihrem Ordner der Arduino IDE speichern und den Kalibrierungs-Sketch neu laden, den neuen Wert der CO2-Konzentration im seriellen Monitor überprüfen und den Vorgang wiederholen, um RZERO mit dem Wert einzustellen, den wir als Referenz für die CO2-Konzentration in der Luft für die Warngrenzen im Sketch unseres Projekts lassen wollen.

    Sketch MQ135_Kalibrierung für RZERO-Abgleich (download):

     #include "MQ135.h"
     #define RZERO 1
     
     MQ135 gasSensor = MQ135(A0);
     int val;
     int sensorPin = A0;
     int sensorValue = 0;
     
     void setup() {
       Serial.begin(115200);
       pinMode(sensorPin, INPUT);
     }
     
     void loop() {
       val = analogRead(A0);
       Serial.print ("raw = ");
       Serial.println (val);
       float zero = gasSensor.getRZero();
       Serial.print ("rzero: ");
       Serial.println (zero);
       float ppm = gasSensor.getPPM();
       Serial.print ("ppm: ");
       Serial.println (ppm);
       delay(2000);
     }

    Wenn wir die CO2-Konzentration in Teilen pro Million richtig abgelesen haben, ist es an der Zeit, den Sketch CO2_monitor.ino zu laden, der uns die Informationen über diese Konzentration, die Luftfeuchtigkeit und die Temperatur an dem Ort liefert, an dem wir die Werte Messen wollen.

    Sketch CO2_monitor (Download):

     /*************   Necessary libraries for the project    **************************/
     #include <Wire.h>
     #include <Adafruit_GFX.h>
     #include <Adafruit_SSD1306.h>
     #include <DHT.h>
     #include "pitches.h"
     
     /*************   Screen parameters   ********************************************/
     #define SCREEN_WIDTH 128
     #define SCREEN_HEIGHT 64
     Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
     
     /******   Humidity and temperature sensor DHT-11 paramters and variables   *****/
     #define DHTPIN 2
     #define DHTTYPE DHT11
     DHT dht(DHTPIN, DHTTYPE);
     float t, h;
     
     /******************   MQ-135 sensor parameteres and variables   ****************/
     #define RZERO 1
     #include "MQ135.h"
     MQ135 gasSensor = MQ135(A0);
     int val;
     int sensorPin = A0;
     int sensorValue = 0;
     float ppm, zero;
     
     /*****************   LEDs   ****************************************************/
     #define led_verde 3
     #define led_amarillo 4
     #define led_rojo 5
     
     unsigned long tiempo_anterior;  // Time counter
     
     /***********************   SETUP BLOCK   ***************************************/
     void setup( )
     {
       Serial.begin(115200);
       dht.begin();              // DHT-11 initialization
       
       if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Checking display present
         Serial.println(F("SSD1306 allocation failed"));
         for(;;);
      }
       delay(2000);
       display.clearDisplay();        // Initialization screen and
       display.setTextColor(WHITE);  // config text color
       
       pinMode(sensorPin, INPUT);    // MQ-135 pin data
     
       pinMode(led_verde, OUTPUT);
       pinMode(led_amarillo, OUTPUT);
       pinMode(led_rojo, OUTPUT);
       digitalWrite(led_verde, LOW);
       digitalWrite(led_amarillo, LOW);
       digitalWrite(led_rojo, LOW);
     
     }
     
     /***********************   LOOP BLOCK   *************************************/
     void loop( ) {
     
       t = dht.readTemperature();    // Read temperature
       h = dht.readHumidity();        // Read Humidity
     
       if (isnan(h) || isnan(t)) {    // If there aren't temperature and
         Serial.println("Fallo de lectura del sensor DHT !!!"); // humidity read, show message to inform
      }
     
       val = analogRead(A0);        // CO2 read
       zero = gasSensor.getRZero();  // Calibration value for the MQ-135 sensor
       ppm = gasSensor.getPPM();      // Formula in the library for obtaín the ppm of CO2
     
       chequeo_led ();              // Go and run to LEDs check method
       
       Serial.print( "T = " );        // Show values by the Serial Port
       Serial.print(t);
       Serial.print(" ºC, H = ");
       Serial.print(h);
       Serial.print( "%, " );
       Serial.print ("raw = ");
       Serial.print (val);
       Serial.print (", rzero: ");
       Serial.print (zero);
       Serial.print (", ppm: ");
       Serial.println (ppm);
       delay (1000);
     
       if ( millis()-tiempo_anterior >= 60000) { // If the time past is most or equal than 60 sg
             encendido_pantalla();    // Execute the turn on screen method.
             tiempo_anterior = millis(); // Save the actual time.
      }
     }
     
     void chequeo_led() {
       if (ppm >= 800) {              // If the CO2 concentration is equal o most than 800
         digitalWrite(led_rojo, HIGH);        // Turn on de red LED
         tone(8, NOTE_C5, 5000);            // Buzzer sound
         display.clearDisplay();            // Set the screen parameters to show the PPM value
         display.setTextSize(2);
         display.setCursor(7,0);
         display.print("CO2 (PPM):");
         display.setTextSize(3);
         display.setCursor(40,35);
         display.print(ppm,0);
         display.display();
         delay(10000);
      } else {
         digitalWrite(led_rojo, LOW);
         display.clearDisplay();
         display.display(); }
       
       if (ppm >= 551 && ppm <= 799) {
         digitalWrite(led_amarillo, HIGH); // The yellow LED turno on if the CO2 concentration
      } else {
         digitalWrite(led_amarillo, LOW); }    // is between 551 and 799
       
       if (ppm <= 550) {
         digitalWrite(led_verde, HIGH); // The green LED turn on only when the CO2
      } else {
         digitalWrite(led_verde, LOW); }      // concentration is most low than 551
     }
     
     void encendido_pantalla() {    // Turn on screen method
       display.clearDisplay();              // Set the screen parameters and show the PPM value
       display.setTextSize(2);
       display.setCursor(7,0);
       display.print("CO2 (PPM):");
       display.setTextSize(3);
       display.setCursor(40,35);
       display.print(ppm,0);
       display.display();
       delay(3000);
       
       display.clearDisplay();              // Set the display parameters and show the Humidity value
       display.setTextSize(2);
       display.setCursor(20,0);
       display.print("HUMEDAD:");
       display.setTextSize(3);
       display.setCursor(20,35);
       display.print(h,1);
       display.setCursor(90,35);
       display.print("%");
       display.display();
       delay(3000);
       
       display.clearDisplay();              // Set the display parameters and show the Temperature value
       display.setTextSize(2);
       display.setCursor(40,0);
       display.print("TEMP:");
       display.setTextSize(3);
       display.setCursor(5,35);
       display.print(t,1);
       display.setCursor(85,35);
       display.cp437(true);
       display.write(167);
       display.setCursor(107,35);
       display.print("C");
       display.display();
       delay(3000);
       
       display.clearDisplay();
       display.display();
     }

    Schaltungsaufbau
    Schaltungsaufbau

    Danke an Miguel Torres Gordo für seinen Beitrag.

    DisplaysFür arduinoProjekte für anfängerSensoren

    5 Kommentare

    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

    Einen Kommentar hinterlassen

    Alle Kommentare werden vor der Veröffentlichung moderiert

    Empfohlene Blogbeiträge

    1. ESP32 jetzt über den Boardverwalter installieren
    2. Lüftersteuerung Raspberry Pi
    3. Arduino IDE - Programmieren für Einsteiger - Teil 1
    4. ESP32 - das Multitalent
    5. OTA - Over the Air - ESP Programmieren über WLAN