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-messdatenerfassung-sas:platinenschaltung [2026/09/12 13:58] – [D1-mini] bieblwww-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: Platinen mit TESTCODE für die Außenbox]]
 +
 ^ Seite  ^ Inhalt  ^ ^ Seite  ^ Inhalt  ^
 | [[www-messdatenerfassung-sas:startseite|Startseite]]                                                 | Übersicht                                                                                                                                                  |   | | [[www-messdatenerfassung-sas:startseite|Startseite]]                                                 | Übersicht                                                                                                                                                  |   |
Zeile 18: Zeile 21:
     * Bei unseren Platinen kostete eine Platine 1,5 Euro     * Bei unseren Platinen kostete eine Platine 1,5 Euro
  
 +  * [[https://www.youtube.com/watch?v=WAt0aocWS6w&t=121s|Nach diesem Video hat es bei uns auf Anhieb funktioniert ;-)]]
  
  
   * [[lehrer:arduino:p52d1-raumklima-feinstaub-licht|nur intern für SAS-Lehrer: P52-D1-mini]]   * [[lehrer:arduino:p52d1-raumklima-feinstaub-licht|nur intern für SAS-Lehrer: P52-D1-mini]]
  
-  * [[info:3d-druck:sds-011-feinstaubsensor|Gehäuse]]+  * [[info:3d-druck:sds-011-feinstaubsensor|Gehäuse - intern]]
  
 ===== Raumklima - Messbox ===== ===== Raumklima - Messbox =====
  
-  * [[info:arduino:p42d1-raumklima|P-42]] +  * [[info:arduino:p42d1-raumklima|P-42  intern]] 
-  * [[lehrer:arduino:p42d1-raumklima|L-P42]]+  * [[lehrer:arduino:p42d1-raumklima|L-P42  intern]]
  
 {{:info:arduino:esp8266-wemos-d1-mini-pinout-gpio-pin-2.png?300|}} {{:info:arduino:esp8266-wemos-d1-mini-pinout-gpio-pin-2.png?300|}}
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 bei neueren Messboxen durch den BME280 ersetzt, was den Aufbau und den Code nochmalig vereinfacht.
   * 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...
Zeile 55: Zeile 59:
   * auf Vollständigkeit prüfen   * auf Vollständigkeit prüfen
  
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-01.png?400|}}+{{:www-messdatenerfassung-sas:0-raumklima-platine-loeten-2026-06-13-01.png?400 |}}
  
 === 1. Drahtbrücke === === 1. Drahtbrücke ===
Zeile 62: Zeile 66:
  
  
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-02.png?800|}} 
  
 +{{:www-messdatenerfassung-sas:1-raumklima-platine-loeten-2026-06-13-02.png?800 |}}
 === 2. Winkelstifte LED und BMP === === 2. Winkelstifte LED und BMP ===
  
   * ACHTUNG: auf die genaue Position achten   * ACHTUNG: auf die genaue Position achten
  
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-03.png?800|}} +{{:www-messdatenerfassung-sas:2-raumklima-platine-loeten-2026-06-13-03.png?800 |}}
 === 3.  3er Stifte DHT22 === === 3.  3er Stifte DHT22 ===
  
   * auf senkrechte Montage achten   * auf senkrechte Montage achten
  
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-04.png?800|}} +{{:www-messdatenerfassung-sas:3-raumklima-platine-loeten-2026-06-13-04.png?800 |}}
 === 4. 8er Buchsen D1-mini == === 4. 8er Buchsen D1-mini ==
  
Zeile 81: Zeile 83:
   * Reste nach dem Löten entfernen   * Reste nach dem Löten entfernen
  
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-05.png?800|}} +{{:www-messdatenerfassung-sas:4-raumklima-platine-loeten-2026-06-13-05.png?800 |}}
 === 5. 4er- und 5er-Buchse MHZ19B === === 5. 4er- und 5er-Buchse MHZ19B ===
  
Zeile 88: Zeile 89:
   * Reste nach dem Löten entfernen   * Reste nach dem Löten entfernen
  
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-06.png?800|}} +{{:www-messdatenerfassung-sas:5-raumklima-platine-loeten-2026-06-13-06.png?800 |}}
 === 6. Widerstand 470kΩ === === 6. Widerstand 470kΩ ===
  
   * Reste nach dem Löten entfernen   * Reste nach dem Löten entfernen
  
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-07.png?800|}} +{{:www-messdatenerfassung-sas:6-raumklima-platine-loeten-2026-06-13-07.png?800 |}}
 === 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
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-08.png?800|}} 
  
 +
 +{{:www-messdatenerfassung-sas:7-raumklima-platine-loeten-2026-06-13-08.png?800 |}}
 === 8. Externe Sensoren === === 8. Externe Sensoren ===
  
- +{{:www-messdatenerfassung-sas:8-raumklima-platine-loeten-2026-06-13-09.png?800 |}}
-{{:info:platinen:raumklima-platine-loeten-2026-06-13-09.png?800|}} +
 === 9.  fertiges Modul === === 9.  fertiges Modul ===
  
Zeile 1051: Zeile 1049:
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
 } }
-</code> 
-<code> 
-</code> 
-===== Klimamessbox ===== 
- 
-{{:info:arduino:esp8266-wemos-d1-mini-pinout-gpio-pin-2.png?300|}}{{:info:platinen:sds011-dust-sensor-pinout-diagram.jpg?300|}} 
- 
-^ Sensor   ^ Pin (GPIO)  ^ Anschluss  ^                                                                                                Besonderheit ^ 
-| MH-Z19B  |   GPIO12/14 | D6 / D5    |                                                          Spannungsteiler für D6;             SoftwareSerial | 
-| SDS011     GPIO13/15 | D7 / D8    |  Spannungsteiler für D7 darf NICHT eingebaut werden, der SDS sendet bereits mit 3,3V Logik;  SoftwareSerial | 
-| BMP180       GPIO4/5 | D2 / D1    |                                                                                I²C (fest: SDA=SDA, SCL=SCL) | 
-| LDR      |        ADC0 | A0                                                                                                              analog | 
-| 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 
- 
-{{:info:platinen:platine-klimamessbox-d1-mini.png?300|}} 
- 
-{{:info:platinen:platine-klimamessbox-d1-mini-2d-unten.png?200|}} 
-{{:info:platinen:platine-klimamessbox-d1-mini-2d-oben.png?200|}} 
- 
-{{:info:platinen:platine-klimamessbox-d1-mini-3d-unten.png?200|}} 
-{{:info:platinen:platine-klimamessbox-d1-mini-3d-oben.png?200|}} 
- 
- 
-==== Sensorplatine ==== 
- 
-{{:info:platinen:platine-klimamessbox-sensoren.png?300|}} 
- 
-{{:info:platinen:platine-klimamessbox-sensoren-2d-unten.png?200|}} 
-{{:info:platinen:platine-klimamessbox-sensoren-2d-oben.png?200|}} 
- 
-{{:info:platinen:platine-klimamessbox-sensoren-3d-unten.png?200|}} 
-{{:info:platinen:platine-klimamessbox-sensoren-3d-oben.png?200|}} 
- 
-===== TESTCODE KLIMABOX BME, MHZ und SDS===== 
-==== BME280 ==== 
-<code> 
-#include <Wire.h> 
-#include <Adafruit_BME280.h> 
- 
-#define BME280_ADDRESS 0x76    // ggf. 0x77 testen 
-Adafruit_BME280 bme; 
- 
-void setup() { 
-  Serial.begin(115200); 
-  delay(200); 
-  Serial.println("\nBME280 Test"); 
- 
-  Wire.begin(4, 5);            // SDA = GPIO4, SCL = GPIO5 
- 
-  if (!bme.begin(BME280_ADDRESS)) { 
-    Serial.println("BME280 nicht gefunden, Adresse oder Verkabelung prüfen!"); 
-    while (1) delay(100); 
-  } 
-  Serial.println("BME280 gefunden."); 
-} 
- 
-void loop() { 
-  float t = bme.readTemperature(); 
-  float h = bme.readHumidity(); 
-  float p = bme.readPressure() / 100.0; // hPa 
- 
-  Serial.print("Temp: "); Serial.print(t); Serial.println(" °C"); 
-  Serial.print("Feuchte: "); Serial.print(h); Serial.println(" %"); 
-  Serial.print("Druck: "); Serial.print(p); Serial.println(" hPa"); 
-  Serial.println("----"); 
-  delay(2000); 
-} 
-</code> 
-<code> 
-18:11:23.194 -> ---- 
-18:11:25.191 -> Temp: 22.28 °C 
-18:11:25.191 -> Feuchte: 35.97 % 
-18:11:25.191 -> Druck: 1008.70 hPa 
-18:11:25.191 -> ---- 
-</code> 
-==== MHZ-19B ==== 
- 
-<code> 
-#include <SoftwareSerial.h> 
- 
-SoftwareSerial mhzSerial(12, 14);  // RX = GPIO12, TX = GPIO14 
-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, 9); 
- 
-  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("\nMH-Z19B Test"); 
- 
-  mhzSerial.begin(9600); 
-  Serial.println("Sensor heizt auf (ca. 3 Minuten)..."); 
-} 
- 
-void loop() { 
-  int ppm, t; 
-  if (readMHZ19B(ppm, t)) { 
-    Serial.print("CO2: "); 
-    Serial.print(ppm); 
-    Serial.print(" ppm, T-Sensor: "); 
-    Serial.print(t); 
-    Serial.println(" °C"); 
-  } else { 
-    Serial.println("Fehler beim Lesen (noch am Aufwärmen?)"); 
-  } 
-  delay(2000); 
-} 
-</code> 
- 
-<code> 
-18:10:07.806 -> CO2: 674 ppm, T-Sensor: 24 °C 
-18:10:09.844 -> CO2: 675 ppm, T-Sensor: 24 °C 
-</code> 
- 
-==== SDS011 ==== 
-<code> 
-#include <SoftwareSerial.h> 
- 
-SoftwareSerial sdsSerial(13, 15);  // RX = GPIO13, TX = GPIO15 
- 
-void setup() { 
-  Serial.begin(115200); 
-  delay(200); 
-  Serial.println("\nSDS011 Test"); 
- 
-  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, pm10)) { 
-    Serial.print("PM2.5: "); 
-    Serial.print(pm25); 
-    Serial.print(" µg/m³, PM10: "); 
-    Serial.print(pm10); 
-    Serial.println(" µg/m³"); 
-  } else { 
-    Serial.println("Kein gültiges SDS011 Paket empfangen."); 
-  } 
-  delay(2000); 
-} 
-</code> 
-<code> 
-18:29:09.513 -> PM2.5: 4.60 µg/m³, PM10: 8.10 µg/m³ 
-18:29:11.513 -> PM2.5: 4.60 µg/m³, PM10: 8.00 µg/m³ 
-</code> 
- 
-==== Alle drei Sensoren ==== 
-<code> 
-#include <Wire.h> 
-#include <Adafruit_BME280.h> 
-#include <SoftwareSerial.h> 
- 
-// BME280 an I2C: SDA = GPIO4 (D2), SCL = GPIO5 (D1) 
-#define BME280_ADDRESS 0x76 
-Adafruit_BME280 bme; 
- 
-// MH-Z19B an GPIO12/14 
-SoftwareSerial mhzSerial(12, 14);  // RX = 12, TX = 14 
-byte cmdReadCO2[] = {0xFF, 0x01, 0x86, 0, 0, 0, 0, 0, 0x79}; 
- 
-// SDS011 an GPIO13/15 
-SoftwareSerial sdsSerial(13, 15);  // RX = 13, TX = 15 
- 
-byte sds011_sleep[]  = {0xAA, 0xB4, 0x06, 0x01, 0x00, 
-                        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, 9); 
- 
-  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, sizeof(sds011_sleep)); 
-  } else { 
-    sdsSerial.write(sds011_wakeup, sizeof(sds011_wakeup)); 
-  } 
-  delay(100); 
-} 
- 
-// ---- Setup & Loop ---- 
- 
-void setup() { 
-  Serial.begin(115200); 
-  delay(200); 
-  Serial.println("\nGesamttest: BME280 + MH-Z19B + SDS011"); 
- 
-  // BME280 
-  Wire.begin(4, 5);  // SDA, SCL 
-  if (!bme.begin(BME280_ADDRESS)) { 
-    Serial.println("BME280 nicht gefunden!"); 
-    while (1) delay(100); 
-  } 
-  Serial.println("BME280 OK."); 
- 
-  // MH-Z19B 
-  mhzSerial.begin(9600); 
-  Serial.println("MH-Z19B UART gestartet (9600 Baud)."); 
- 
-  // SDS011 
-  sdsSerial.begin(9600); 
-  setSDS011Sleep(false); 
-  Serial.println("SDS011 aufgeweckt, Lüfter sollte laufen."); 
-} 
- 
-void loop() { 
-  Serial.println("\n--- neuer Messzyklus ---"); 
- 
-  // BME280 
-  bme.takeForcedMeasurement(); 
-  float t = bme.readTemperature(); 
-  float h = bme.readHumidity(); 
-  float p = bme.readPressure() / 100.0; 
- 
-  Serial.print("BME280: "); 
-  Serial.print(t); Serial.print(" °C, "); 
-  Serial.print(h); Serial.print(" %, "); 
-  Serial.print(p); Serial.println(" hPa"); 
- 
-  // MH-Z19B 
-  int ppm, tco2; 
-  if (readMHZ19B(ppm, tco2)) { 
-    Serial.print("MH-Z19B: "); 
-    Serial.print(ppm); Serial.print(" ppm, "); 
-    Serial.print(tco2); Serial.println(" °C (Sensorsensor)"); 
-  } else { 
-    Serial.println("MH-Z19B: kein gültiges Paket."); 
-  } 
- 
-  // SDS011 
-  float pm25, pm10; 
-  if (readSDS011(pm25, pm10)) { 
-    Serial.print("SDS011: PM2.5="); 
-    Serial.print(pm25); 
-    Serial.print(" µg/m³, PM10="); 
-    Serial.print(pm10); 
-    Serial.println(" µg/m³"); 
-  } else { 
-    Serial.println("SDS011: kein gültiges Paket."); 
-  } 
- 
-  delay(10000); 
-} 
- 
-</code> 
- 
-<code> 
-18:33:44.196 -> --- neuer Messzyklus --- 
-18:33:44.196 -> BME280: 21.54 °C, 37.46 %, 1008.72 hPa 
-18:33:44.259 -> MH-Z19B: 673 ppm, 22 °C (Sensorsensor) 
-18:33:44.259 -> SDS011: PM2.5=4.20 µg/m³, PM10=7.20 µg/m³ 
 </code> </code>
  
QR-Code
QR-Code www-messdatenerfassung-sas:platinenschaltung (erstellt für aktuelle Seite)