De Besturing

Voor de besturing zal ik gebruik maken van een Raspberry Pi (hieronder vermeld als ‘Pi’). Deze vormt het ‘brein’ van onze spa. De Pi is een mini computer die naast onder andere enkele USB poorten en een Ethernet interface ook beschikt over 26 General Purpose Input Output of GPIO pinnen waarmee we dingen kunnen gaan inlezen of sturen.

Raspberry Pi 2 B

De logic level van de Pi is 3,3V: dit wil zeggen dat op de uitgangs GPIO pinnen een logische 1 gelijk is aan 3,3V en een logische 0 gelijk is aan 0V. Omgekeerd is op de ingangs GPIO pinnen 3,3V gelijk is aan een logische 1 en 0V gelijk aan een logische 0.

Het eendraadschema van de vermogenskringen laat zien dat we 5 relais zullen aansturen. We zullen ook de ingangs- en de uitgangstemperatuur van het water uitlezen en de spa beschikt ook over ingebouwde verlichting die we willen besturen.

Werk genoeg aan de winkel ! Hieronder een overzicht.

Schema

schematic revision 1.5

Om proper te werken gebruik ik een prototyping bord dat mooi past op de GPIO header van de Pi. Ik gebruik het Breakout Pi Plus prototyping board. Dit bordje is meteen ook de reden dat ik GPIO24 niet gebruik (de aandachtige lezer zal dit ongetwijfeld reeds hebben opgemerkt) want deze pin is niet verbonden op het prototyping bord.

Breakout Pi Plus

Vermogen sturing

De pompen worden aan- en uitgeschakeld dmv contactoren (relais). Voor dit project gebruik ik de Eltako R12-200-24VDC. Dit is een dubbelpolige contactor die wordt gestuurd met 24V DC.

Maar waarom gebruikt u een afzonderlijke 24V voeding voor de contactoren meneer? U kan toch even goed contactoren met universele stuurspanning gebruiken en deze sturen met dezelfde transfo als die van de LEDs!

Antwoord: Dat is waar! Maar ik heb deze 24V contactoren tweedehands op de kop getikt en het was bijgevolg goedkoper om een voeding te kopen dan om alle contactoren te vervangen door een model met universele stuurspanning.

De Pi kan uiteraard geen 24V sturen. We zullen de uitgang moeten sturen met een transistor en een afzonderlijke voeding van 24V.

Ik ga hier (uit gemakzucht) gebruik maken van een IC die deze schakeling bevat. De ULN2803A bevat 8 darlington transistoren. Deze transistoren zijn in staat om grote vermogens te schakelen (tot 50V 0,5A) en zijn bijgevolg perfect geschikt om onze contactoren aan te sturen.

We kunnen nu het volgende python script uitvoeren op de Pi om te testen of de sturing correct werkt.

Temperatuurmeting

Ik zou ook graag de temperatuur meten van het water. Hoe ik dat praktisch ga realiseren heb ik in een vorig hoofdstuk reeds beschreven.
De sensoren die ik ga gebruiken zijn van het type DS18B20. Deze digitale sensoren zijn in staat om temperaturen te meten tussen -55°C en +125°C. Uitlezen gaat via 1-Wire, dat is een bus systeem. Ik kan dus meerdere sensoren aan de bus hangen en zo naast de in- en de uitgaande watertemperatuur bijvoorbeeld ook nog de buitentemperatuur meten.

De sensoren worden gevoed door 3,3V afkomstig van de Pi. De DATA bus gaat naar de Pi via GPIO4. Tussen de voeding en de DATA bus komt er nog een pull-up weerstand van 4.7k Ohm.

We schuiven de waterdichte sensoren in de Thermowell verbindingsstukken en plaatsen het afsluitdopje terug. Zo loopt enkel de draad van de sensor nog uit het verbindingsstuk. De sensoren worden dan parallel met elkaar verbonden en verlengd naar de stuurkast.

LED sturing

De verlichting in de spa is met LEDs. Elk verlichtingspunt heeft 3 LEDs. Een rode, een groene en een blauwe (in eenzelfde behuizing). De anode (positieve pool) (op school werd mij het volgende geheugensteuntje aangeleerd: KNAP 🙂 Kathode = Negatief, Anode = Positief) is gemeenschappelijk. Door de hoeveelheid van elk van deze kleuren te laten variëren kan men alle kleuren van de regenboog maken. Dit is RGB sturing.

De LED driver die oorspronkelijk in de spa gemonteerd was heeft een uitgangsspanning van 15V. Ik zal deze 15V op elke kleur moeten laten variëren van 0V tot 15V en zo de kleur van het resulterende licht bepalen.

Dit is niet zomaar mogelijk met de Pi. Ten eerste kan de Pi geen 15V sturen en ten tweede is de Pi een computer en die kan alleen maar met 0 of 1 werken.

We gaan hier opnieuw een transistor en een afzonderlijke voeding gebruiken. Deze keer gebruik ik een MOSFET, dit is een soort transistor (MOS = Metal Oxide Semiconductor & FET = Field Effect Transistor). Deze zal de weerstand tussen de source en de drain pin laten variëren afhankelijk van de spanning op de gate pin. Een laag voltage op de gate = hoge weerstand tussen source en drain = lage stroom. Een hoog voltage op de gate = lage weerstand tussen source en drain = lage stroom. Zo zouden we de LEDs kunnen dimmen.

Ik ga gebruik maken van de IRLZ34N waarbij de L staat voor Logic level (3,3V), deze zal wanneer er 3,3V op de gate wordt gezet een heel lage weerstand hebben tussen source en drain en zo tot maximaal 55V 30A kunnen schakelen. Dit is ruimschoots voldoende voor onze LEDs.

Maar onze Pi kan enkel maar 0 of 1 sturen (0V of 3,3V). Hier moeten we gebruik maken van een handig trucje: PWM of Pulse Width Modulation. De pin van de Pi wordt bij PWM heel snel hoog (1) en laag (0) gezet waardoor de illusie ontstaat dat deze wordt gedimd. De frequentie waarop de Pi dit kan is 800Hz of 800 keer per seconde. Dus als we de LED op 25% willen dimmen dan geven we een 1 gevolgd door 3 keer een 0.
Voor de puristen: de tijd dat de pin op 1 staat heet de Duty Cycle of arbeidscyclus.

De Pi beschikt over 2 PWM kanalen: het eerste kanaal kan gebruikt worden via GPIO12 of GPIO18 en het andere via GPIO13 of GPIO19. Deze PWM wordt hardwarematig gegenereerd door de chip. We komen 1 kanaal te kort om onze LED sturing te maken. MAAR softwarematig kan de Pi PWM sturen op elke GPIO pin. In onze toepassing is het niet belangrijk dat de PWM timing 100% perfect is dus kunnen we gebruik maken van de softwarematige PWM.

Water niveau

Ik heb op AliExpress ooit (voor minder dan 5€) niveau sensoren gekocht. Deze worden beschreven als “15mA 5V Optical Infrared Water/Liquid Level Sensor“. Deze zal ik nu ook monteren. Ik wil 2 metingen uitvoeren:

  1. Water Niveau “Skimmer“: Enkele centimeters boven de skimmer. Deze zal meten of het water niveau van de spa hoog genoeg is. Als er een lek ontstaat of het waterniveau zakt door verdamping kan ik een melding krijgen (en later misschien ook de spa automatisch laten bijvullen).
  2. Water Niveau “Intake”: Enkele centimeters boven het aanzuigpunt van de pompen. Deze dient als droogloopbeveiliging voor de pompen. Zoals u weet worden de pompen gekoeld door het water dat door de pomp vloeit. De pomp mag absoluut nooit zonder water draaien. Indien deze sensor droog staat mogen de pompen niet worden gestart.
15mA 5V Optical Infrared Water/Liquid Level Sensor

Deze sensoren werken als volgt: de behuizing bevat zowel een infrarood LED als een fototransistor. Wanneer de punt van de sensor zich in de open lucht bevindt dan zal het licht van de LED weerkaatsen op de punt en zal dit de fototransistor doen geleiden. Wanneer de punt van de sensor ondergedompeld is in een vloeistof (in ons geval is dat het water van de spa) dan zal het licht van de LED ontsnappen en zal de fototransistor niet geleiden.

De sensor wordt gevoed door 5V maar de logic level van de Pi is 3,3V. De sensor rechtstreeks aansluiten op de Pi kan dus niet. Zoals u kan ziet op het schema pas ik het principe van de spanningsdeler toe om de 5V afkomstig van de sensor om te zetten naar ongeveer 3,3V. Ik heb hier (zoals u kan zien op de foto) gebruik gemaakt van de weerstanden die ik reeds in mijn bezit had. Op het schema heb ik de waarden van de weerstanden herleid naar de dichtsbijzijnde weerstandswaarde van de E24 reeks.

Verbruik (Power consumption)

Meten is weten. We gaan dus ook het verbruik van ‘het systeem’ meten. Dit is later handig om beter de spa te kunnen sturen indien we hem niet gebruiken.
De merkzame lezer zal al weten dat ik de spa heb aangesloten op een 3-fase 2x240V aansluiting. Ik zal uit gemak enkel de fase meten waarop de circulatie- en warmtepomp aangesloten zijn. Dat is in mijn geval de meest relevante data.

Om dit te gaan meten gaan we op zoek naar een kWh meter die we kunnen uitlezen via de Pi. Onze favoriete Chinese webwinkel zal hier alweer soelaas brengen. De sensor die we gaan gebruiken wordt hier beschreven als “PZEM-004T 3.0 Version Single Phase Power Energy Meter TTL Modbus AC 220V 100A Voltage Current Watt Kwh Ammeter with CT USB Cable

PZEM-004T 3.0 Version Single Phase Power Energy Meter TTL Modbus AC 220V 100A Voltage Current Watt Kwh Ammeter with CT USB Cable

De bijgeleverde spoel (coil) plaatsen we over (de draad moet door de coil lopen) de fase draad die de circulatie- en warmtepomp voedt. Via de bijgeleverde UART–>USB omvormer kunnen we de sensor ook verbinden met de Pi.

De data kan worden uitgelezen via het Modbus-RTU (over TTL UART) protocol. Ik zal hier gebruik maken van een bestaand python script van José Ortiz om de waarden uit te lezen en regelmatig weg te schrijven naar een database.

Afstandsbediening en noodstop

De spa wordt hoofdzakelijk bediend via onze smartphone(s) door middel van de webinterface. Toch lijkt het mij ook handig om de hoofdfuncties van de spa aan te kunnen spreken met fysieke knoppen.

Het schema (revisie 1.4c) werd weer aangepast om 4 drukknoppen te kunnen aansluiten op 4 vrije GPIO’s van de Pi. Er werd ook een normaal gesloten knop voorzien in serie met de voeding van de contactoren. Deze knop zal dienstdoen als noodstopschakelaar. Als deze knop wordt ingedrukt zullen alle pompen onmiddellijk stilvallen.

De waterdichte knoppen worden gemonteerd in een (waterdichte) behuizing. Ik voorzie ook nog wat plaats om later eventueel een display in diezelfde behuizing te kunnen monteren.

De knopjes die ik heb gevonden op mijn favoriete chinese webwinkel worden daar omschreven als “16mm metal push button switch ring lamp power symbol button Waterproof LED light self-lock self-reset button 1NO1NC”. Deze zijn voorzien van verlichting in allerhande kleuren en zijn ook verkrijgbaar met of zonder symbolen (die dan ook mee oplichten). De verlichting van de knopjes zijn voorzien voor een voedingsspanning van 12 tot 24V. Ik kan deze dus zonder probleem parallel over de verlichting van de spa (15V) aansluiten.

We voorzien 4 knoppen: 1 blauwe knop voor de verlichting (omdat we de verlichting van de spa op de vaste blauwe kleur hebben ingsteld), 2 groene knoppen voor de verschillende massagekringen en tenslotte 1 rode knop voor het aan- en afzetten van de bubbels (blower).

Op het schema sluiten we de drukknoppen aan de GPIO pinnen van de Pi via een pull-up weerstand. In de praktijk kunnen we ook de ingebouwde pull-up weerstanden van de Pi gebruiken. Dit kan in Python door de volgende instructie te gebruiken.

GPIO.setup([poort_of_pin_nummer], GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

Het gemonteerde resultaat ziet er dan alsvolgt uit:

De afstandsbediening wordt nog verder geupgrade met een display (omdat het kan 🙂 ). De Pi beschikt over de mogelijkheid om te communiceren via een I²C bus. I²C is ontwikkeld om op een eenvoudige manier (2 data lijnen) communicatie tussen ICs mogelijk te maken. Je kan hiermee dus allerlij sensoren uitlezen maar bijvoorbeeld ook een display aansturen.

Dit soort display is in allerlei maten en kleuren te verkrijgen. Ik kies voor een blauw verlichte LCD display (met I²C backpack) van 2 lijnen / 16 witte karakters. Let wel op bij aankoop dat de Pi een logic level heeft van 3,3V en dat de de meeste I²C backpacks 5V als logic level hanteren. Je moet dan een Logic Level Converter (zoals bvb: 4 Channel IIC I2C Logic Level Converter Bi-Directional Module 5V to 3.3V) tussen de Pi en de backpack monteren.

Om de display vanuit de Pi met Python aan te spreken zijn allerhande libraries (of voorbeelden) vrij te vinden op het internet. Ik baseer me op RPi_I2C_driver.py van Denis Pleic.

Ik zal dus in de afstandsbediening een opening moeten maken om de display te kunnen lezen. Deze opening dient waterdicht te zijn. Ik gebruik hiervoor een transparant venster dat ik in de opening lijm met silicone.

Aan de achterkant monteer ik de display rechtover het venster en sluit deze aan op de I²C bus (1 DATA en 1 CLOCK lijn) + voeding 5V DC.

Het gemonteerde resultaat ziet er dan als volgt uit:

Automatisch bijvullen

Omdat we niveausensoren hebben geïnstalleerd kunnen we perfect bepalen wanneer de spa moet worden bijgevuld. Dit gaan we dan ook automatiseren.

We passen opnieuw het schema (revisie 1.5) aan zodat we nu ook een klep kunnen aansluiten op een vrije GPIO waarmee de watertoevoer zal worden op- of afgezet.

Ik ga opnieuw shoppen op mijn favoriete Chinese webwinkel. Daar wordt deze klep omschreven als: “3/4″ Normally Close Brass Electric Solenoid Valve DN20 24V for Water Oil Air IP65“.

3/4″ Normally Close Brass Electric Solenoid Valve DN20 24V for Water Oil Air IP65

Omdat de klep aanzienlijk wat stroom verbruikt (ongeveer 2.5 ampère) wanneer we hem laten openen gebruiken we opnieuw hetzelfde principe als bij de vermogen sturing: Een darlington transistor (de IC (ULN2803A) heeft er 8 aan boord dus die kunnen we opnieuw gebruiken) en een contactor.

De originele spa beschikte over een “waterval” waarvan de aansluiting het had begeven. Ik was niet van plan om deze te gaan vervangen. Maar nu we op zoek moeten naar een manier om de spa bij te vullen is dit misschien wel de ideale plaats.

Ik zal de oude ‘waterval’ verwijderen en een nieuwe monteren. De afmetingen en de aansluitingen van de nieuwe komen niet helemaal overeen met de oude. We maken de plek eerst helemaal proper en maken dan nieuwe gaten in de kuip.

Om de nieuwe ‘waterval’ aan te sluiten zal ik gebruik maken van ‘Gardena’ slangkoppelingen. Deze zijn courant te verkrijgen en werken makkelijk en lekvrij.

We kunnen nu de vers gemonteerde “waterval” gebruiken om het bad bij te vullen.

Ik schrijf een test scriptje in Python om te testen of alles werkt. We zullen later deze routine opnemen in de daemon die de spa bestuurt.

Alles werkt zoals voorzien: zolang het water niveau onder de sensor blijft zal de klep open blijven en vult het bad zich met vers water. Wanneer de niveau sensor nat wordt zal het bad nog even blijven vullen en dan automatisch stoppen.

In het volgend hoofdstuk wordt de spa afgewerkt.

Terug naar het overzicht.