Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
WWW CO2-Messungen BIO
Basilikum
- NW-Projekt Klassenstufe 8
Messgerät
Aufbau
Ergebnis
Vorversuch
48-Stunden-Messung
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
- Mikrocontroler ARDUINO UNO (5 bis 20 EURO)
- Co2-Sensor MHZ 19B (10 bis 40 Euro - Funktionsweise MHZ-19
- Erweiterung: Lufttemperatur und Luftdruck
- BMP180 (1 bis 4 EURO)
- Laptop (zum Programmieren und als Anzeige)
- Steckverbindungen
- 20 bis 40 EURO (Asien/Europa)
Steckplan
Code
- Co2-Messung mit MHZ-19B über PWM-Kommunikation
/*********************************************************************************************************
*
* MHZ-19B, 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
- Mikrocontroler ARDUINO NANO (oder UNO) (5 bis 20 EURO)
- Co2-Sensor MHZ 19B (10 bis 40 Euro - Funktionsweise MHZ-19
- 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)
- Co2-Sensor MHZ 19B (10 bis 40 Euro - Funktionsweise MHZ-19
- 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
- Mikrocontroler ARDUINO NANO (oder UNO) (5 bis 20 EURO)
- Co2-Sensor MHZ 19B (10 bis 40 Euro - Funktionsweise MHZ-19
- 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
- Mikrocontroler ARDUINO NANO (oder UNO) (5 bis 20 EURO)
- Co2-Sensor MHZ 19B (10 bis 40 Euro - Funktionsweise MHZ-19
- 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














