Dies ist eine alte Version des Dokuments!


WWW CO2-Messungen BIO

Basilikum

Messgerät

  • ARDUINO-NANO
  • 3D-Druckgehäuse

Aufbau

Ergebnis

Vorversuch

48-Stunden-Messung

  • 2 Stunden Licht
  • 6 Stunden Dunkelheit
  • 2 halbe Pflanzen
  • 1 LED

CO2-07

CO2-08

Analyse der Daten:

CO2-Erzeugung (ohne Licht)

Die Daten herausfiltern, in denen die Temperatur konstant und niedrig ist (Lampe aus). In diesen Zeiträumen wird der CO2-Anstieg pro Minute berechnet.

CO2-Aufnahme (mit Licht)

Die Daten herausfiltern, in denen die Temperatur höher ist (Lampe an). In diesen Zeiträumen wird der CO2-Abfall pro Minute berechnet.

Berechnung:

  • Die Rate der CO2-Veränderung (ppm pro Minute) für beide Zustände berechnen.
  • Mit dem Volumen des Gefäßes (5 Liter) wird die CO2-Menge in Mikromol umgerechnet
    • unter Verwendung der idealen Gasgleichung.

Ergebnisse:

Die CO2-Produktion und -Aufnahme pro Minute in relevanten Einheiten angeben.

Beispiel

Nachbau

1. Grundfunktion - UNO mit Sensoren

Material

Steckplan

Code

  • Co2-Messung über PWM-Kommunikation mit dem Sensor
/*********************************************************************************************************
*
* CO2-Sensor, BMP 180 2025-06-12
*
*********************************************************************************************************/

#define ALTITUDE 8.0                       // BMP 180 Borgfelde liegt 8 m ueber dem Meer
#include <Wire.h>                          // BMP 180
#include <SFE_BMP180.h>                    // BMP 180
SFE_BMP180 pressure;                       // BMP 180 - Creating an object pressure
float StartZeit, LaufZeit;                 // Zeitpunkt der Messung
String dataString = "";                    // Ausgabestring
int LeerZeile = 0;

/**************************************
*  für den Betrieb des MH-Z19B        *
**************************************/
  const int pwmpin = 6;                    // Der Sensor hängt an Pin 6
  const int range = 5000;                  // Der eingestellte Messbereich (0-5000ppm)
  int  ppm_pwm = 0;  
/**************************************
*  für den Betrieb des BMP 180        *
**************************************/
  double T, P, p0;                         // Speicher fuer temp, Druck relativer Druck

/**************************************
*  Festlegung Messintervall           *
**************************************/
  const  int SchreibPause = 29998;         // naechste Messung erst nach ca. 30 Sekunden     
  int WarteZeit;
void setup() {
  StartZeit = millis();    

/**************************************
 *  für den Betrieb der Ausgaben      *
 **************************************/ 
  Serial.begin(9600);                       // Serieller Monitor mit 9600 bit/s
 
/**************************************
 *  für den Betrieb des MH-Z19B        *
 **************************************/   
    pinMode(pwmpin, INPUT);                   // PWM-Pin auf Eingang setzen

/**************************************
 *  für den Betrieb des BMP-180       *
 **************************************/   
  if (!pressure.begin()) {
    delay(3000);
    Serial.println("BMP-180 init failed!");   // while(true); // wartet, bis der Sensor sich meldet
  }
  Serial.print("Provided altitude: ");
  Serial.print(ALTITUDE, 0);
  Serial.println(" meters");
}

/*********************************************************************************************************
*
*                            H A U P T P R O G R A M M - Loop
*
*********************************************************************************************************/
void loop() {
  DatenAuslesen();
  SerialAusgabe();
}

/********************************************************************************************************
*
*                            Prozedur Datenauslesen
*
*********************************************************************************************************/
void DatenAuslesen(){
  LaufZeit =  millis() - StartZeit;
  ppm_pwm = readCO2PWM();                     // Messung der PWM-Länge mittels einer eigenen Funktion
  DruckUndTemperaturMessung();
}

/********************************************************************************************************
*
*                            Ausgabe am seriellen Monitor
*
*********************************************************************************************************/
void SerialAusgabe(){
  Serial.print(LaufZeit/1000,0);                   
  Serial.print(" s  | "); 
  Serial.print(ppm_pwm);                   
  Serial.print(" ppm   | "); 
  Serial.print(T,1);                   
  Serial.print(" C  |  "); 
  Serial.print(p0);                  
  Serial.print(" hPa  |  "); 
  Serial.print(P);                  
  Serial.print(" hPa Luftdruck gemessen in Borgfelde 6 m ueber NN"); 
  Serial.println();             
}

/********************************************************************************************************
 * 
 *                 Funktionen zum PWM-Auslese des CO2-Wertes
 *                 
 *********************************************************************************************************/
  int readCO2PWM() {
  unsigned long th;
  int ppm_pwm = 0;
  float pulsepercent;
  do {
    th = pulseIn(pwmpin, HIGH, 1004000) / 1000;
    float pulsepercent = th / 1004.0;         // Pulslänge in Prozent (%)
    ppm_pwm = range * pulsepercent;           // PPM-Werte bei gegebenem Range
  } while (th == 0);                          // Der gemessene Wert wird an die loop()-Funktion zurückgegeben,                                                                        
  return ppm_pwm;                             // wo er dann ausgegeben wird.  
}

/********************************************************************************************************
 * 
 *                 Prozedur zum Auslese des BMP-180 (Druck- und Temperatursensor)
 *                 
 ********************************************************************************************************/
void DruckUndTemperaturMessung(){
  char status;
  status = pressure.startTemperature();
  if (status != 0) {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0) {
      status = pressure.startPressure(3);
      if (status != 0) {
        delay(status);
        status = pressure.getPressure(P, T);
        if (status != 0) {
          p0 = pressure.sealevel(P, ALTITUDE);
        }
      }
    }
  }
}

2. Nano mit Sensoren und OLED-Display

Material

  • Breadbord 400
  • Lufttemperatur und Luftdruck
    • BMP180 (1 bis 4 EURO)
  • OLED zur Datenanzeige
  • Laptop (zum Programmieren)
  • Steckverbindungen
  • 21 bis 45 EURO (Asien/Europa)

Steckplan

Code

  • Co2-Messung über PWM-Kommunikation mit dem Sensor
/*********************************************************************************************************
*
* MHZ-19B, BMP 180, OLED 2025-06-12
*
*********************************************************************************************************/

#include <Wire.h>                                              // OLED
#include "SSD1306Ascii.h"                                      // OLED
#include "SSD1306AsciiWire.h"                                  // OLED
#define I2C_ADDRESS 0x3C                                       // OLED
SSD1306AsciiWire oled;                                         // OLED

#define ALTITUDE 8.0                       // BMP 180 Borgfelde liegt 8 m ueber dem Meer
#include <Wire.h>                          // BMP 180
#include <SFE_BMP180.h>                    // BMP 180
SFE_BMP180 pressure;                       // BMP 180 - Creating an object pressure
float StartZeit, LaufZeit;                 // Zeitpunkt der Messung
String dataString = "";                    // Ausgabestring
int LeerZeile = 0;

/**************************************
*  für den Betrieb des MH-Z19B        *
**************************************/
  const int pwmpin = 6;                    // Der Sensor hängt an Pin 6
  const int range = 5000;                  // Der eingestellte Messbereich (0-5000ppm)
  int  ppm_pwm = 0;  
/**************************************
*  für den Betrieb des BMP 180        *
**************************************/
  double T, P, p0;                         // Speicher fuer temp, Druck relativer Druck

/**************************************
*  Festlegung Messintervall           *
**************************************/
  const  int SchreibPause = 29998;         // naechste Messung erst nach ca. 30 Sekunden     
  int WarteZeit;
void setup() {
  StartZeit = millis();    

/**************************************
 *  für den Betrieb des OLEDs         *
 **************************************/   
  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
  oled.setFont(System5x7);                  // Auswahl der Schriftart
  oled.clear();                             // Loeschen der aktuellen Displayanzeige
  oled.println(" NW-Projekt 2023   ");
  delay(1000);
/**************************************
 *  für den Betrieb der Ausgaben      *
 **************************************/ 
  Serial.begin(9600);                       // Serieller Monitor mit 9600 bit/s


/**************************************
 *  für den Betrieb des MH-Z19B        *
 **************************************/   
    pinMode(pwmpin, INPUT);                   // PWM-Pin auf Eingang setzen

/**************************************
 *  für den Betrieb des BMP-180       *
 **************************************/   
  if (!pressure.begin()) {
    delay(3000);
    Serial.println("BMP-180 init failed!");   // while(true); // wartet, bis der Sensor sich meldet
  }
  Serial.print("Provided altitude: ");
  Serial.print(ALTITUDE, 0);
  Serial.println(" meters");
}

/*********************************************************************************************************
*
*                            H A U P T P R O G R A M M - Loop
*
*********************************************************************************************************/
void loop() {
  DatenAuslesen();
  DatenAnzeigen();
  SerialAusgabe();
  delay(2000);
}

/********************************************************************************************************
*
*                            Prozedur Datenauslesen
*
*********************************************************************************************************/
void DatenAuslesen(){
  LaufZeit =  millis() - StartZeit;
  ppm_pwm = readCO2PWM();                     // Messung der PWM-Länge mittels einer eigenen Funktion
  DruckUndTemperaturMessung();
}

/********************************************************************************************************
*
*                            Prozedur Daten auf dem OLED anzeigen
*
*********************************************************************************************************/
void DatenAnzeigen(){
  oled.setFont(System5x7);                    // Auswahl der Schriftart
  oled.clear();                               // Loeschen der aktuellen Displayanzeige
  oled.print("CO2:    ");
  oled.print(ppm_pwm);
  oled.println("  ppm");
  oled.println("-------------------");
  oled.print("Temp.   ");
  oled.print(T,1);
  oled.println("  C");
  oled.println("-------------------");
  oled.print("Druck   ");
  oled.print(P,0);
  oled.println("  hPa");
  oled.println("-------------------");
  oled.print("Zeit    ");
  oled.print(LaufZeit/1000,0);
  oled.println("MB-2025-06-12");
}

/********************************************************************************************************
*
*                            Ausgabe am seriellen Monitor
*
*********************************************************************************************************/
void SerialAusgabe(){
  Serial.print(LaufZeit/1000,0);                   
  Serial.print(" s  | "); 
  Serial.print(ppm_pwm);                   
  Serial.print(" ppm   | "); 
  Serial.print(T,1);                   
  Serial.print(" C  |  "); 
  Serial.print(P);                  
  Serial.print(" hPa  |  "); 
  Serial.print(p0);                  
  Serial.print(" hPa Luftdruck gemessen in Borgfelde 6 m ueber NN"); 
  Serial.println();             
}

/********************************************************************************************************
 * 
 *                 Funktionen zum PWM-Auslese des CO2-Wertes
 *                 
 *********************************************************************************************************/
  int readCO2PWM() {
  unsigned long th;
  int ppm_pwm = 0;
  float pulsepercent;
  do {
    th = pulseIn(pwmpin, HIGH, 1004000) / 1000;
    float pulsepercent = th / 1004.0;         // Pulslänge in Prozent (%)
    ppm_pwm = range * pulsepercent;           // PPM-Werte bei gegebenem Range
  } while (th == 0);                          // Der gemessene Wert wird an die loop()-Funktion zurückgegeben,                                                                        
  return ppm_pwm;                             // wo er dann ausgegeben wird.  
}

/********************************************************************************************************
 * 
 *                 Prozedur zum Auslese des BMP-180 (Druck- und Temperatursensor)
 *                 
 ********************************************************************************************************/
void DruckUndTemperaturMessung(){
  char status;
  status = pressure.startTemperature();
  if (status != 0) {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0) {
      status = pressure.startPressure(3);
      if (status != 0) {
        delay(status);
        status = pressure.getPressure(P, T);
        if (status != 0) {
          p0 = pressure.sealevel(P, ALTITUDE);
        }
      }
    }
  }
}

3. Nano mit Sensoren, OLED-Display und SD-Karten-Speicher

Material

  • Mikrocontroler ARDUINO NANO (oder UNO) (5 bis 20 EURO)
  • Breadbord 400
  • Lufttemperatur und Luftdruck
    • BMP180 (1 bis 4 EURO)
  • OLED zur Datenanzeige
  • SD-Kartenspeicher
  • Laptop (zum Programmieren)
  • Steckverbindungen
  • 22 bis 48 EURO (Asien/Europa)

Steckplan

Code

  • Co2-Messung über PWM-Kommunikation mit dem Sensor


4. Nano mit Sensoren, OLED-Display und SD-Karten-Speicher im 3D-Druck-Gehäuse

Material

  • Breadbord 400
  • Lufttemperatur und Luftdruck
    • BMP180 (1 bis 4 EURO)
  • OLED zur Datenanzeige
  • SD-Kartenspeicher
  • Laptop (zum Programmieren)
  • Steckverbindungen
  • 22 bis 48 EURO (Asien/Europa)

Steckplan

Code

  • Co2-Messung über PWM-Kommunikation mit dem Sensor


5. Nano mit Sensoren, OLED-Display und SD-Karten-Speicher im 3D-Druck-Gehäuse mit Steckverbindungen

Material

  • Lufttemperatur und Luftdruck
    • BMP180 (1 bis 4 EURO)
  • OLED zur Datenanzeige
  • SD-Kartenspeicher
  • Laptop (zum Programmieren)
  • Steckverbindungen/Platine/direkt gelötet
  • 3D-Druck (eigener Drucker oder im Makerspace in der Nähe oder …)
  • 22 bis 48 EURO (Asien/Europa)
  • Powerbank (optional)

Steckplan

Code

  • Co2-Messung über PWM-Kommunikation mit dem Sensor


QR-Code
QR-Code www-fuer-alle:arduino:co2-messungen-bio (erstellt für aktuelle Seite)