Server » Verwarming » Eigen installatie » 2020 » Arduino
Verwarmingsinstallatie 2020
Gasconvector met Arduino sturing
Evolutie

Nixieklok met Arduino

Na mijn eerste experimenten met een arduino, was mijn bedoeling om ooit de sturing van de verwarming te laten gebeuren met een arduino. En nu is het zover! Ik heb ondertussen heelwat ervaring met het programmeren van de Arduino (zie nixieklok met arduino). Omdat deze schakeling met recuperatie-onderdelen is gebouwd geweest heb ik de electronica en de programmatie moeten aanpassen aan wat beschikbaar was. Deze schakeling zal je ook niet op het internet terugvinden, althans niet in die uitvoering. Achteraf is zelfs een thermometerfunktie bijgeplaatst.
-

-

Waarom was die arduino nu ook weer nodig?

De arduino is dus nodig om de thermostaat van de verwarming over de dode zone heen te helpen zodat de hysterese kleiner wordt. Mijn streefcijfer is minder dan 1°, en als het kan zelfs minder dan 0.5°.

Om de thermostaat automatisch bij te stellen (zodat de dode zone overbruigd kan worden) gebruik ik een kleine servo-motor. Alle kleine servo-motoren die in de model vliegtuigbouw en dergelijke gebruikt worden hebben dezelfde specificaties: een voedingsspanning van 4.8V tot 6V (4 of 5 NiMH batterijen) en een bereik van 180° (dat is ruim voldoende om de thermostaat te bedienen).

De aansturing is ook standaard, met een PWM signaal waarvan de totale tijd 20ms bedraagt en de puls van 1 tot 2ms gaat. Bij een pulsduur van 1.5ms staat de servo-motor in het midden van zijn bereik. Op de site van arduino kan je een include vinden zodat je de servomotor eenvoudig kan aansturen door een funktie aan te roepen. De servomotor kan 180 stappen zetten van minimum PWM signaal tot maximaal PWM signaal.


Bedieningspaneel

Het systeem werkt met drie ingestelde temperaturen. Bij het selecteren van een temperatuur zet de arduino de servo motor eerst vast op een bepaalde positie, afhankelijk van de gevraagde temperatuur. In deze fase wordt dus de thermostaat-funktie van de gaskachel normaal gebruikt. Geleidelijk aan wordt er bijgeregeld, eerst een stap om de 60 seconden tot een stap om de 8 seconden (als de gewenste temperatuur na 20 minuten nog niet bereikt zou zijn). Geleidelijk aan wordt de thermostaat aangezien als een gewone gaskraan.

Gaandeweg wordt de thermostaat relatief aangestuurd. Is de gewenste temperatuur niet bereikt en staat de brander niet aan, dan wordt de positie van de servomotor een stap verhoogd. Hetzelfde gebeurt in omgekeerde richting als de temperatuur bereikt is en de brander aan staat. De absolute positie van de thermostaat speelt geen rol meer: de thermostaat wordt bijgeregeld om de hysteresis te verminderen. De countdown timer (van 20 naar 0 per minuut) geeft aan hoe snel er bijgeregeld kan worden.

Als de servo-motor niet meer bijgesteld moet worden, dan is dit een teken dat de gevraagde temperatuur bereikt is. De setwaarde van de servo-motor voor deze temperatuur zou dan gebruikt kunnen worden als startwaarde als later dezelfde temperatuur opnieuw gevraagd wordt. Het blijkt echter dat deze waarde niet stabiel is, het electronisch systeem regelt constant wat bij. Er is dus geen ideale thermostaatstand om een bepaalde temperatuur te halen. De mogelijkheid om de startwaarde op te slaan is daarom niet in gebruik genomen (de startwaarde kan enkel manueel gewijzigd worden als dat nodig zou zijn).

Is er minder warmte nodig en moet de brander uitschakelen, dan zal de ruimtetemperatuur beginnen zakken, waardoor de arduino zal ingrijpen om de thermostaat te verhogen zodat er geen dip in de temperatuur ontstaat. Ook als er overshoot dreigt zal de regelaar snel ingrijpen (eenmaal dat we buiten de stabilisatietijd zitten).

De arduino heeft een analoge ingang voor de ruimtetemperatuur. De electronica die de temperatuur meet heeft een differentiator zodat de traagheid (massa van de Pt1000) opgevangen wordt. De temperatuur die naar de arduino gestuurd wordt is de effektieve temperatuur van de ruimte, niet de temperatuur van de sensor.

Bediening

Een arduino uno heeft geen eigen aanduiders, geen keyboard en geen VGA of HDMI uitgang. Je moet dus zelf de input/output voorzien. Het is echt programmeren op machinetaal niveau (gelukkig doe ik dat graag).

We hebben eerst een funktieaanduider met 8 leds (aktief hoog) en 8 druktoetsen die via dezelfde lijnen uitgelezen kunnen worden. Omdat we bij deze toepassing voldoende poorten hebben (dat was wat anders met de nixie-klok) hebben we geen poort expander nodig. De programmatie wordt daardoor ook een pak eenvoudiger voor dit deel. Zou men een 4099 gebruiken, dan zou men slechts 5 lijnen nodig hebben.

De leds geven de aktieve funktie aan, maar een niet-oplichtende led geeft niet aan dat de bijhorende druktoets niet zou werken.

Aangeven funktie of parameter
Naar submenu of terug hoofdmenu
Parameter wijzigen
De druktoetsen (en bijhorende leds) hebben de volgende funktie:
  1. Normale temperatuur (19°)
  2. Lage temperatuur (16°) 's nachts
  3. Afwezig (12°)
  4. Temperatuur +1 (19 wordt 20 en 16 wordt 17)
  5. Temperatuur -1 (19 wordt 18 en 16 wordt 15)
  6. Show/modify PID (parameters van de PID regelaar)
  7. Show/modify servo (parameters van de servomotor)
  8. Tboost (temperatuurboost gedurende 15 minuten)
Voor het stookseizoen 2020-2021 wordt er een real-time klok voorzien. De instelling van de PID parameters komt te vervallen (tegen dan heb ik de parameters voldoende bijgewerkt om een stabiele werking te hebben). Met de oude PID menu zal ik een dagprogramma selecteren: werkdag, vrije dag of "afwezig-tot".

De drukknoppen hebben leds om aan te geven dat de funktie aktief is, hier kunnen enkel de eerste 5 leds en de laatste led aangestuurd worden. Indien de leds gedoofd zijn werkt de controller in manuele modus (alsof men de thermostaat manueel zou verdraaien). Tboost wordt bijvoorbeeld gebruikt als de gangdeur wordt geöpend om de temperatuurval te onderdrukken.

Drukt men op de PID toets, dan komt men in een nieuw menu.

  1. Temp change slow/fast ratio: parameter van de PID regelaar, differentiaal. Bepaalt de tijdsconstante, wordt uiteindelijk niet gebruikt want de electronica vangt de traagheid van de sensor op
  2. Temp change multiplier: PID parameter, invloed van de afgeleide funktie
  3. Countdown timer: tijd dat de servolus open is na een instelling van de temperatuur (telt in minuten)
  4. Parameter value ++
  5. Parameter value --
  6. Back to main menu (de gewijzigde parameters worden in de EEPROM geschreven bij het verlaten van het menu)
  7. Offset parameter temperature, nodig om de inputwaarde (spanning) om te zetten naar een temperatuur, instelling verschuiving
  8. Gain parameter temperature, instelling versterking

De leds van drukknop 2, 3, 7 en 8 kunnen aangestuurd worden, led 6 knippert om aat te geven dat we in het PID menu zitten. Met ++ en -- kunnen alle PID parameters gewijzigd worden.

Dit zijn de servo parameters die gewijzigd kunnen worden (tweede menu):

  1. Servo-motor start value 19°, startwaarde positionnering servo motor bij het kiezen van 19°
  2. Servo-motor start value 16°, idem voor 16°
  3. Servo-motor start value 12°, en 12°.
  4. Parameter value ++
  5. Parameter value --
  6. Actual value servo-motor (volledig manuele bediening)
  7. Back to main menu (de gewijzigde parameters worden in de EEPROM geschreven bij het verlaten van het menu)
De eerste drie leds en led 6 kunnen oplichten, led 7 knippert (servo menu). Met de ++ en -- toetsen kunnen alle waarden gewijzigd worden. Wordt de waarde van de servo-motor gewijzigd, dan gaat de controller volledig manueel werken, en dit tot er in het hoofdmenu een temperatuurkeuze gemaakt wordt.

Met dezelfde 8 datalijnen uit de arduino gaan we de 8 drukknoppen uitlezen. We zetten eerst alle 8 datalijnen laag. De leds doven even, maar de scanfunctie is zo snel dat dit niet opvalt. Eén voor één wordt een lijn hoog gezet en wordt de tweede analoge ingang gemeten (de eerste analoge ingang gebruiken we voor de temperatuur). We gebruiken een analoge ingang omdat we onvoldoende digitale lijnen hebben, maar dit heeft nog een extra voordeel: door een extra weerstand te gebruiken kan men het aantal drukknoppen verdubbelen en zelfs verdrievoudigen. Dit is misschien een uitbreiding voor later.

Na het scannen van de 8 toetsen worden de datalijnen weer voor de aansturing van de leds gebruikt. Om de seconde doen we een scan van de toetsen. In PID en servo modus worden de + en - toets sneller gescand éénmaal dat gedetecteerd wordt dat één van de toetsen ingedrukt is (om een snellere instelling mogelijk te maken).

Display

Als display gebruiken we een alfanumerieke LCD aanduider met 4 regels van 20 tekens, serieel aangestuurd (9600 baud). De indeling van het display wijzigt niet als de controller in een andere modus zit: de funkties worden door de leds aangegeven.

Rechts: het display dat gebruikt zal worden heeft 4 regels van 20 tekens. Dergelijke displays worden doorgaans parallel aangestuurd (per byte of nibble), maar met een extra ic op de print kan het display ook serieel aangestuurd worden (9600 baud), wat veel gemakkelijker te programmeren is. Je hebt dan maar drie aansluitdraden nodig: massa, 5V en serieel (TX op de arduino, RX op de module).

De arduino kan standaard serieel communiceren (via een aparte chip, dus zonder de processor te belasten), maar vaak wordt er een software-serieële communicatie gebruikt. Waarom dit zo gedaan wordt lees je verder op de software-pagina. Hier ook wordt er een software-serieele poort gebruikt.

00010203040506070809 10111213141516171819  
AAAA BB.BB CC.CC Temperature
DD EE WWWW w UUU Loop
QQ.QQ RR.R R SS.SS PID
XXX YYY ZZ Z VVV Servo

Tempertuurinstellingen
AAAAanalogtempAnalogue imput temperatuur (0..1023)
BB.BBtempfastOmgerekende temperatuur (snel verloop)
CC.CCtempcGedifferentierde temperatuur (gebruikte temperatuur)
 
Servo loop
DDcountdownCountdown 20 to 0 per minuut
EEcountercounter countdown tot 0 per seconde
UUUservoposactual servo position
WWWWwkacheltempanalog input boiler and detected status ((on/off)
 
PID parameters
QQ.QQdiffgaindifferential multiplier
RR.RRoffsettempoffset analog input to temp
SS.SSgaintempmultiplier analog input to temp
 
Servo parameters
XXX YYY ZZZ sp[]Servo start position 19° 16° 12°
VVVservoreqrequested servo position

Electronica

De electronica wordt op een andere pagina besproken.

Arduino poorten

Gebruik digitale poorten:
  1. Out Key/led 0
  2. Out Key/led 1
  3. Out Key/led 2
  4. Out Key/led 3
  5. Out Key/led 4
  6. Out Key/led 5
  7. Out Key/led 6
  8. Out Key/led 7
  9. Out SoftwareSerial TX to display
  10. Out PWM servo motor
Analoge ingangen
  1. Temp in
  2. Keyboard in
  3. Kacheltemp in


De complete installatie: rechts de arduino met zijn "shield" die de interface vormt met de buitenwereld, boven de temperatuurmeting en de versterking, onderaan het LCD scherm.

De kabels gaan naar de analoge meters, naar de Pt-1000 en naar de servomotor. Er is ook een schakelende voeding, de aansluitingen komen boven op de arduino print.

Servo loop en kacheltemperatuur

Voor het corrigeren van de positie van de thermostaat moet ik weten of de brander aan of uit staat. Er is geen feedback van de thermostaat van de gaskachel: ik moet dus een extra sensor gebruiken. De afvoerbuis (verbrandingsgassen) is een dunne buis die snel opwarmt en snel afkoelt, zodat de software na 5 seconden kan weten of de brander aan staat of niet.

Waarom is dit belangrijk? Veronderstel dat het systeem op t16 staat (nachttemperatuur). Het is echter niet echt koud buiten, waardoor de temperatuur nooit daalt tot de ingestelde temperatuur, zelfs als slaat de brander nooit aan. Bij een "domme" regeling zou de t16 servo instelwaarde echter voortdurend naar beneden geregeld worden, de setwaarde wordt immers niet bereikt.

Een ander voorbeeld is: ik kom 's avonds laat thuis na een lange dag zonder verwarming. De temperatuur thuis bedraagt 12° en moet naar 19°. Om de ingestelde temperatuur te bereiken heeft de gasbrander echter een zekere tijd nodig. Als de brander aanstaat en op hoog vermogen werkt om de ingestelde temperatuur te halen, heeft het geen nut de t19 servo instelwaarde te verhogen.

Deze meting moet niet echt nauwkeurig zijn: de software moet enkel weten of de brander aanstaat of niet.

Variabelen en constanten

Een aantal waarden zijn constant gedurende het volledige programma. Andere waarden kunnen gewijzigd worden door het programma (of door de bediening) en worden opgeslagen in EEPROM als het menu verlaten wordt.

Na het starten worden de opgeslagen parameters uitgelezen en het systeem op 13° gezet (led 12° en led +1 aan).

Normale temperatuur : 19° (constante)
Nacht temperatuur : 16° (constante)
Afwezig temperatuur : 12 (constante)

Servomotor start value 19° (autowijziging, opslag)
Servomotor start value 16° (autowijziging, opslag)
Servomotor start value 12° (autowijziging, opslag)

Offset temp (bediening, opslag)
Gain temp (bediening, opslag)
Diff. gain (bediening, opslag)
Countdown timer (bediening, opslag)

Servomotor gewenste positie (na temperatuurinstelling of correctie)
Servomotor huidige positie (er wordt maximaal 1 stap gezet per seconde)

Countdown timer, tijd verstreken na een temperatuurinstelling. Na een wijziging van de ingestelde temperatuur wordt de servolus even open gezet.

  • Modus PID parameters wijzigen, boolean
  • Modus servomotor parameters wijzigen, boolean

    Arduino, een echte PLC?

    De arduino is eigenlijk een miniatuur PLC (programmable logic controller), enkel de relais-sturing (uitgang) en de opto-couplers (ingang) ontbreken. De zich herhalende lus, een kenmerk van de PLC komt ook voor in de programmatie van de arduino.

    De arduino mist een funktie die echte PLC's wel hebben: de flankdetectie (Positive Transition Sensing en Negative Transition Sensing). Rechts de voorstelling van een paar funkties in ladder-diagram. Een minpunt van de arduino interface is eigenlijk ook dat je niet met een ladder diagram kan programmeren.

    Het zou interessant zijn om de arduino ook te kunnen programmeren via ladder. Wie voelt zich geroepen om een windows (of linux) interface te schrijven? Op de site staan er zeer eenvoudige voorbeelden om de mensen te helpen met basisprojecten, maar van zodat dat je een wat complexer programma wenst te schrijven, dan lukt het niet meer voor de meeste gebruikers.

    Met de ladder kan je ook mensen aanspreken die nooit geprogrammeerd hebben, maar die wel een electrisch schema kunnen lezen.

    De listing van de arduino software voor de sturing van de gasverwarming staat op deze pagina. De kode wordt nog regelmatig aangepast.

  • Links to relevant pages - Liens vers d'autres pages au contenu similaire - Links naar gelijkaardige pagina's

    -