UnifiedWater v1 – Complete Arduino Waterkwaliteit Sensor Kit
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino MKR GSM 1400 | 1 |
| Adafruit NeoPixel Ring: WS2812 5050 RGB LED (16 LEDs) | 1 |
| GY-21 Temperatuur- en vochtigheidssensor | 1 |
| Troebelheidssensor, fototransistor-uitgang | 1 |
| Adafruit Waterdichte DS18B20 Digitale temperatuursensor | 1 |
| DFRobot Gravity: Analoog Spear Tip pH-sensor / Meter Kit | 1 |
| SparkFun Drukknopschakelaar 12mm | 1 |
| Jumper-draden (generiek) | 1 set |
| Weerstand 220 ohm | 1 |
Benodigde tools en machines
- Solderbout
Apps en online diensten
- Arduino Web Editor
- SORACOM Air IoT Connectiviteitsplatform
- SORACOM Harvest (dataverzameling)
- SORACOM Lagoon (dashboard en visualisatie)
Over dit project
Overzicht
Rivieren. Essentieel voor ons overleven, handel, enz. In het afgelopen decennium zijn grote inspanningen gedaan om de vervuiling van de werelds waterlichamen te verminderen. De rivieren zijn de bron van de vervuiling, omdat mensen niet naar de zee gaan om hun afval te dumpen. Ze dumpen het in de rivieren.
Deze rivieren stromen vervolgens uit in de zee, de oceaan en zo maakt de tandborstel die ooit in een rivier gegooid werd, haar weg over de wereld en strandt aan de andere kant.
In een wereld die probeert vervuiling te bestrijden, is data cruciaal. Het moet makkelijk zijn voor bedrijven en organisaties om samen te werken aan een wereldwijd project om watervervuiling te verminderen. Hier komt UnifiedWater om de hoek kijken.
Een apparaat dat goedkoop en schaalbaar genoeg is om eenvoudig deze data te verzamelen en te analyseren, wat zo noodzakelijk is om te weten hoe vervuild een rivier is. WaterAid komt in 2 modi: één voor bedrijven en één voor particulieren.
Meerdere apparaten kunnen samenwerken, geplaatst op verschillende punten in een stroom of in verschillende waterlichamen. Deze apparaten verzamelen data op een vast interval en sturen dit naar dezelfde database. Hierdoor kan het bedrijf de status van de bewaakte rivier of meer met één klik bekijken.
Door watertemperatuur, pH en vochtigheid te meten, evenals atmosferische temperatuur en vochtigheid, is WaterAid uitgerust met alle sensoren die je nodig hebt om de vervuiling van de rivier te monitoren.
Functionaliteit
WaterAid stelt de gebruiker, een bedrijf of een particulier in staat om data veilig en accuraat te verzamelen en al deze data op één plek te visualiseren dankzij Soracom's cloud. Het project bestaat uit een front-end en een back-end.
Front-end
De front-end is het fysieke apparaat dat de data verzamelt en naar de cloud stuurt. Het apparaat kan in modus 1 of 2 gezet worden. In modus 1 neemt het apparaat een set data op met een druk op de knop, handig voor incidentele monitoring van een waterlichaam. Modus 2 zet het apparaat om om metingen op een gedefinieerd interval te doen en deze naar de cloud te pushen.
Een MKR GSM wordt gebruikt voor de front-end omdat het gemakkelijk te gebruiken en betrouwbaar is. Het kan ook via GSM toegang krijgen tot Soracom. Hieronder zijn de stappen die het apparaat doorloopt bij het verzamelen van data.
Batterij
Het apparaat kan op meerdere manieren gevoed worden: via een LiPo-batterij door de voorziene poort, via een powerbank, of door een batterij aan te sluiten op de VIN-poort. De levensduur hangt sterk af van de batterijcapaciteit. Het apparaat gaat in slaapmodus tussen metingen om zo veel mogelijk energie te besparen.
LED-ring
Het apparaat is ook uitgerust met een LED-ring. Deze geeft de gebruiker feedback over wat het apparaat op dat moment doet. Er zijn 3 modi:
- Multikleur geeft aan dat het apparaat opstart of data verwerkt
- Knipperend rood een waarschuwing, meestal betekent dat het apparaat in het water moet worden geplaatst, maar kan ook een fout aanduiden
- Voortschrijdend blauw of groen geeft aan dat het apparaat momenteel een monster neemt en in het water moet worden geplaatst
Een monster nemen
Alle sensoren van het apparaat moeten in het water worden geplaatst wanneer een monster genomen wordt. Er zit een vertraging van 6 seconden in voordat het monster genomen wordt om de sensoren op te warmen. Voor de beste resultaten moeten de sensoren al tijdens de opwarmfase onder water zijn.
Data verwerken
De data moet in de vorm van een JSON-string naar Soracom gestuurd worden. Dit geeft alle gebruikte keys een waarde. De data is dan gemakkelijk te interpreteren door de back-end. Hieronder een voorbeeld van een payload:
{
"Latitude": 53.3474617,
"Longitude": -6.2514529,
"waterpH": 7.30,
"waterTurbidity": 94,
"waterTemp": 12.10,
"atmoTemp": 14.50,
"atmoHum": 82,
"deviceID": 1,
"deviceName": "device1",
"epoch": 1559392636,
"mode": 2
}
De Back-end
De back-end verwijst naar Soracom. Data wordt verzameld en gevisualiseerd in dashboards, gemaakt met Soracom Lagoon.
Het Dashboard
Het dashboard vat alle verzamelde data samen. Het plaatst de locaties waar data is verzameld op een kaart, de kleur varieert afhankelijk van hoeveel het water vervuild is. De data wordt vervolgens in lijngrafieken weergegeven en volledig samengevat in een tabel.
De gebruiker ontvangt ook e-mailalerts als de pH- of troebelheidswaarden abnormaal zijn.
Schaalbaarheid
Het apparaat is eenvoudig schaalbaar en alle data kan op hetzelfde dashboard verzameld en geïllustreerd worden. Meerdere apparaten kunnen data naar Soracom streamen en laten visualiseren op het dashboard.
De prijs van het apparaat en de extreme gemakkelijkheid om het te bouwen en programmeren maken het eenvoudig om een vloot apparaten te gebruiken. Deze kunnen ook gemakkelijk in Soracom geregistreerd worden met tools zoals Soracom Krypton.
Elk bedrijf of individu heeft hun eigen gepersonaliseerd dashboard waar de data van hun apparaten wordt gevisualiseerd. Hopelijk kunnen mensen in de toekomst op hetzelfde dashboard samenwerken en data met elkaar delen.
Voordelen
- Gelagerde lopende kosten omdat het apparaat zeer zelfvoorzienend is.
- Eenvoudig schaalbaar, het apparaat kan solo of in een vloot van tientallen werken.
- Snelle dataverzameling, zodat data real-time naar de cloud gepusht en gevisualiseerd kan worden.
- Eenvoudige visualisatie, data kan overal en op elk moment bekeken worden via het online dashboard.
Het project bouwen
Stap 1: Benodigde apparatuur
Dit project vereist veel sensoren die veel parameters meten met betrekking tot het water en de atmosfeer. Hieronder een lijst van alle benodigde materialen:
- 1x Arduino MKR GSM
- 1x 16 LEDs RGB LED-ring
- 1x GY-21 temperatuur- en vochtigheidsmodule
- 1x Troebelheidssensor
- 1x Waterdichte temperatuursensor
- 1x pH-sensor en module
- 1x Drukknop
- 1x Weerstand (220Ω)
- Jumper-draden
Stap 2: De schakeling aansluiten
De componenten moeten gesoldeerd worden. Om de schema's duidelijker te maken, is een breadboard gebruikt. Het schema staat hieronder.
De MKR GSM voorbereiden
Na het solderen van de sensoren, moeten de SIM-kaart, GSM-antenne en batterij aan het apparaat bevestigd worden. Ik voed het bord met 2 AA-batterijen via de VIN-poort.
Stap 3: De code begrijpen
Er zijn 4 hoofdafdelingen in de code:
- Sensor data verzamelen
- Tijd en datum ophalen
- Data verwerken
- Data versturen
Al deze secties worden hieronder beschreven en gedetailleerd.
Sensor data verzamelen
Serial.println("Monster nemen");
Serial.println("________________________________________");
Serial.println("Monster nemen");
Serial.println(" OK - Opwarmen");
delay(6000); // vertraging voor sensor-kalibratie
colourLED(50);
Serial.println(" OK - Monster nemen");
Serial.print(" ");
for (int i = 0; i < 16; i++) {
if (mode == 1) {
strip.setPixelColor(i, strip.Color(0, 255, 0));
strip.show();
} else {
strip.setPixelColor(i, strip.Color(0, 0, 255));
strip.show();
}
// meerdere watermonsters nemen - sensoren niet zo precies
waterTurbidity += getWaterTurbidity();
waterPh += getWaterPh();
if (i > 14) {
// één monster nemen voor hoge-precisie sensoren
waterTemperature = getWaterTemp();
atmoTemperature = getAtmoTemp();
atmoHumidity = getAtmoHumidity();
}
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println(" Succes - Monsters genomen");
for (int i = 0; i <= 16; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
delay(30);
}
Serial.println("________________________________________");
Serial.println("");
delay(500);
De bovenstaande codesectie begint met 6 seconden wachten voor sensor-kalibratie in het water. Het apparaat loopt dan 16 keer, waarbij elke keer een nieuwe LED op de ring aan gaat.
Data van sensoren met fluctuerende waarden wordt 16 keer verzameld en het gemiddelde berekend. De hoge-precisie sensoren worden in de laatste lus uitgelezen.
Tijd en datum ophalen
void getCredentials() {
Serial.println(" [1/2] Tijd");
Serial.println(" OK - Tijd ophalen van RTC");
currentEpoch = processTime();
colourLED(50);
Serial.println(" [2/2] Geolocatie");
Serial.println(" OK - Geolocatie ophalen van GPRS");
while (!getLocation());
Serial.print(" Succes - Geolocatie is "); Serial.print(latitude, 7); Serial.print(", "); Serial.println(longitude, 7);
colourLED(50);
}
bool getLocation() {
if (location.available()) {
latitude = location.latitude();
longitude = location.longitude();
delay(500);
return true;
} else {
delay(500);
return false;
}
}
De eerste lus handelt de credentials af. De tijd wordt uit de onboard RTC gehaald (gesynchroniseerd met het GSM-netwerk in setup). De geolocatie wordt uit GPRS gehaald.
Data verwerken
void processData() {
Serial.println(" OK - Gemiddelde van water pH en troebelheid berekenen");
waterPh = (waterPh / 16);
waterTurbidity = (waterTurbidity / 16);
Serial.println(" OK - Data naar Serial dumpen");
Serial.println("");
Serial.print(" [Water] pH "); Serial.println(waterPh);
Serial.print(" [Water] Troebelheid "); Serial.println(waterTurbidity);
Serial.print(" [Water] Temperatuur "); Serial.println(waterTemperature);
Serial.print(" [Atmo] Temperatuur "); Serial.println(atmoTemperature);
Serial.print(" [Atmo] Vochtigheid "); Serial.println(atmoHumidity);
Serial.println("");
Serial.println(" Succes - Data verwerkt");
colourLED(50);
}
String makeLine() {
Serial.println(" OK - String maken");
String dataReturned; dataReturned += "{"; dataReturned += " \n";
dataReturned += "\"Latitude\":" + String(latitude, 7); dataReturned += ", \n";
dataReturned += "\"Longitude\":" + String(longitude, 7); dataReturned += ", \n";
dataReturned += "\"waterpH\":" + String(waterPh); dataReturned += ", \n";
dataReturned += "\"waterTurbidity\":" + String(waterTurbidity); dataReturned += ", \n";
dataReturned += "\"waterTemp\":" + String(waterTemperature); dataReturned += ", \n";
dataReturned += "\"atmoTemp\":" + String(atmoTemperature); dataReturned += ", \n";
dataReturned += "\"atmoHum\":" + String(atmoHumidity); dataReturned += ", \n";
dataReturned += "\"deviceID\":" + String(deviceID); dataReturned += ", \n";
dataReturned += "\"deviceName\":\""; dataReturned += String("\""); dataReturned += String(deviceName); dataReturned += String("\""); dataReturned += ", \n";
dataReturned += "\"epoch\":" + String(currentEpoch); dataReturned += ", \n";
dataReturned += "\"mode\":" + String(mode); dataReturned += " \n";
dataReturned += "}";
Serial.println(" OK - Data is hieronder");
Serial.println("");
Serial.println(dataReturned);
Serial.println("");
Serial.println(" Succes - String klaar");
colourLED(50);
return dataReturned;
}
processData() berekent het gemiddelde van de gefluctueerde sensorwaarden en dumpt alle data naar de Serial Monitor.
makeLine() compileert alle data in de JSON-string die naar Soracom gestuurd wordt. Alle waarden worden in een JSON-buffer geparsed, klaar voor verzending naar de back-end.
Data versturen
void parseData(String dataToSend) {
Serial.println(" OK - Verbinding opzetten");
if(client.connect(url, 80)) {
Serial.println(" OK - Verbinding tot stand gebracht, data versturen");
client.println("POST / HTTP/1.1");
client.println("Host: harvest.soracom.io");
client.println("User-Agent: Arduino/1.0");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(dataToSend.length());
client.println("");
client.println(dataToSend);
Serial.println(" OK - Data verstuurd");
}
Serial.println(" OK - Respons ophalen");
Serial.println("");
while(1) {
if(client.available()) {
char c = client.read();
Serial.print(c);
}
if(!client.connected()) {
break;
}
}
Serial.println(" Succes - Data verstuurd");
}
Tot slot wordt de data naar Soracom gestuurd. Het apparaat maakt een verbinding met de server, bereidt de credentials voor, stuurt de data en print de respons naar de Serial Monitor. Daarna gaat het in slaap tot een trigger het weer wakker maakt, en herhaalt de stappen.
Stap 4: Variabelen instellen
Er zijn bepaalde variabelen die bewerkt moeten worden voordat het project gebruikt kan worden:
mode: dicteert of het apparaat periodiek monsters neemt (modus 2) of op knopdruk (modus 1).deviceID en deviceName: unieke identificatie per apparaat bij gebruik van een vloot.sleepTime: slaaptijd tussen metingen. In de code 5 seconden (voor testen), in de praktijk bijv. 15 minuten.proDebug: debug-modus. Standaard false. Als true, draait het apparaat niet zonder geopende seriële monitor.
Stap 5: Code uploaden
Voordat de back-end ingesteld wordt, moet er data naar gestuurd worden. Verbind de MKR GSM met je computer, upload de code (stel mode in op 1), plaats alle sensoren in water, druk op de knop en wacht tot data verzameld en verstuurd is. Herhaal dit een paar keer om Soracom Air te vullen.
Stap 6: Soracom instellen
Deze stap is in twee delen: account aanmaken en SIM registreren, en Soracom Harvest instellen voor dataverzameling.
Deel 1: Account aanmaken - Volg de stappen in de afbeeldingen (registratie, SIM-activering, etc.)
Deel 2: Groepen en Harvest - Maak een groep aan, schakel Harvest in, configureer de data-invoering.
Stap 7: Lagoon instellen
De laatste stap op Soracom is Lagoon, het tool om data te visualiseren en e-mailalerts te maken bij afwijkende waarden. Volg de stappen in de afbeeldingen voor het aanmaken van dashboards, grafieken, kaarten en alerts.
Kalibratieproblemen
De troebelheids- en pH-sensoren moeten gekalibreerd worden voor nauwkeurig gebruik.
- pH-sensor: Kalibreer met de potentiometers op de module. Plaats de probe in stil staand flessenwater van pH 7, wacht 5 minuten, print de pH-waarde naar de seriële monitor en draai de potentiometer tot de pH 7 is.
- Troebelheidssensor: Niet erg precies, dus een relatieve percentage ten opzichte van zuiver water wordt genomen. Als metingen 100% overschrijden, plaats de sensor in zuiver water, print de spanning op de analoge pin naar de seriële monitor, en pas de
calibration-variabele insensors.haan naar de gemeten spanning.
Bibliotheken
- ArduinoLowPower (c) 2016 Arduino LLC
- Adafruit_Neopixel (c) Phil Burges
- MKRGSM (c) 2016 Arduino AG
- Wire (c) 2006 Nicholas Zambetti
- OneWire (c) 2007 Jim Studt
- DallasTemperature
- RTCZero (c) 2015 Arduino LLC
Eindresultaat
Tot slot heb ik een behuizing gemaakt die draagbaar is maar ook vast gemonteerd kan worden voor beide modi. Zie de afbeeldingen voor de bouwstappen.
Zorg ervoor dat de modus correct ingesteld is en gebruik het apparaat in het veld. Check je lokale rivier of meer en zie hoe schoon het is. Speel met het dashboard en ontdek de andere widgets.
Achtergrond
Vandaag is data de nieuwe valuta en het eenvoudig en efficiënt verzamelen ervan is de sleutel tot een betere omgeving. Door de vervuiling van rivieren en meren collectief te meten, kunnen we bewustwording creëren dat het water vuiliger wordt en dat er actie ondernomen moet worden.
Ik dacht aan een idee voor de Soracom-wedstrijd en wilde iets maken wat goed is voor het milieu. Het idee van mensen en bedrijven die samenwerken op collectieve dashboards om de status van rivieren en meren wereldwijd te visualiseren, inspireerde me om dit project aan te pakken.
Wat ga jij doen om watervervuiling te stoppen? Want actie moet vandaag genomen worden, en morgen is een dag te laat.
Code
De repository voor het project: https://github.com/Andrei-Florian/UnifiedWater-v1
Schema
Zie het bijgevoegde schema (Fritzing-bestand).
Productieproces
- Een LED Besturen met een PIR-bewegingssensor op Raspberry Pi
- Een Goedkope Raspberry Pi Grondvochtigheidssensor Bouwen voor Slimme Irrigatie
- De DS18B20 Temperatuursensor Testen op Raspberry Pi
- Een Raspberry Pi thuistemperatuurmonitor bouwen met MCP9808, InfluxDB & Grafana
- Sensor Telemetrie 2.0.1 – Geavanceerde Temperatuurbewaking met Azure IoT Hub
- Emotiesensor & EEG: Goedkope Hardware voor Real-time Emotiedetectie
- Adafruit 10DOF IMU-data van Raspberry Pi 2 naar Azure Event Hubs Sturen met Windows 10 IoT Core
- Riviergezondheidsmonitor: Arduino-gebaseerd Waterkwaliteitssysteem
- Bouw een Sensor Toren met Arduino Cloud: Temperatuur, Beweging & Gas Monitoring
- Moderne Jukebox: Raspberry Pi & Arduino LED Muziekspeler
- De zuurstofsensor (O2) begrijpen: functie, plaatsing en defectherkenning