Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| www-messdatenerfassung-sas:platinenschaltung [2026/09/12 13:52] – [D1-mini] biebl | www-messdatenerfassung-sas:platinenschaltung [2026/09/12 16:09] (aktuell) – biebl | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== WWW: Platinen mit TESTCODE====== | ====== WWW: Platinen mit TESTCODE====== | ||
| + | |||
| + | * [[platinenschaltung-Außenbox|WWW: | ||
| + | |||
| ^ Seite ^ Inhalt | ^ Seite ^ Inhalt | ||
| | [[www-messdatenerfassung-sas: | | [[www-messdatenerfassung-sas: | ||
| Zeile 18: | Zeile 21: | ||
| * Bei unseren Platinen kostete eine Platine 1,5 Euro | * Bei unseren Platinen kostete eine Platine 1,5 Euro | ||
| + | * [[https:// | ||
| * [[lehrer: | * [[lehrer: | ||
| - | * [[info: | + | * [[info: |
| ===== Raumklima - Messbox ===== | ===== Raumklima - Messbox ===== | ||
| - | * [[info: | + | * [[info: |
| - | * [[lehrer: | + | * [[lehrer: |
| {{: | {{: | ||
| Zeile 41: | Zeile 45: | ||
| ==== D1-mini ==== | ==== D1-mini ==== | ||
| - | * Inzwischen wird der DHT22 mit BMP180 durch den BME280 ersetzt, was den Aufbau und den Code nochmalig vereinfacht. | + | * Inzwischen wird der DHT22 mit BMP180 |
| * Der MHZ19B wird inzwischen **ohne Spannungsteiler** betrieben - Der D1-mini ist 5V tolerant! | * Der MHZ19B wird inzwischen **ohne Spannungsteiler** betrieben - Der D1-mini ist 5V tolerant! | ||
| * Bei einem ESP32 wäre es nicht ratsam, da dieser nicht 5V tolerant ist... | * Bei einem ESP32 wäre es nicht ratsam, da dieser nicht 5V tolerant ist... | ||
| - | {{:info: | + | {{:www-messdatenerfassung-sas: |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | {{: | + | |
| - | {{: | + | |
| - | {{: | + | |
| - | + | ||
| - | {{: | + | |
| - | {{: | + | |
| + | {{: | ||
| Zeile 63: | Zeile 59: | ||
| * auf Vollständigkeit prüfen | * auf Vollständigkeit prüfen | ||
| - | {{:info: | + | {{:www-messdatenerfassung-sas:0-raumklima-platine-loeten-2026-06-13-01.png? |
| === 1. Drahtbrücke === | === 1. Drahtbrücke === | ||
| Zeile 70: | Zeile 66: | ||
| - | {{: | ||
| + | {{: | ||
| === 2. Winkelstifte LED und BMP === | === 2. Winkelstifte LED und BMP === | ||
| * ACHTUNG: auf die genaue Position achten | * ACHTUNG: auf die genaue Position achten | ||
| - | {{:info: | + | {{:www-messdatenerfassung-sas:2-raumklima-platine-loeten-2026-06-13-03.png? |
| === 3. 3er Stifte DHT22 === | === 3. 3er Stifte DHT22 === | ||
| * auf senkrechte Montage achten | * auf senkrechte Montage achten | ||
| - | {{:info: | + | {{:www-messdatenerfassung-sas:3-raumklima-platine-loeten-2026-06-13-04.png? |
| === 4. 8er Buchsen D1-mini == | === 4. 8er Buchsen D1-mini == | ||
| Zeile 89: | Zeile 83: | ||
| * Reste nach dem Löten entfernen | * Reste nach dem Löten entfernen | ||
| - | {{:info: | + | {{:www-messdatenerfassung-sas:4-raumklima-platine-loeten-2026-06-13-05.png? |
| === 5. 4er- und 5er-Buchse MHZ19B === | === 5. 4er- und 5er-Buchse MHZ19B === | ||
| Zeile 96: | Zeile 89: | ||
| * Reste nach dem Löten entfernen | * Reste nach dem Löten entfernen | ||
| - | {{:info: | + | {{:www-messdatenerfassung-sas:5-raumklima-platine-loeten-2026-06-13-06.png? |
| === 6. Widerstand 470kΩ === | === 6. Widerstand 470kΩ === | ||
| * Reste nach dem Löten entfernen | * Reste nach dem Löten entfernen | ||
| - | {{:info: | + | {{:www-messdatenerfassung-sas:6-raumklima-platine-loeten-2026-06-13-07.png? |
| === 7. 2er-Buchse LDR === | === 7. 2er-Buchse LDR === | ||
| * auf senkrechte Montage achten | * auf senkrechte Montage achten | ||
| * Reste nach dem Löten entfernen | * Reste nach dem Löten entfernen | ||
| - | {{: | ||
| + | |||
| + | {{: | ||
| === 8. Externe Sensoren === | === 8. Externe Sensoren === | ||
| - | + | {{:www-messdatenerfassung-sas:8-raumklima-platine-loeten-2026-06-13-09.png? | |
| - | {{:info: | + | |
| === 9. fertiges Modul === | === 9. fertiges Modul === | ||
| Zeile 1059: | Zeile 1049: | ||
| return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); | return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); | ||
| } | } | ||
| - | </ | ||
| - | < | ||
| - | </ | ||
| - | ===== Klimamessbox ===== | ||
| - | |||
| - | {{: | ||
| - | |||
| - | ^ Sensor | ||
| - | | MH-Z19B | ||
| - | | SDS011 | ||
| - | | BMP180 | ||
| - | | LDR | ADC0 | A0 | ||
| - | | DHT22 | GPIO3 | RX | **Nur nach Upload einstecken!** | ||
| - | ==== Di-mini-Platine ==== | ||
| - | |||
| - | ACHTUNG: Für den SDS011 KEINEN Spannungsteiler verwenden, er sendet bereits mit 3,3 V Logik | ||
| - | |||
| - | {{: | ||
| - | |||
| - | {{: | ||
| - | {{: | ||
| - | |||
| - | {{: | ||
| - | {{: | ||
| - | |||
| - | |||
| - | ==== Sensorplatine ==== | ||
| - | |||
| - | {{: | ||
| - | |||
| - | {{: | ||
| - | {{: | ||
| - | |||
| - | {{: | ||
| - | {{: | ||
| - | |||
| - | ===== TESTCODE KLIMABOX BME, MHZ und SDS===== | ||
| - | ==== BME280 ==== | ||
| - | < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | #define BME280_ADDRESS 0x76 // ggf. 0x77 testen | ||
| - | Adafruit_BME280 bme; | ||
| - | |||
| - | void setup() { | ||
| - | Serial.begin(115200); | ||
| - | delay(200); | ||
| - | Serial.println(" | ||
| - | |||
| - | Wire.begin(4, | ||
| - | |||
| - | if (!bme.begin(BME280_ADDRESS)) { | ||
| - | Serial.println(" | ||
| - | while (1) delay(100); | ||
| - | } | ||
| - | Serial.println(" | ||
| - | } | ||
| - | |||
| - | void loop() { | ||
| - | float t = bme.readTemperature(); | ||
| - | float h = bme.readHumidity(); | ||
| - | float p = bme.readPressure() / 100.0; // hPa | ||
| - | |||
| - | Serial.print(" | ||
| - | Serial.print(" | ||
| - | Serial.print(" | ||
| - | Serial.println(" | ||
| - | delay(2000); | ||
| - | } | ||
| - | </ | ||
| - | < | ||
| - | 18: | ||
| - | 18: | ||
| - | 18: | ||
| - | 18: | ||
| - | 18: | ||
| - | </ | ||
| - | ==== MHZ-19B ==== | ||
| - | |||
| - | < | ||
| - | #include < | ||
| - | |||
| - | SoftwareSerial mhzSerial(12, | ||
| - | byte cmdReadCO2[] = {0xFF, 0x01, 0x86, 0, 0, 0, 0, 0, 0x79}; | ||
| - | |||
| - | bool readMHZ19B(int &ppm, int &tempC) { | ||
| - | while (mhzSerial.available()) mhzSerial.read(); | ||
| - | |||
| - | mhzSerial.write(cmdReadCO2, | ||
| - | |||
| - | uint8_t resp[9]; | ||
| - | int i = 0; | ||
| - | uint32_t start = millis(); | ||
| - | while (millis() - start < 200) { | ||
| - | if (mhzSerial.available()) { | ||
| - | resp[i++] = mhzSerial.read(); | ||
| - | if (i == 9) break; | ||
| - | } | ||
| - | } | ||
| - | if (i != 9) return false; | ||
| - | if (resp[0] != 0xFF || resp[1] != 0x86) return false; | ||
| - | |||
| - | uint8_t sum = 0; | ||
| - | for (int k = 1; k < 8; k++) sum += resp[k]; | ||
| - | sum = 0xFF - sum + 1; | ||
| - | if (sum != resp[8]) return false; | ||
| - | |||
| - | ppm = resp[2] * 256 + resp[3]; | ||
| - | tempC = resp[4] - 40; | ||
| - | return true; | ||
| - | } | ||
| - | |||
| - | void setup() { | ||
| - | Serial.begin(115200); | ||
| - | delay(200); | ||
| - | Serial.println(" | ||
| - | |||
| - | mhzSerial.begin(9600); | ||
| - | Serial.println(" | ||
| - | } | ||
| - | |||
| - | void loop() { | ||
| - | int ppm, t; | ||
| - | if (readMHZ19B(ppm, | ||
| - | Serial.print(" | ||
| - | Serial.print(ppm); | ||
| - | Serial.print(" | ||
| - | Serial.print(t); | ||
| - | Serial.println(" | ||
| - | } else { | ||
| - | Serial.println(" | ||
| - | } | ||
| - | delay(2000); | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | 18: | ||
| - | 18: | ||
| - | </ | ||
| - | |||
| - | ==== SDS011 ==== | ||
| - | < | ||
| - | #include < | ||
| - | |||
| - | SoftwareSerial sdsSerial(13, | ||
| - | |||
| - | void setup() { | ||
| - | Serial.begin(115200); | ||
| - | delay(200); | ||
| - | Serial.println(" | ||
| - | |||
| - | sdsSerial.begin(9600); | ||
| - | } | ||
| - | |||
| - | bool readSDS011(float &pm25, float &pm10) { | ||
| - | uint8_t buf[10]; | ||
| - | int idx = 0; | ||
| - | uint32_t start = millis(); | ||
| - | |||
| - | while (millis() - start < 2000) { | ||
| - | if (sdsSerial.available()) { | ||
| - | uint8_t b = sdsSerial.read(); | ||
| - | if (idx == 0 && b != 0xAA) continue; | ||
| - | buf[idx++] = b; | ||
| - | if (idx == 10) { | ||
| - | if (buf[0] == 0xAA && buf[1] == 0xC0 && buf[9] == 0xAB) { | ||
| - | pm25 = (buf[2] + 256 * buf[3]) / 10.0; | ||
| - | pm10 = (buf[4] + 256 * buf[5]) / 10.0; | ||
| - | return true; | ||
| - | } else { | ||
| - | idx = 0; | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | return false; | ||
| - | } | ||
| - | |||
| - | void loop() { | ||
| - | float pm25, pm10; | ||
| - | if (readSDS011(pm25, | ||
| - | Serial.print(" | ||
| - | Serial.print(pm25); | ||
| - | Serial.print(" | ||
| - | Serial.print(pm10); | ||
| - | Serial.println(" | ||
| - | } else { | ||
| - | Serial.println(" | ||
| - | } | ||
| - | delay(2000); | ||
| - | } | ||
| - | </ | ||
| - | < | ||
| - | 18: | ||
| - | 18: | ||
| - | </ | ||
| - | |||
| - | ==== Alle drei Sensoren ==== | ||
| - | < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | // BME280 an I2C: SDA = GPIO4 (D2), SCL = GPIO5 (D1) | ||
| - | #define BME280_ADDRESS 0x76 | ||
| - | Adafruit_BME280 bme; | ||
| - | |||
| - | // MH-Z19B an GPIO12/14 | ||
| - | SoftwareSerial mhzSerial(12, | ||
| - | byte cmdReadCO2[] = {0xFF, 0x01, 0x86, 0, 0, 0, 0, 0, 0x79}; | ||
| - | |||
| - | // SDS011 an GPIO13/15 | ||
| - | SoftwareSerial sdsSerial(13, | ||
| - | |||
| - | byte sds011_sleep[] | ||
| - | 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| - | 0x00, 0x00, 0x00, 0x00, | ||
| - | 0xFF, 0xFF, 0x05, 0xAB}; | ||
| - | byte sds011_wakeup[] = {0xAA, 0xB4, 0x06, 0x01, 0x01, | ||
| - | 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| - | 0x00, 0x00, 0x00, 0x00, | ||
| - | 0xFF, 0xFF, 0x06, 0xAB}; | ||
| - | |||
| - | // ---- Hilfsfunktionen ---- | ||
| - | |||
| - | bool readMHZ19B(int &ppm, int &tempC) { | ||
| - | while (mhzSerial.available()) mhzSerial.read(); | ||
| - | mhzSerial.write(cmdReadCO2, | ||
| - | |||
| - | uint8_t resp[9]; | ||
| - | int i = 0; | ||
| - | uint32_t start = millis(); | ||
| - | while (millis() - start < 200) { | ||
| - | if (mhzSerial.available()) { | ||
| - | resp[i++] = mhzSerial.read(); | ||
| - | if (i == 9) break; | ||
| - | } | ||
| - | } | ||
| - | if (i != 9) return false; | ||
| - | if (resp[0] != 0xFF || resp[1] != 0x86) return false; | ||
| - | |||
| - | uint8_t sum = 0; | ||
| - | for (int k = 1; k < 8; k++) sum += resp[k]; | ||
| - | sum = 0xFF - sum + 1; | ||
| - | if (sum != resp[8]) return false; | ||
| - | |||
| - | ppm = resp[2] * 256 + resp[3]; | ||
| - | tempC = resp[4] - 40; | ||
| - | return true; | ||
| - | } | ||
| - | |||
| - | bool readSDS011(float &pm25, float &pm10) { | ||
| - | uint8_t buf[10]; | ||
| - | int idx = 0; | ||
| - | uint32_t start = millis(); | ||
| - | |||
| - | while (millis() - start < 2000) { | ||
| - | if (sdsSerial.available()) { | ||
| - | uint8_t b = sdsSerial.read(); | ||
| - | if (idx == 0 && b != 0xAA) continue; | ||
| - | buf[idx++] = b; | ||
| - | if (idx == 10) { | ||
| - | if (buf[0] == 0xAA && buf[1] == 0xC0 && buf[9] == 0xAB) { | ||
| - | pm25 = (buf[2] + 256 * buf[3]) / 10.0; | ||
| - | pm10 = (buf[4] + 256 * buf[5]) / 10.0; | ||
| - | return true; | ||
| - | } else { | ||
| - | idx = 0; | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | return false; | ||
| - | } | ||
| - | |||
| - | void setSDS011Sleep(bool sleep) { | ||
| - | if (sleep) { | ||
| - | sdsSerial.write(sds011_sleep, | ||
| - | } else { | ||
| - | sdsSerial.write(sds011_wakeup, | ||
| - | } | ||
| - | delay(100); | ||
| - | } | ||
| - | |||
| - | // ---- Setup & Loop ---- | ||
| - | |||
| - | void setup() { | ||
| - | Serial.begin(115200); | ||
| - | delay(200); | ||
| - | Serial.println(" | ||
| - | |||
| - | // BME280 | ||
| - | Wire.begin(4, | ||
| - | if (!bme.begin(BME280_ADDRESS)) { | ||
| - | Serial.println(" | ||
| - | while (1) delay(100); | ||
| - | } | ||
| - | Serial.println(" | ||
| - | |||
| - | // MH-Z19B | ||
| - | mhzSerial.begin(9600); | ||
| - | Serial.println(" | ||
| - | |||
| - | // SDS011 | ||
| - | sdsSerial.begin(9600); | ||
| - | setSDS011Sleep(false); | ||
| - | Serial.println(" | ||
| - | } | ||
| - | |||
| - | void loop() { | ||
| - | Serial.println(" | ||
| - | |||
| - | // BME280 | ||
| - | bme.takeForcedMeasurement(); | ||
| - | float t = bme.readTemperature(); | ||
| - | float h = bme.readHumidity(); | ||
| - | float p = bme.readPressure() / 100.0; | ||
| - | |||
| - | Serial.print(" | ||
| - | Serial.print(t); | ||
| - | Serial.print(h); | ||
| - | Serial.print(p); | ||
| - | |||
| - | // MH-Z19B | ||
| - | int ppm, tco2; | ||
| - | if (readMHZ19B(ppm, | ||
| - | Serial.print(" | ||
| - | Serial.print(ppm); | ||
| - | Serial.print(tco2); | ||
| - | } else { | ||
| - | Serial.println(" | ||
| - | } | ||
| - | |||
| - | // SDS011 | ||
| - | float pm25, pm10; | ||
| - | if (readSDS011(pm25, | ||
| - | Serial.print(" | ||
| - | Serial.print(pm25); | ||
| - | Serial.print(" | ||
| - | Serial.print(pm10); | ||
| - | Serial.println(" | ||
| - | } else { | ||
| - | Serial.println(" | ||
| - | } | ||
| - | |||
| - | delay(10000); | ||
| - | } | ||
| - | |||
| - | </ | ||
| - | |||
| - | < | ||
| - | 18: | ||
| - | 18: | ||
| - | 18: | ||
| - | 18: | ||
| </ | </ | ||