Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
www-fuer-alle:arduino:co2-messungen-bio [2025/06/12 14:41] – [Steckplan] biebl | www-fuer-alle:arduino:co2-messungen-bio [2025/06/16 11:19] (aktuell) – [Steckplan] biebl | ||
---|---|---|---|
Zeile 2: | Zeile 2: | ||
===== Basilikum ===== | ===== Basilikum ===== | ||
+ | |||
+ | * [[https:// | ||
* NW-Projekt Klassenstufe 8 | * NW-Projekt Klassenstufe 8 | ||
Zeile 7: | Zeile 9: | ||
* [[lehrer: | * [[lehrer: | ||
* {{ : | * {{ : | ||
+ | |||
+ | Fragen und Anregungen an: [[Makerspace@GymSAS.de]] | ||
===== Messgerät ===== | ===== Messgerät ===== | ||
* ARDUINO-NANO | * ARDUINO-NANO | ||
* 3D-Druckgehäuse | * 3D-Druckgehäuse | ||
- | {{: | + | {{: |
- | {{: | + | {{ : |
===== Aufbau ===== | ===== Aufbau ===== | ||
Zeile 82: | Zeile 86: | ||
==== Steckplan ==== | ==== Steckplan ==== | ||
- | * {{ : | + | {{: |
+ | {{: | ||
==== 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/ | * 21 bis 45 EURO (Asien/ | ||
- | ==== Steckplan | + | ==== Schltplan |
{{ : | {{ : | ||
+ | |||
+ | ==== Steckplan ==== | ||
+ | |||
+ | {{: | ||
+ | {{: | ||
+ | {{: | ||
+ | {{: | ||
+ | {{: | ||
==== 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 180, OLED 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 < | #include < | ||
SFE_BMP180 pressure; | SFE_BMP180 pressure; | ||
+ | |||
float StartZeit, LaufZeit; | float StartZeit, LaufZeit; | ||
String dataString = ""; | String dataString = ""; | ||
Zeile 293: | Zeile 308: | ||
oled.setFont(System5x7); | oled.setFont(System5x7); | ||
oled.clear(); | oled.clear(); | ||
- | oled.println(" | + | oled.println(" |
delay(1000); | delay(1000); | ||
/ | / | ||
Zeile 299: | Zeile 314: | ||
| | ||
Serial.begin(9600); | Serial.begin(9600); | ||
- | |||
/ | / | ||
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(" | oled.print(" | ||
- | oled.print(P,0); | + | oled.print(p0,0); |
oled.println(" | oled.println(" | ||
oled.println(" | oled.println(" | ||
oled.print(" | oled.print(" | ||
oled.print(LaufZeit/ | oled.print(LaufZeit/ | ||
- | oled.println(" | + | oled.println(" |
+ | oled.println(" | ||
} | } | ||
Zeile 378: | Zeile 394: | ||
Serial.print(T, | Serial.print(T, | ||
Serial.print(" | Serial.print(" | ||
+ | Serial.print(p0); | ||
+ | Serial.print(" | ||
Serial.print(P); | Serial.print(P); | ||
- | | + | Serial.print(" |
- | Serial.print(p0); | + | |
- | | + | |
Serial.println(); | Serial.println(); | ||
} | } | ||
Zeile 465: | Zeile 481: | ||
* 22 bis 48 EURO (Asien/ | * 22 bis 48 EURO (Asien/ | ||
- | ==== Steckplan | + | ==== Schaltplan |
Zeile 471: | Zeile 487: | ||
+ | ==== Steckplan ==== | ||
+ | |||
+ | {{: | ||
+ | {{: | ||
+ | {{: | ||
+ | |||
+ | {{: | ||
==== Code ==== | ==== Code ==== | ||
* Co2-Messung über PWM-Kommunikation mit dem Sensor | * Co2-Messung über PWM-Kommunikation mit dem Sensor | ||
< | < | ||
+ | / | ||
+ | * | ||
+ | * SD-Karte, MHZ-19B, BMP 180 und OLED 2025-06-13 | ||
+ | * | ||
+ | *********************************************************************************************************/ | ||
+ | |||
+ | #include < | ||
+ | #include " | ||
+ | #include " | ||
+ | #define I2C_ADDRESS 0x3C // OLED | ||
+ | SSD1306AsciiWire oled; // OLED | ||
+ | |||
+ | / | ||
+ | * | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | * | ||
+ | | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #define ALTITUDE 8.0 // BMP 180 Borgfelde liegt 8 m ueber dem Meer | ||
+ | #include < | ||
+ | #include < | ||
+ | SFE_BMP180 pressure; | ||
+ | const int chipSelect = 4; // CS-Pin der SD-Karte | ||
+ | bool SchreibZugriff = false; | ||
+ | float StartZeit, LaufZeit; | ||
+ | String dataString = ""; | ||
+ | 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; | ||
+ | int WarteZeit; | ||
+ | void setup() { | ||
+ | StartZeit = millis(); | ||
+ | |||
+ | / | ||
+ | | ||
+ | | ||
+ | Wire.begin(); | ||
+ | Wire.setClock(400000L); | ||
+ | oled.begin(& | ||
+ | oled.setFont(System5x7); | ||
+ | oled.clear(); | ||
+ | oled.println(" | ||
+ | delay(1000); | ||
+ | / | ||
+ | | ||
+ | | ||
+ | Serial.begin(9600); | ||
+ | Serial.print(" | ||
+ | if (!SD.begin(chipSelect)) { // SD-Karte suchen | ||
+ | Serial.println(" | ||
+ | SchreibZugriff = false; | ||
+ | oled.setFont(System5x7); | ||
+ | for (int i=20; i > 0; i--){ | ||
+ | oled.clear(); | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.println(i); | ||
+ | delay(1000); | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | Serial.println(" | ||
+ | SchreibZugriff = true; | ||
+ | } | ||
+ | |||
+ | / | ||
+ | | ||
+ | | ||
+ | pinMode(pwmpin, | ||
+ | |||
+ | / | ||
+ | | ||
+ | | ||
+ | if (!pressure.begin()) { | ||
+ | delay(3000); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | Serial.print(" | ||
+ | Serial.print(ALTITUDE, | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | / | ||
+ | * | ||
+ | * 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(); | ||
+ | DruckUndTemperaturMessung(); | ||
+ | } | ||
+ | |||
+ | / | ||
+ | * | ||
+ | * Prozedur String mit allen Informationen Zusammenstellen | ||
+ | * | ||
+ | *********************************************************************************************************/ | ||
+ | void DatenStringErstellen(){ | ||
+ | // make a string for assembling the data to log: | ||
+ | dataString = ""; | ||
+ | dataString += String(LaufZeit/ | ||
+ | dataString += String("; | ||
+ | dataString += String(ppm_pwm); | ||
+ | dataString += String("; | ||
+ | dataString += String(T, | ||
+ | dataString += String("; | ||
+ | dataString += String(p0); | ||
+ | dataString += String("; | ||
+ | dataString += String(P); | ||
+ | dataString += String("; | ||
+ | } | ||
+ | |||
+ | / | ||
+ | * | ||
+ | * Prozedur Daten auf der SD-Karte Sichern | ||
+ | * | ||
+ | *********************************************************************************************************/ | ||
+ | void DatenSichern(){ | ||
+ | File dataFile = SD.open(" | ||
+ | if (dataFile) { // if the file is available, write to it: | ||
+ | dataFile.println(dataString); | ||
+ | dataFile.close(); | ||
+ | // | ||
+ | SchreibZugriff = true; | ||
+ | } | ||
+ | else { // if the file isn't open, pop up an error: | ||
+ | Serial.println(" | ||
+ | SchreibZugriff = false; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | / | ||
+ | * | ||
+ | * Prozedur Daten auf dem OLED anzeigen | ||
+ | * | ||
+ | *********************************************************************************************************/ | ||
+ | void DatenAnzeigen(){ | ||
+ | oled.setFont(System5x7); | ||
+ | oled.clear(); | ||
+ | oled.print(" | ||
+ | oled.print(ppm_pwm); | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.print(" | ||
+ | oled.print(T, | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.print(" | ||
+ | oled.print(p0, | ||
+ | oled.println(" | ||
+ | oled.println(" | ||
+ | oled.print(" | ||
+ | oled.print(LaufZeit/ | ||
+ | oled.println(" | ||
+ | oled.print(" | ||
+ | if (SchreibZugriff == true){ | ||
+ | oled.print(" | ||
+ | } | ||
+ | else { | ||
+ | oled.print(" | ||
+ | } | ||
+ | oled.println(" | ||
+ | } | ||
+ | |||
+ | / | ||
+ | * | ||
+ | * Ausgabe am seriellen Monitor | ||
+ | * | ||
+ | *********************************************************************************************************/ | ||
+ | void SerialAusgabe(){ | ||
+ | Serial.print(LaufZeit/ | ||
+ | Serial.print(" | ||
+ | Serial.print(ppm_pwm); | ||
+ | Serial.print(" | ||
+ | Serial.print(T, | ||
+ | Serial.print(" | ||
+ | Serial.print(p0); | ||
+ | Serial.print(" | ||
+ | Serial.print(P); | ||
+ | Serial.print(" | ||
+ | if (SchreibZugriff == true) { | ||
+ | Serial.print(" | ||
+ | } | ||
+ | else { | ||
+ | | ||
+ | } | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | / | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | int readCO2PWM() { | ||
+ | unsigned long th; | ||
+ | int ppm_pwm = 0; | ||
+ | float pulsepercent; | ||
+ | do { | ||
+ | th = pulseIn(pwmpin, | ||
+ | float pulsepercent = th / 1004.0; | ||
+ | ppm_pwm = range * pulsepercent; | ||
+ | } while (th == 0); // Der gemessene Wert wird an die loop()-Funktion zurückgegeben, | ||
+ | return ppm_pwm; | ||
+ | } | ||
+ | |||
+ | / | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 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, | ||
+ | if (status != 0) { | ||
+ | p0 = pressure.sealevel(P, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
</ | </ | ||
===== 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: | ||
{{: | {{: | ||
+ | {{ : | ||
+ | {{ : | ||
==== Code ==== | ==== Code ==== |