River Health Monitor: Arduino-basiertes Wasserqualitäts-Messsystem
Komponenten und Materialien
| Komponente | Menge |
|---|---|
| Arduino MKR1000 (MKR FOX 1200) | 1 |
| Wasserstandssensor | 1 |
| pH-Sensor | 1 |
| LED (weiß, falls möglich) | 1 |
| Widerstand 220 Ohm | 2 |
| Fotowiderstand (LDR) | 1 |
| Jumper-Kabel | 1 Set |
Benötigte Werkzeuge
- Lötkolben
- Metallsäge
Apps und Online-Dienste
- Arduino Web Editor
- Sigfox (LPWAN-Netzwerk)
- Wia (IoT-Plattform für Visualisierung & Benachrichtigungen)
Über das Projekt
Übersicht
Ein Fluss oder See kann Erholung bieten – wird er schmutzig und kontaminiert, ist der Spaß vorbei. Viele Menschen sind auf Flusswasser für ihre Tiere angewiesen und können kein dreckiges Wasser riskieren.
Stellen Sie sich vor, Sie wohnen direkt am Fluss: Sie wollen nicht nachts von einer Überschwemmung überrascht werden. Oder ein Nachbar kippt Benzin in den Fluss – Ihre Tiere sollen nicht krank werden.
MyRiver löst all diese Probleme: Dank Sigfox funktioniert es in abgelegenen Gebieten, damit jeder Zugriff hat. Das Gerät misst pH-Wert, Verschmutzungsgrad (innovative Methode) und Wasserstand. Live-Monitoring auf Handy/PC überall via Wia. Sofortige Benachrichtigung bei Problemen.
Funktionsweise
Basiert auf Arduino MKR FOX (für Remote-Einsatz). SAM D Low-Power-Modus ermöglicht monatelangen Betrieb mit 2 AA-Batterien.
Messintervall: alle 30 Minuten, dann Deep Sleep (min. 20 Min. Schlaf).
Sensoren:
- pH-Sensor → pH-Wert
- Wasserstandssensor → Pegelstand
- LED + Fotowiderstand → Erkennung unlöslicher Schadstoffe (Öl, Benzin, Quecksilber etc.): LED leuchtet durch Wasser, niedriger LDR-Wert = Trübung/Partikel
Daten → Sigfox (12 Bytes HEX) → Wia → Verarbeitung & Visualisierung → Benachrichtigung.
Datenverarbeitung (Code-Logik)
- Read Sensors – pH, Wasserstand, LDR einlesen & in Variablen speichern
- Format Buffer – 3 Werte in 12-Byte-Puffer packen (je 4 Bytes)
- Parse Data – Puffer an Sigfox senden
Sigfox limitiert auf 12 Bytes. Alle Sensoren geben 0-1023 (10-bit ADC). Jeder Wert = 4 Bytes (mit führenden Nullen aufgefüllt).
Beispiel: LDR=620 → "0620", Wasserstand=24 → "0024". Zusammen: 12-Byte-String → Sigfox.
Gerät im Einsatz
Vorteile
- Wasserstand, pH & Verschmutzung weltweit & jederzeit überwachen
- Sofort-Alarm bei Verschmutzung (löslich/unlöslich) oder Hochwasser
- Einfacher Aufbau & Montage
- Funktioniert in allen Sigfox-Ländern
Projektbau
Schritt 1: Benötigte Bauteile
- Arduino MKR FOX 1200
- pH-Sensor
- Wasserstandssensor
- Fotowiderstand
- Weiße LED
- 2x 220Ω Widerstände
- Jumper-Kabel
Schritt 2: Schaltung aufbauen
Schaltung nicht auf Breadboard – alle Komponenten werden verlötet. Bei Schwierigkeiten: Fritzing-Datei herunterladen und virtuell verdrahten.
MKR FOX vorbereiten
Batteriehalter & Antenne anschließen (Batterie erst NACH Sensoren). Weitere Verkabelung unter "Final".
Schritt 3: Code verstehen
3 Hauptteile:
1. Sensoren lesen
struct GetValue {
int riverLevel() { // Wasserstand
const int val = analogRead(A2);
if(proDebug) { Serial.print("River Level "); Serial.println(val); }
return val;
}
int riverPh() { // pH-Wert
const int val = (analogRead(A1) / 5 * 3.3);
if(proDebug) { Serial.print("River Ph "); Serial.println(val); }
return val;
}
int riverPol() { // Verschmutzung (LDR)
const int val = analogRead(A3);
if(proDebug) { Serial.print("River Pollution "); Serial.println(val); }
return val;
}
};
2. Buffer formatieren
String data(int level, int ph, int pol) {
int values[3] = {level, ph, pol};
String newValues;
for(int i = 0; i < 3; i++) {
if(values[i] < 10) { newValues += "000"; }
else if(values[i] < 100) { newValues += "00"; }
else if(values[i] < 1000) { newValues += "0"; }
newValues += values[i];
}
return newValues;
}
3. An Sigfox senden
void parseData(String data) {
SigFox.beginPacket();
SigFox.print(data);
int ret = SigFox.endPacket();
}
Schritt 4: Wia-Sigfox Integration einrichten
Voraussetzungen: Sigfox-Account, Wia-Account, Wia-App (iOS/Android) für Push-Benachrichtigungen.
Sigfox Callback konfigurieren:
- Type:
Data Uplink - Channel:
URL - Custom Payload Configuration: leer
- URL Pattern:
https://api.wia.io/v1/events - HTTP Method:
POST - Header:
Authorisation: Bearer <WIA_API_KEY> - Content-Type:
application/json - Body: Code aus Vorlage kopieren
Schritt 5: Wia Flow einrichten
Der Flow konvertiert HEX→String, parst die 3 Sensorwerte, wandelt um:
- Verschmutzung & Wasserstand → "HIGH"/"OK" / "POLLUTED"/"OK"
- Roher pH-Wert → echter pH-Wert (Kalibrierung: /73.1428571)
- Bei Grenzwertüberschreitung → E-Mail-Benachrichtigung
Schritt-für-Schritt-Anleitung mit Screenshots (im Original). Hier die wichtigsten Wia Functions:
processPayload (HEX → String)
if(input.body) {
output.body.name = "value";
output.body.data = toByteArrayStr(input.body.data.sigfoxData);
}
function toByteArrayStr(sigfoxData) {
let result = Buffer(sigfoxData, 'hex');
return result.toString('utf8');
}
riverPollution (LDR → POLLUTED/OK)
let minVal = 200; // Schwelle anpassen!
if(input.body.data.sigfoxData) {
let data = input.body.data.sigfoxData;
let processedData = toByteArrayStr(data);
let newData = cutString(processedData); // Bytes 8-11
output.body.name = "waterPollution";
output.body.data = processData(newData);
}
function cutString(data) { /* Bytes 8-11 extrahieren */ }
function processData(data) {
return (data < minVal) ? "POLLUTED" : "OK";
}
riverPh (Raw → pH-Wert)
let minVal = 300, maxVal = 600; // Rohwerte für pH 6.5-8.5
// Bytes 4-7 extrahieren, /73.1428571 → pH mit 2 Dezimalstellen
riverLevel (Wasserstand → HIGH/OK)
let minVal = 0, maxVal = 200; // Schwelle anpassen!
// Bytes 0-3 extrahieren
E-Mail-Vorlagen
- Verschmutzung: "Warning - Water Is Polluted by Insoluble Substances. Device ${trigger.source.device.id} Raw Data ${input.body.data}"
- pH: "Warning - Water Ph is not Appropriate. Water is Contaminated. Device ${trigger.source.device.id} Raw Data ${input.body.data}"
- Wasserstand: "Warning - Water Level is too High, River may be flooding. Device ${trigger.source.device.id} Raw Data ${input.body.data}"
Variablen einstellen
LDR-Schwelle (minVal in riverPollution) muss kalibriert werden: Test-Code aufspielen, LDR-Werte im sauberen Wasser notieren, Schwelle setzen.
void setup() { pinMode(1, OUTPUT); Serial.begin(9600); while(!Serial); digitalWrite(1, HIGH); }
void loop() { const int val = analogRead(A3); Serial.println(val); delay(5000); }
proDebug (default false): true = Serial-Ausgaben für Debugging (USB-Verbindung nötig).
Bibliotheken
- Sigfox (Arduino LLC, LGPL)
- ArduinoLowPower (Arduino LLC, LGPL)
Schritt 6: Finale Montage & Gehäuse
Code hochladen, Batteriehalter anschließen, Schaltung prüfen.
Gehäuse: Aus einer Wasserflasche (ökologisch & wasserdicht).
Bau-Schritte (Bilder im Original): Flasche zuschneiden, Sensoren positionieren, abdichten, Elektronik einbauen.
Installation am Fluss
Wichtig: Bei Hochwasser (High Tide) installieren, damit Gezeiten nicht als Hochwasser-Alarm gewertet werden.
Flaschenhals mit Klebeband abdichten. Sonde so positionieren: Wasserstandssensor unten im Wasser, Fotowiderstand vollständig bedeckt. Am Ufer befestigen (Klebeband oder Schrauben).
Test an dreckigem Fluss: Alle Alarme funktionierten korrekt.
Hintergrund
Ein sauberer Fluss vor dem Fenster – oder ein grüner, schlammiger? Nachts flutet der Fluss ins Haus? MyRiver warnt rechtzeitig.
In der Stadt: Warnung vor illegaler Einleitung (Öl, Chemikalien). Auf dem Bauernhof: Warnung vor dreckigem Trinkwasser für Tiere & vor Überschwemmung.
Nur pH messen reicht nicht – unlösliche Schadstoffe (Quecksilber, Metalle) ändern den pH nicht. Neuartige Methode dieses Projekts: LED + Fotowiderstand detektiert Trübung/Partikel im Wasser. So wird jede Verunreinigung erkannt.
Code
Vollständiger Code: MyRiver (Download im Original)
Schaltplan
Fritzing-Datei: schematics_lXO5SiusZO.fzz
Herstellungsprozess
- Lambda-Sonde (O2-Sensor) verstehen: Rolle, Position und Ausfallanzeichen
- Raspberry Pi Heimtemperaturmonitor mit MCP9808, InfluxDB & Grafana bauen
- Emotionssensor & EEG: Günstige Hardware für Echtzeit-Emotionserkennung
- Präzise Druck- & Luftstrommessung mit analogem Sensor und Arduino
- DHT11 Temperatur- & Feuchtesensor mit LED-Anzeige & Piezo-Summer
- UnifiedWater v1 – Komplettes Arduino Wasserqualitäts-Sensorkit
- 3D RGB Arduclock – Bluetooth-LED-Uhr mit Echtzeituhr
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Interaktives Joystick-Spiel mit Arduino & LED-Feedback
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth