Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
www-fuer-alle:arduino:co2-messungen-bio [2025/06/12 14:41] – [Steckplan] bieblwww-fuer-alle:arduino:co2-messungen-bio [2025/06/16 11:19] (aktuell) – [Steckplan] biebl
Zeile 2: Zeile 2:
  
 ===== Basilikum ===== ===== Basilikum =====
 +
 +  * [[https://wiki.gymsas.de/doku.php?id=www-fuer-alle:arduino|Arduinos im Unterricht - Informatik, Physik, Technik, ...]]
  
   * NW-Projekt Klassenstufe 8   * NW-Projekt Klassenstufe 8
Zeile 7: Zeile 9:
   * [[lehrer:arduino:p48-nano-messbox]| LEHRER: P48-Nano-Messbox]]   * [[lehrer:arduino:p48-nano-messbox]| LEHRER: P48-Nano-Messbox]]
   * {{ :www-fuer-alle:arduino:nw-8-2024-09-09-musterauswertung.ods |Auswertungshilfe}}   * {{ :www-fuer-alle:arduino:nw-8-2024-09-09-musterauswertung.ods |Auswertungshilfe}}
 +
 +Fragen und Anregungen an: [[Makerspace@GymSAS.de]]
  
 ===== Messgerät ===== ===== Messgerät =====
   * ARDUINO-NANO   * ARDUINO-NANO
   * 3D-Druckgehäuse   * 3D-Druckgehäuse
-{{:www-fuer-alle:arduino:2023-10-26-nw-co2-handmessgeraet.png?400 |}}+{{:www-fuer-alle:arduino:2023-10-26-nw-co2-handmessgeraet.png?400 |}}{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-sd-4.jpg?direct&200|}}
  
-{{:www-fuer-alle:arduino:2023-10-17-co2-sd-bmp180-oled.png?400 |}}+{{ :www-fuer-alle:arduino:co2-sd-bmp180-oled-2025-06-11.png?direct&600 |}}
  
 ===== Aufbau ===== ===== Aufbau =====
Zeile 82: Zeile 86:
  
 ==== Steckplan ==== ==== Steckplan ====
-  * {{ :www-fuer-alle:arduino:uno-mhz-19-bmp180.png?direct&400 |}}+{{:www-fuer-alle:arduino:uno-mhz-19-bmp180.png?direct&400|}} 
 +{{:www-fuer-alle:arduino:nano-mhz-bmp.png?direct&400|}}
 ==== Code ==== ==== Code ====
   * Co2-Messung mit MHZ-19B über PWM-Kommunikation   * Co2-Messung mit MHZ-19B über PWM-Kommunikation
Zeile 238: Zeile 243:
   * 21 bis 45 EURO (Asien/Europa)   * 21 bis 45 EURO (Asien/Europa)
  
-==== Steckplan ====+==== Schltplan ====
  
 {{ :www-fuer-alle:arduino:co2-bmp180-oled-2025-06-11.png?direct&600 |}} {{ :www-fuer-alle:arduino:co2-bmp180-oled-2025-06-11.png?direct&600 |}}
  
 +
 +==== Steckplan ====
 +
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-1.jpg?direct&200|}}
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-2.jpg?direct&200|}}
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-3.jpg?direct&200|}}
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-4.jpg?direct&200|}}
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-5.jpg?direct&200|}}
 ==== Code ==== ==== Code ====
   * Co2-Messung über PWM-Kommunikation mit dem Sensor   * Co2-Messung über PWM-Kommunikation mit dem Sensor
Zeile 248: Zeile 261:
 /********************************************************************************************************* /*********************************************************************************************************
 * *
-* MHZ-19B, BMP 180OLED 2025-06-12+* MHZ-19B, BMP 180 und OLED 2025-06-13
 * *
 *********************************************************************************************************/ *********************************************************************************************************/
Zeile 257: Zeile 270:
 #define I2C_ADDRESS 0x3C                                       // OLED #define I2C_ADDRESS 0x3C                                       // OLED
 SSD1306AsciiWire oled;                                         // OLED SSD1306AsciiWire oled;                                         // OLED
 +
  
 #define ALTITUDE 8.0                       // BMP 180 Borgfelde liegt 8 m ueber dem Meer #define ALTITUDE 8.0                       // BMP 180 Borgfelde liegt 8 m ueber dem Meer
Zeile 262: Zeile 276:
 #include <SFE_BMP180.h>                    // BMP 180 #include <SFE_BMP180.h>                    // BMP 180
 SFE_BMP180 pressure;                       // BMP 180 - Creating an object pressure SFE_BMP180 pressure;                       // BMP 180 - Creating an object pressure
 +
 float StartZeit, LaufZeit;                 // Zeitpunkt der Messung float StartZeit, LaufZeit;                 // Zeitpunkt der Messung
 String dataString = "";                    // Ausgabestring String dataString = "";                    // Ausgabestring
Zeile 293: Zeile 308:
   oled.setFont(System5x7);                  // Auswahl der Schriftart   oled.setFont(System5x7);                  // Auswahl der Schriftart
   oled.clear();                             // Loeschen der aktuellen Displayanzeige   oled.clear();                             // Loeschen der aktuellen Displayanzeige
-  oled.println(" NW-Projekt 2023   ");+  oled.println("+ Klimakoffer LMU +");
   delay(1000);   delay(1000);
 /************************************** /**************************************
Zeile 299: Zeile 314:
  **************************************/   **************************************/ 
   Serial.begin(9600);                       // Serieller Monitor mit 9600 bit/s   Serial.begin(9600);                       // Serieller Monitor mit 9600 bit/s
- 
  
 /************************************** /**************************************
Zeile 327: Zeile 341:
   DatenAnzeigen();   DatenAnzeigen();
   SerialAusgabe();   SerialAusgabe();
-  delay(2000);+  delay(5000);
 } }
  
Zeile 340: Zeile 354:
   DruckUndTemperaturMessung();   DruckUndTemperaturMessung();
 } }
 +
  
 /******************************************************************************************************** /********************************************************************************************************
Zeile 358: Zeile 373:
   oled.println("-------------------");   oled.println("-------------------");
   oled.print("Druck   ");   oled.print("Druck   ");
-  oled.print(P,0);+  oled.print(p0,0);
   oled.println("  hPa");   oled.println("  hPa");
   oled.println("-------------------");   oled.println("-------------------");
   oled.print("Zeit    ");   oled.print("Zeit    ");
   oled.print(LaufZeit/1000,0);   oled.print(LaufZeit/1000,0);
-  oled.println("MB-2025-06-12");+  oled.println(" s"); 
 +  oled.println("      MB-2025-06-13");
 } }
  
Zeile 378: Zeile 394:
   Serial.print(T,1);                      Serial.print(T,1);                   
   Serial.print(" C  |  ");    Serial.print(" C  |  "); 
 +  Serial.print(p0);                  
 +  Serial.print(" hPa  |  "); 
   Serial.print(P);                     Serial.print(P);                  
-  Serial.print(" hPa  |  ");  +  Serial.print(" hPa Luftdruck gemessen in Borgfelde m ueber NN"); 
-  Serial.print(p0);                   +
-  Serial.print(" hPa Luftdruck gemessen in Borgfelde m ueber NN"); +
   Serial.println();                Serial.println();             
 } }
Zeile 465: Zeile 481:
   * 22 bis 48 EURO (Asien/Europa)   * 22 bis 48 EURO (Asien/Europa)
  
-==== Steckplan ====+==== Schaltplan ====
  
  
Zeile 471: Zeile 487:
  
  
 +==== Steckplan ====
 +
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-sd-1.jpg?direct&100|}}
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-sd-2.jpg?direct&200|}}
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-sd-3.jpg?direct&300|}}
 +
 +{{:www-fuer-alle:arduino:nano-mhz-bmp-oled-sd-4.jpg?direct&600|}}
 ==== Code ==== ==== Code ====
   * Co2-Messung über PWM-Kommunikation mit dem Sensor   * Co2-Messung über PWM-Kommunikation mit dem Sensor
  
 <code> <code>
 +/*********************************************************************************************************
 +*
 +* SD-Karte, MHZ-19B, BMP 180 und OLED 2025-06-13
 +*
 +*********************************************************************************************************/
 +
 +#include <Wire.h>                                              // OLED
 +#include "SSD1306Ascii.h"                                      // OLED
 +#include "SSD1306AsciiWire.h"                                  // OLED
 +#define I2C_ADDRESS 0x3C                                       // OLED
 +SSD1306AsciiWire oled;                                         // OLED
 +
 +/*********************************************************************************************************
 + *
 +  SD card datalogger
 +  MOSI - pin 11
 +  MISO - pin 12
 +  CLK - pin 13
 +  CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)  by Tom Igoe
 + *
 + ********************************************************************************************************/
 +#include <SPI.h>                           // SD-Karte
 +#include <SD.h>                            // SD-Karte In diesem Sketch verwenden wir die <SD.h> library
 +
 +#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
 +const int chipSelect = 4;                  // CS-Pin der SD-Karte
 +bool SchreibZugriff = false;               // Funktionsfaehigkeit beim Datensichern
 +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("+ Klimakoffer LMU + ");
 +  delay(1000);
 +/**************************************
 +  für den Betrieb der Ausgaben      *
 + **************************************/ 
 +  Serial.begin(9600);                       // Serieller Monitor mit 9600 bit/s
 +  Serial.print("Initializing SD card..."); 
 +  if (!SD.begin(chipSelect)) {              // SD-Karte suchen
 +    Serial.println("SD-Karte fehlt");       // Keine SD-Karte gefunden
 +    SchreibZugriff = false;
 +    oled.setFont(System5x7);                // Auswahl der Schriftart
 +    for (int i=20; i > 0; i--){
 +    oled.clear();                           // Loeschen der aktuellen Displayanzeige
 +    oled.println(" NWP 2024   ");
 +    oled.println(" ----------------------");
 +    oled.println("    ");
 +    oled.println(" KEINE SD-Karte   ");
 +    oled.println("    ");
 +    oled.println(" GEFUNDEN!!   ");
 +    oled.println("    ");
 +    oled.println(i);
 +    delay(1000);
 +    }
 +  }
 +  else {
 +    Serial.println("card initialized.");      // alles ok
 +    SchreibZugriff = true;
 +  }
 +
 +/**************************************
 +  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();
 +  DatenStringErstellen();
 +  DatenSichern();
 +  DatenAnzeigen();
 +  SerialAusgabe();
 +  delay(5000);
 +}
 +
 +/********************************************************************************************************
 +*
 +*                            Prozedur Datenauslesen
 +*
 +*********************************************************************************************************/
 +void DatenAuslesen(){
 +  LaufZeit =  millis() - StartZeit;
 +  ppm_pwm = readCO2PWM();                     // Messung der PWM-Länge mittels einer eigenen Funktion
 +  DruckUndTemperaturMessung();
 +}
 +
 +/********************************************************************************************************
 +*
 +*                            Prozedur String mit allen Informationen Zusammenstellen
 +*
 +*********************************************************************************************************/
 +void DatenStringErstellen(){
 + // make a string for assembling the data to log:
 +  dataString = "";
 +  dataString += String(LaufZeit/1000,0);
 +  dataString += String(";s;");
 +  dataString += String(ppm_pwm);
 +  dataString += String(";ppm;");
 +  dataString += String(T,1);
 +  dataString += String("; C;");
 +  dataString += String(p0);
 +  dataString += String(";hPa;");
 +  dataString += String(P);
 +  dataString += String(";hPa");
 +}
 +
 +/********************************************************************************************************
 +*
 +*                            Prozedur Daten auf der SD-Karte Sichern
 +*
 +*********************************************************************************************************/
 +void DatenSichern(){                          // open the file. note that only one file can be open at a time,
 +  File dataFile = SD.open("nwp-9-1.csv", FILE_WRITE);          // so you have to close this one before opening another.
 +  if (dataFile) {                             // if the file is available, write to it:
 +    dataFile.println(dataString);                                          
 +    dataFile.close();
 +    //Serial.println(dataString);             // print to the serial port too:
 +    SchreibZugriff = true;
 +  }
 +  else {                                      // if the file isn't open, pop up an error:
 +    Serial.println("error opening nwp-9-1.csv");
 +    SchreibZugriff = false;
 +  }
 +}
 +
 +/********************************************************************************************************
 +*
 +*                            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(p0,0);
 +  oled.println("  hPa");
 +  oled.println("-------------------");
 +  oled.print("Zeit    ");
 +  oled.print(LaufZeit/1000,0);
 +  oled.println(" s");
 +  oled.print("SD ");
 +  if (SchreibZugriff == true){
 +    oled.print("ok   ");
 +  }
 +  else {
 +    oled.print("no   ");
 +  }
 +  oled.println("MB-2025-06-13");
 +}
 +
 +/********************************************************************************************************
 +*
 +*                            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"); 
 +  if (SchreibZugriff == true) {
 +    Serial.print(" SD ok"); 
 +  }
 +  else {
 +   Serial.print(" SD fehlerhaft"); 
 +  }
 +  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);
 +        }
 +      }
 +    }
 +  }
 +}
 </code> </code>
 ===== 5. Nano mit Sensoren, OLED-Display und SD-Karten-Speicher im 3D-Druck-Gehäuse mit Steckverbindungen ===== ===== 5. Nano mit Sensoren, OLED-Display und SD-Karten-Speicher im 3D-Druck-Gehäuse mit Steckverbindungen =====
Zeile 500: Zeile 792:
  
 {{:www-fuer-alle:arduino:2023-10-17-co2-sd-bmp180-oled.png?400 |}} {{:www-fuer-alle:arduino:2023-10-17-co2-sd-bmp180-oled.png?400 |}}
 +{{ :www-fuer-alle:arduino:nano-messbox-a-sd-oled-fest.png?direct&150|}}
 +{{ :www-fuer-alle:arduino:nano-messbox-a-sd-oled-fest-2d.png?direct&150|}}
  
 ==== Code ==== ==== Code ====
QR-Code
QR-Code www-fuer-alle:arduino:co2-messungen-bio (erstellt für aktuelle Seite)