In het vorige artikel gaven we een overzicht van het project van de slimme gecontroleerde pool. In dit tweede deel bespreken we het hart van de controller. Dit is gebaseerd op een ESP32, maar kan worden uitgevoerd met een paar wijzigingen met een ESP8266.
Taak van de poolcontroller
De controller neemt de centrale besturing over. Het meet cyclisch de temperaturen van het zwembadwater en de warmteopslag van het zonnestelsel. Het zal ook de pompen (filters en verwarming) schakelen. De ESP is dus zowel sensor als actuator. De gegevens worden via WLAN uitgewisseld via MQTT.
Temperatuur meten
Het meten van temperatuur is meestal het begin van het programmeren van IoT-sensoren. Er zijn verschillende projectvoorbeelden. De temperatuursensoren komen vaak DHT11 of de nauwkeurigere DHT22 voor gebruik. Aangezien de temperatuursensoren in het project echter extern moeten worden geplaatst, gebruiken we de waterdichte sensor DS18B20. Een van de twee sensoren voor het meten van de temperatuur van het zwembadwater, de andere voor het meten van de temperatuur in de buffertank.
De gemeten temperaturen worden elke 60 seconden uitgelezen door middel van een timer en gepubliceerd als bericht via MQTT. Het interval is een afweging tussen de traagheid van de opwarming van het water en het debuggen van het programma. Vermoedelijk zouden de waarden om de 5 minuten volstaan, maar de integratie in OpenHAB maakt ook de klok van de minuut later veel gemakkelijker. Daarover later meer.
Draadloze stopcontacten bedienen
Omdat we niet direct in het project 230 volt wisselspanning willen verwerken, schakelen we de pompen via radioaansluitingen. In het geval van radioaansluitingen zijn er enkele die via SP's met een 433 MHz radiozender kan controleren. Een lijst van compatibele radioaansluitingen is te vinden in de Wiki van de gebruikte bibliotheek.
Structuur van het circuit
Het circuit op de plug-in board ziet er als volgt uit:
In het geval van temperatuursensoren zijn er ook optrekweerstanden met 4,7k" tussen de datalijn en de voeding +3V VCC.
De gegevensspelden op de ESP32 worden als volgt gedocumenteerd:
#define PIN_DS_SOLAR 16 Temp Sensor Solar
#define PIN_DS_POOL 17 Tijdelijke sensorpool
#define PIN_RSSWITCH 18 voor 433 MHz zender
Broncode van het project
Voor het project maken we gebruik van de ontwikkelomgeving Platform.io IDE. Zo maken we een project voor het bestuur 'esp32dev'. Onlangs Platform.io ook een super Gepubliceerd artikel.
De volledige broncode van het project is te vinden in de GitHub-repository van de auteur: https://github.com/stritti/smart-swimming-pool.
Gebruikte bibliotheken
In dit project is het voor ons belangrijk om bewezen softwarecomponenten te gebruiken en zoveel mogelijk op te lossen via bestaande bibliotheken. Om deze reden worden de volgende Libs gebruikt:
- rc-switch: controle van de radioaansluitingen
- OneWire: Ondersteuning voor I2C-sensoren
- DallasTemperature: Het lezen van de temperatuur van de sensoren
- PubSubClient: MQTT-berichten ontvangen en verzenden
- RemoteDebug: Debugging via Telnet
- ESPBASE: sjabloon voor IoT-projecten
Deze bibliotheken worden opgeslagen in de configuratie van Platform.io (platformio.ini) en worden automatisch geladen en geïntegreerd vanaf het internet wanneer ze worden gecompileerd.
Het programma voor de poolcontroller is gebaseerd op ESPBASE, dat een aantal installatiefuncties biedt zoals geschreven in het vorige artikel. Aan het begin van de code worden enkele variabelen gemaakt en worden de definieers voor de pintoewijzing gedefinieerd.
Naast de twee functies setup() en loop() worden enkele andere functies geïmplementeerd. In wezen gaat het om het ontvangen en verzenden van MQTT-berichten en het implementeren ervan. Daarnaast wordt een timer geïmplementeerd die de temperatuursensoren cyclisch uitleest en publiceert via MQTT-berichten.
De details
- In het Lusfunctie wordt de Wi-Fi-verbinding steeds opnieuw gecontroleerd en indien nodig hersteld. Dit was een verraderlijk probleem: het ESP verloor herhaaldelijk de Wi-Fi-verbinding en zonder de Reconnect kon het geen gegevens meer verzenden.
- De functie Publiceren wordt gebruikt om de MQTT-berichten te verzenden. Zo worden de gegevens van een herstart en de temperatuurmeting gepubliceerd als JSON-berichten.
- De timer voor het verzenden van de temperaturen is gesplitst. De reden hiervoor is dat de werkelijke timer methoden moeten zo kort mogelijk zijn. In de implementatie roept de timer de onTimer-functie aan, die alleen interruptCounter Stappen. In de lusfunctie wordt dit gecontroleerd en de werkelijke onTemperatuurfunctie geactiveerd. Bij deze methode wordt ook de interne temperatuur van het ESP uitgelezen en gepubliceerd.
- De functie onMQTTCallback wordt aangeroepen wanneer een bericht wordt verzonden naar een onderwerp dat begint met '/pool/switch/'. Het bericht bevat de informatie van de radioaansluiting of het moet worden in- of uitgeschakeld. Het onderwerp wordt verder verdeeld in de groep en het apparaat codering. Dit betekent dat de codering van de DIP-schakelaars van de socket omgezet in 0 en 1. Hierdoor kan deze oplossing flexibel elders worden gebruikt.
De broncode van de poolcontroller is direct terug te vinden in het volgende bestand: https://github.com/stritti/smart-swimming-pool/blob/master/Pool-Controller/src/pool-control.ino
Testing
Zodra het circuit is ingesteld en het project is geladen op de ESP, kunnen we al testen. De ESP opent een Wi-Fi-netwerk als toegangspunt omdat er standaard geen Wi-Fi is ingesteld. Als u met uw smartphone verbinding maakt met de poolcontroller, u de juiste wi-fi instellen. Daarna start de microcontroller automatisch opnieuw en probeert hij verbinding te maken met de opgegeven Wi-Fi.
Als alles correct is ingesteld, moet een statusbericht worden gepubliceerd via MQTT aan het begin van het ESP. U alle berichten volgen met de volgende opdracht op de Raspberry:
mosquitto_sub -h localhost -v -t /#
Het IP-adres van de MQTT-server moet mogelijk worden aangepast in de broncode.
Daarna moeten de temperaturen in de minutencyclus op de Framboos worden uitgevoerd.
In de andere richting kunnen we de radioaansluitingen verwisselen door een geschikt bericht te sturen. Het onderwerp is "/pool/switch/<group>/<device>". Groep en Apparaat zijn de dip schakelaars van de socket als 0 en 1. "AAN" of "UIT" wordt verzonden als een bericht.
Wat gebeurt er nu?
Dit legt de basis: we kunnen de temperaturen uitlezen en we kunnen van contact wissel.
In het volgende artikel verbinden we de poolcontroller met de smart home oplossing openHAB en maken we het zwembad echt slim volgens regels.
Ga naar: Zwembad en OpenHAB (3/4)
8 Reacties
Lars
Hallo Matthias,
als günstiges Poolthermometer würde ich persönlich, einfach einen NTC Widerstand in Schrumpffolie (mit Innenkleber) einschweißen. Diesen dann mit 3.3V oder 5V versorgen und diesen einfach mit einem ADC einlesen. Obere Schwelle ca. 3-5% unter dem max vom ADC Stufen setzen und dann die Kennlinie (Temperatur über Spannung oder Stufen) aufnehmen. Ist mit einem „Mini“ Controller sogar erweiterbar auf weitere Temp.Sensoren oder andere Sensoren.
Bei der Lösung ist auch der Umfang der Libs auf 1 oder 2 beschränkt und diese gehören sogar zum Standard. Sollten also keine Probleme machen.
Hoffe hilft ggf. weiter. Persönlich würde ich von fertigen Modulen bei so etwas abraten, weil zu teuer, S-Code unnötig aufgepustet wegen Funktionen in den Libs die du gar nicht nutzt und meist Probleme die Lib-Version mit dem Modul zu aktivieren.
Manchmal ist weniger mehr :-)
Lars
Hallo Leon,
Solche Fragen bekomme ich auch beruflich oft gestellt. Damit es logisch wird und Sinn ergibt muss ich jedoch ein wenig ausholen.
1. Was willst du messen? Ist der Zufluss zur Pumpe wesentlich anders als der Rückfluss zum Pool oder das Poolwasser?
Sollte der Unterschied größer als 2 Grad sein hast du irgendwo ein anderes Problem :-). Meist liegt der Unterschied, IM BETRIEB, zwischen 0,3 und 0,7 Grad. Das reicht meiner Meinung als Toleranz aus und könnte funktionieren. ABER ….
2) Der Offline Betrieb: – Läuft die Pumpe nicht, wird das Wasser in Zu- und Rücklauf nicht bewegt. Bei schwarzen Rohren in der Sonne sind diese nach 3 Stunden schon teilweise unangenehm warm. (28 – 35 Grad C ) Der Pool wird je nach Größe ungefähr 22-26Grad haben. Und genau das wird dein Problem werden wenn du den physikalischen Wandler zu weit von dem Ort wo er eigentlich messen sollte einsetzt.
Hier wäre eine einfache Wetterstation(zweckentfremdet) mit BT Übertragung eine Lösung. Den anderen Sensor an der Pumpe kann man ja als Referenzwert dennoch weiterhin nutzen.
Bei einem Wandler (ob NTC als Sensor, IR- Messung oder Wärmebild ist alles möglich) musst du auf langen Strecken den Spannungsfall (gerade bei Komponenten unter 12 V) sowie den Leitungsquerschnitt über die Länge berücksichtigen (wird sehr schlimm wenn viel Strom benötigt wird). Um Verluste zu verhindern und die Messungen genau zu halten solltest du immer so nah wie möglich am zu messenden Objekt sein.
Ich würde ein 2 teiliges Projekt vorschlagen. Sensor Station am Pool und Steuereinheit innerhalb 80-160m BT-Reichweite. Also wo du willst. Solang guter BT Empfang.
Dein „nicht sichtbar sein“ würde passen. Verlust und Spannungsfall und noch viele weitere Kleinigkeiten entfallen. Die Sensoreinheit ist je nach dem was du später machen willst aufrüstbar. Somit hast du Max Flexibilität und Energieeffizienz (mit Minisolarpanel ggf. gar kein Akku oder Batterietausch notwendig.
Die Fragen am Anfang sollte man sich immer stellen. Was messen? Welche Modi gibt es? Welche Unterschiede in den Modi? Welche replizierbaren Fehler ergeben sich daraus? Welcher Einfluss haben Modi und Fehler auf dein Ergebnis?
Die Fragen kann man auf alle Messungen anwenden. Ich hoffe damit kannst du die für dich beste Entscheidung treffen.
Als E-Ing. FR: Nachrichtentechnik, habe ich dir meine Meinung ja oben bereits geschrieben.
Viele Grüße
Lars
Matthias
Hi,
ich wollte mir noch ein günstiges Thermometer für den Pool basteln, scheine hier aber ein wenig Probleme zu bekommen bei der Vorbereitung meines ESP8266 Boards. Bei PlatformIO bekomme ich recht viele Meldungen, dass die Bibliotheken outdated sind.
Was wäre denn die aktuelle Möglichkeit um das zu bewerkstelligen? Die gefundenen Anleitungen sind leider sehr rudimentär und hier komme ich nicht ganz weiter. Hat jemand einen Tipp mit ggf. Schritt für Schritt Tutorial?
Danke
Andreas Wolter
auf den ersten Bildern ist eine Prototyping Platine zu sehen.
Das Breadboard auf den späteren Bildern ist das MB-102:
https://www.az-delivery.de/products/breadboard?ls=de
Eine kurze Info dazu gibt es im ersten Teil dieser Reihe.
Grüße,
Andreas Wolter
Tom
Tolle Idee.
Welches Breadboard wurde denn hier verwendet?
Danke für die Info vorab.
Andreas Wolter
@Lothar: Zigbees sind natürlich auch eine weitere Lösung, solch ein Projekt umzusetzen. Wie in allen Beiträgen gilt aber auch hier, dass wir nicht die beste Lösung zeigen möchten. Denn jeder entscheidet für sich, was für ihn die beste Lösung ist. Diejenigen, die das gerne mit diesen Komponenten bauen möchten, für die könnte dieser Beitrag nützlich sein.
Frei nach dem Motto: Warum machen wir das so? Weil es geht.
Grüße,
Andreas Wolter
Lothar
Wäre es nicht besser Zigbee Steckdosen (z.B. Lidl) als Aktuatoren der Pumpen zu verwenden????
Leon
Wo kann man den Sensor für die Wassertemperatur am besten unterbringen wenn das Pool haus weit vom Pool entfernt ist und der Sensor nicht sichtbar sein soll?