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/13 17:49] – [Steckplan] biebl | www-fuer-alle:arduino:co2-messungen-bio [2025/11/13 13:32] (aktuell) – [Messgerät] 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 ===== | ||
| {{: | {{: | ||
| + | {{: | ||
| + | |||
| ===== Ergebnis ===== | ===== Ergebnis ===== | ||
| ==== Vorversuch ==== | ==== Vorversuch ==== | ||
| Zeile 477: | Zeile 483: | ||
| * 22 bis 48 EURO (Asien/ | * 22 bis 48 EURO (Asien/ | ||
| - | ==== Steckplan | + | ==== Schaltplan |
| Zeile 483: | Zeile 489: | ||
| + | ==== 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 512: | Zeile 794: | ||
| {{: | {{: | ||
| + | {{ : | ||
| + | {{ : | ||
| ==== Code ==== | ==== Code ==== | ||