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:33] – [Code] 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 82: | Zeile 88: | ||
| ==== Steckplan ==== | ==== Steckplan ==== | ||
| - | * {{ : | + | {{: |
| + | {{: | ||
| ==== Code ==== | ==== Code ==== | ||
| - | * Co2-Messung über PWM-Kommunikation | + | * Co2-Messung |
| < | < | ||
| + | / | ||
| + | * | ||
| + | * MHZ-19B, BMP 180 2025-06-12 | ||
| + | * | ||
| + | *********************************************************************************************************/ | ||
| + | |||
| + | #define ALTITUDE 8.0 // BMP 180 Borgfelde liegt 8 m ueber dem Meer | ||
| + | #include < | ||
| + | #include < | ||
| + | SFE_BMP180 pressure; | ||
| + | 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(); | ||
| + | |||
| + | / | ||
| + | | ||
| + | | ||
| + | Serial.begin(9600); | ||
| + | |||
| + | / | ||
| + | | ||
| + | | ||
| + | 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(); | ||
| + | SerialAusgabe(); | ||
| + | } | ||
| + | |||
| + | / | ||
| + | * | ||
| + | * Prozedur Datenauslesen | ||
| + | * | ||
| + | *********************************************************************************************************/ | ||
| + | void DatenAuslesen(){ | ||
| + | LaufZeit = millis() - StartZeit; | ||
| + | ppm_pwm = readCO2PWM(); | ||
| + | DruckUndTemperaturMessung(); | ||
| + | } | ||
| + | |||
| + | / | ||
| + | * | ||
| + | * 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(" | ||
| + | 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, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| </ | </ | ||
| Zeile 103: | Zeile 245: | ||
| * 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 113: | Zeile 263: | ||
| / | / | ||
| * | * | ||
| - | * MHZ-19B, BMP 180, OLED 2025-06-12 | + | * MHZ-19B, BMP 180 und OLED 2025-06-13 |
| * | * | ||
| *********************************************************************************************************/ | *********************************************************************************************************/ | ||
| Zeile 122: | Zeile 272: | ||
| #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 127: | Zeile 278: | ||
| #include < | #include < | ||
| SFE_BMP180 pressure; | SFE_BMP180 pressure; | ||
| + | |||
| float StartZeit, LaufZeit; | float StartZeit, LaufZeit; | ||
| String dataString = ""; | String dataString = ""; | ||
| Zeile 158: | Zeile 310: | ||
| oled.setFont(System5x7); | oled.setFont(System5x7); | ||
| oled.clear(); | oled.clear(); | ||
| - | oled.println(" | + | oled.println(" |
| delay(1000); | delay(1000); | ||
| / | / | ||
| Zeile 164: | Zeile 316: | ||
| | | ||
| Serial.begin(9600); | Serial.begin(9600); | ||
| - | |||
| / | / | ||
| Zeile 192: | Zeile 343: | ||
| DatenAnzeigen(); | DatenAnzeigen(); | ||
| SerialAusgabe(); | SerialAusgabe(); | ||
| - | delay(2000); | + | delay(5000); |
| } | } | ||
| Zeile 205: | Zeile 356: | ||
| DruckUndTemperaturMessung(); | DruckUndTemperaturMessung(); | ||
| } | } | ||
| + | |||
| / | / | ||
| Zeile 223: | Zeile 375: | ||
| 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 243: | Zeile 396: | ||
| 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 330: | Zeile 483: | ||
| * 22 bis 48 EURO (Asien/ | * 22 bis 48 EURO (Asien/ | ||
| - | ==== Steckplan | + | ==== Schaltplan |
| Zeile 336: | 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 361: | Zeile 790: | ||
| ==== Steckplan ==== | ==== Steckplan ==== | ||
| + | * Mit Taster | ||
| - | {{ : | + | |
| + | {{: | ||
| + | {{ :www-fuer-alle: | ||
| + | {{ : | ||
| ==== Code ==== | ==== Code ==== | ||
| + | * mit Taster | ||
| + | |||
| * Co2-Messung über PWM-Kommunikation mit dem Sensor | * Co2-Messung über PWM-Kommunikation mit dem Sensor | ||
| < | < | ||
| + | / | ||
| + | * | ||
| + | * SD-Karte, CO2-Sensor, BMP 180 und OLED 2023-10-17 | ||
| + | * | ||
| + | ***************************************************/ | ||
| + | |||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #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 < | ||
| + | #include < | ||
| + | |||
| + | #define ALTITUDE 8.0 // BMP 180 Borgfelde liegt 8 m ueber dem Meer | ||
| + | #include < | ||
| + | #include < | ||
| + | SFE_BMP180 pressure; | ||
| + | const int Taster = 2; // Der Taster zur OLED-Steuerung wurde an Pin 2 angeschlossen | ||
| + | const int chipSelect = 4; // CS-Pin der SD-Karte | ||
| + | bool SchreibZugriff = false; | ||
| + | bool Oledan = true; // Status der OLED-Anzeige | ||
| + | bool AnzeigenWechsel = false; | ||
| + | float StartZeit, LaufZeit; | ||
| + | String dataString = ""; | ||
| + | int LeerZeile = 0; | ||
| + | |||
| + | volatile int TasterStatus = 0; // Variable die den Status des Taster ausliest, wird der sog. " | ||
| + | // Taster Anschluss an Pin 2 entspricht dem Vektor 0 (hier der Fall) | ||
| + | // Taster Anschluss an Pin 3 entspricht dem Vektor 1 | ||
| + | |||
| + | / | ||
| + | * 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; //Creating variables for temp, pressure and relative pressure | ||
| + | |||
| + | / | ||
| + | * Festlegung Messintervall | ||
| + | **************************************/ | ||
| + | const int SchreibPause = 29998; | ||
| + | int WarteZeit; | ||
| + | void setup() { | ||
| + | StartZeit = millis(); | ||
| + | pinMode(Taster, | ||
| + | attachInterrupt(0, | ||
| + | |||
| + | |||
| + | / | ||
| + | | ||
| + | | ||
| + | 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)) { // see if the card is present and can be initialized: | ||
| + | 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()) { | ||
| + | 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() { | ||
| + | // Messen | ||
| + | DatenAuslesen(); | ||
| + | DatenStringErstellen(); | ||
| + | DatenSichern(); | ||
| + | if (Oledan == 0) | ||
| + | {DatenAnzeigenAus(); | ||
| + | else | ||
| + | {DatenAnzeigen(); | ||
| + | SerialAusgabe(); | ||
| + | WarteZeit =0; | ||
| + | while (WarteZeit< | ||
| + | delay(1000); | ||
| + | WarteZeit = WarteZeit + 1000; | ||
| + | } | ||
| + | AnzeigenWechsel = false; | ||
| + | } | ||
| + | |||
| + | / | ||
| + | * | ||
| + | * 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(P); | ||
| + | dataString += String("; | ||
| + | dataString += String(p0); | ||
| + | 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(P, | ||
| + | oled.println(" | ||
| + | oled.println(" | ||
| + | oled.print(" | ||
| + | oled.print(LaufZeit/ | ||
| + | oled.println(" | ||
| + | oled.print(" | ||
| + | if (SchreibZugriff == true){ | ||
| + | oled.print(" | ||
| + | } | ||
| + | else { | ||
| + | oled.print(" | ||
| + | } | ||
| + | oled.println(" | ||
| + | } | ||
| + | |||
| + | |||
| + | / | ||
| + | * | ||
| + | * Prozedur OLED aus | ||
| + | * | ||
| + | ***********************************************************************************************************/ | ||
| + | void DatenAnzeigenAus(){ | ||
| + | oled.setFont(System5x7); | ||
| + | oled.clear(); | ||
| + | for (int i=0; i< | ||
| + | oled.println("" | ||
| + | } | ||
| + | oled.println(" | ||
| + | LeerZeile = LeerZeile + 1; | ||
| + | LeerZeile = LeerZeile % 7; | ||
| + | } | ||
| + | / | ||
| + | * | ||
| + | * Ausgabe am seriellen Monitor | ||
| + | * | ||
| + | ***********************************************************************************************************/ | ||
| + | void SerialAusgabe(){ | ||
| + | Serial.print(LaufZeit/ | ||
| + | Serial.print(" | ||
| + | Serial.print(ppm_pwm); | ||
| + | Serial.print(" | ||
| + | Serial.print(T, | ||
| + | Serial.print(" | ||
| + | Serial.print(P); | ||
| + | Serial.print(" | ||
| + | Serial.print(p0); | ||
| + | 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, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | / | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | void TasterUnterbricht() { // Sobald die Unterbrechung " | ||
| + | TasterStatus = digitalRead(Taster); | ||
| + | // Die neue Definition geschieht durch das Auslesen des Tasters an Pin 2. | ||
| + | Oledan = !Oledan; | ||
| + | AnzeigenWechsel = true; | ||
| + | } | ||
| + | |||
| </ | </ | ||