Raspberry PID regeling (Verwarming)

Ik krijg vandaag een olie gevulde radiator van 2200 Watt binnen, en wil daarmee de woonkamer verwarmen.
De temperatuur sensor zit daar 2,5 meter vandaan.
Nu wil ik graag de temperatuur regelen met een PID regeling, maar daar heb ik geen ervaring mee, dus hulp is zeer welkom.

Ik gebruik een Raspberry, de temperatuur kan ik in lezen met 1 cijfer achter de komma.
De verwarming kan ik Aan/Uit schakelen met een Relais.
Dus de hardware is klaar, maar nu de software...

Ik werk in Python, en heb de "simple-pid" module geinstalleerd.
Zie: https://pypi.org/project/simple-pid/

Dit heb ik aan code:


#!/usr/bin/python3

#========= Initalisatie ===============================================

#https://simple-pid.readthedocs.io/en/latest/
from simple_pid import PID
pid = PID(1, 0.1, 0.05, setpoint=1)

output = 20

pid.sample_time = 1.0  # Update every 1.0 seconds
pid.setpoint = 19.0 #Gevraagd 21 Graden
#pid.Ki = 1.0
pid.tunings = (10.0, 1.0, 1.0)  #P, I, D

pid.output_limits = (0, 1)    # Output value will be between 0 and 1
#pid.output_limits = (0, None)  # Output will always be above 0, but with no upper bound

pid.auto_mode = True  # PID Aan
#pid.set_auto_mode(True, last_output=8.0) #PID Aanzetten en de output alvast op 8.0 zetten
#===================================


#========= Hoofd Routine ===============================================
while (True): #loop forever

  ##### Data ophalen ###### 

  #Hier haal ik de "Binnen_Temperatuur" op 
  Binnen_Temperatuur = ...  
  #---


  #PID Regeling:
  pid.setpoint = 20.0; #Ingestelde_Temperatuur
  targetPwm = pid( Binnen_Temperatuur )
    
   
  p, i, d = pid.components  # The separate terms are now in p, i, d    
    
  print('Ingestelde_Temperatuur: ' + str(Ingestelde_Temperatuur))
  print('Binnen_Temperatuur: ' + str(Binnen_Temperatuur))  
  print(p)
  print(i)
  print(d)
    
  print(targetPwm )
  print('-------') 

  #Hier Schakel ik het Relais In/Uit: 
  if targetPwm == 1:
    #Verwarming Aan
  if targetPwm == 0:
    #Verwarming Uit
  #---
  
  
  time.sleep(5) # 5 Sec. Wachten en de Lus weer herhalen  

Wie kan hier iets over vertellen om dit goed werkend te krijgen ?

Volgens mij is een pid regeling ism een relais geen goede oplossing.
Beter om een vermogensregeling te maken met een SSR.

Als het is om eruit te leren is dat iets anders ;)

LDmicro user.

Het relais gebruik ik nu even om te testen, daarna komt er zeker een SSR in.
Maar eerst maar eens kijken of ik de software werkend kan krijgen :)

Bij een PID regeling heb je een "analoge" uitgang, bijvoorbeeld een waarde die het gewenste vermogen van je verwarming aangeeft. Dimensieloos kan dit van 0% tot 100% gaan.
Met een aan/uit regeling kan je dit benaderen met "PWM", bij voorbeeld 23% komt dan overeen met 23 s "aan" en 77 s "uit". Je regeling is dan wel relatief langzaam, maar met verwarmingen kan dit (langzaam proces).
Ergens moet je wel de p, i en d factoren instellen, dit zie ik niet terug in je sw. Hier nog wat info : http://wiki.robotmc.be/index.php/PidTuning

Als ik het goed begrijp, dan stel ik die hier in:
pid.tunings = (10.0, 1.0, 1.0) #P, I, D

GJ_

Moderator

Op 11 maart 2022 09:54:17 schreef MGP:
Volgens mij is een pid regeling ism een relais geen goede oplossing.

Daarom hebben verwarmingen vaak traditioneel nog een hele lange PWM cyclustijd van 10 of 20 seconden. Tegenwoordig inderdaad meestal gewoon met dikke SSR's, maar die lange tijden zijn gebleven. Voor een verwarming maakt dit ook niet zo gek veel uit.

bprosman

Golden Member

Daarom hebben verwarmingen vaak traditioneel nog een hele lange PWM cyclustijd van 10 of 20 seconden.

Een korte cyclustijd met een (traag) proces als een oliegevulde radiator heeft ook weinig nut.

De jongere generatie loopt veel te vaak zijn PIC achterna.

Gezien de traagheid van deze regeling lijkt me dat je de D-parameter gewoon op 0 moet zetten.

Stijnos

Golden Member

voor verwarming is een PI idd meer dan voldoende.
een snelle response kun je vaak toch niet meten, maar ook niet compenseren.

Qua aansturing kun je ene cycler maken met een relay die x tijd aan is en x tijd uit, of als je je heater kan moduleren, dan kun je dat continu doen op een gereduceerd vermogen

Gezien de traagheid van deze regeling lijkt me dat je de D-parameter gewoon op 0 moet zetten.

Ik heb de D op 0 gezet:
pid.tunings = (10.0, 1.0, 0) #P, I, D

Qua aansturing kun je ene cycler maken met een relay die x tijd aan is en x tijd uit, of als je je heater kan moduleren, dan kun je dat continu doen op een gereduceerd vermogen

Ik heb een stukje software gemaakt, dat het relais x tijd aan en x tijd uit schakelt (PWM) met een totale tijd van 1.000 Sec. (Gewijzigd naar 500 Sec.)


  # "targetPwm" is de waarde die van de PID regelaar komt

  PWM_Aan_Periode = targetPwm
  PWM_Uit_Periode = 100 - targetPwm

  if PWM_Aan_Periode >= PWM_Aan_Periode_Cnt:
      PWM_Aan_Periode_Cnt = PWM_Aan_Periode_Cnt + 1;
      
      if Uitgang_Status == 'Off':
          #Uitgang Inschakelen
          Uitgang_Status = 'On'
      
      if PWM_Aan_Periode_Cnt > PWM_Aan_Periode:
          PWM_Uit_Periode_Cnt = 0

          if PWM_Uit_Periode > 0:
              #Uitgang Uitschakelen
              Uitgang_Status = 'Off'

  
  if PWM_Uit_Periode >= PWM_Uit_Periode_Cnt:
      PWM_Uit_Periode_Cnt = PWM_Uit_Periode_Cnt + 1;
      
      if Uitgang_Status == 'On':
          #Uitgang Uitschakelen
          Uitgang_Status = 'Off'
      
      if PWM_Uit_Periode_Cnt > PWM_Uit_Periode:
          PWM_Aan_Periode_Cnt = 0

          if PWM_Aan_Periode > 0:
              #Uitgang Inschakelen
              Uitgang_Status = 'On'
      
      
  #time.sleep(10) # 10 Sec. Wachten en de Lus weer herhalen
  time.sleep(5) # 5 Sec. Wachten en de Lus weer herhalen
  

Deze code moet nog goed getest worden, er kunnen dus fouten inzitten

buckfast_beekeeper

Golden Member

1000 seconden is > 16 minuten. Je gaat zo een serieuze hysteresis krijgen.

Is het verschil werkelijke temperatuur met ingestelde temperatuur >x graden kan je aan 100% verwarmen. Je kan ook uitzoeken hoe snel je temperatuur stijgt of wat je overshoot is als je tot de gewenste temperatuur gaat verwarmen. Is dit verschil onaangenaam veel, dan kan je net iets sneller uitschakelen dan de gewenste temperatuur. Omgekeerd kan je net hetzelfde. Zakt de temperatuur te ver door als je op de gewenste temperatuur terug inschakelt, dan kan je bij een dalende tendens iets sneller inschakelen.

Een olieradiator is een traag medium, je moet dit meenemen in je sturing.

edit: bij een systeem met een brander moet je brander minimaal x-tijd aan zijn en y-tijd uit om een optimaal rendement te halen. Elektrisch hoeft dit niet. Je radiator gaat echt niet stuk als die elke minuut wordt ingeschakeld en weer uit.

[Bericht gewijzigd door buckfast_beekeeper op vrijdag 11 maart 2022 14:14:18 (15%)

Van Lambiek wordt goede geuze gemaakt.

1000 seconden is > 16 minuten. Je gaat zo een serieuze hysteresis krijgen.

Ik heb het gewijzigd naar 500 Sec., lijkt jullie dat een goede tijd ?

Een olieradiator is een traag medium, je moet dit meenemen in je sturing.

Daarom ben ik een PI(D) regeling gaan gebruiken :)

[...]Ik heb een stukje software gemaakt, dat het relais x tijd aan en x tijd uit schakelt (PWM) met een totale tijd van 1.000 Sec.

Is dat een decimale punt of eentje die de duizendtallen scheidt? In andere woorden, bedoel je met 1.000 sec één seconde of bedoel je met 1.000 sec duizend seconde?

Een seconde is te snel voor een 'gewoon' (mechanisch) relais. Duizend seconde lijkt me niet persé fout, maar ik zou het voorstel van GJ_, 10 of 20 seconde, aanhouden. Je kunt dan sowieso al sneller horen/meten of je schakeling übverhaupt iets doet.

Met je tuningsparameters stel je in hoe je regelaar reageert op een "fout". In deze context betekend fout het verschil tussen de temperatuur die het apparaat meet en de temperatuur die de gebruiker instelt. De tuningsparameters zijn afhankelijk van het "systeem" (het verwarmingsvermogen, de grote van de ruimte, etc) en de invloeden van buitenaf (het openzetten van een raam, of als de zon vol op je projectomgeving komt te staan)..

Dat klinkt nu ingewikkeld, maar ik denk dat ik en anderen je hier je best eenvoudig aan die waarden kunnen helpen. je moet dan voor ons even op de thermometer kijken hoe snel de temperatuur stijgt als je de kachel (handmatig) aanzet, dit moet je even navragen of uitzoeken. Ik beloof het niet, maar als ik er aan denk kan ik je wel helpen.

Is dat een decimale punt of eentje die de duizendtallen scheidt? In andere woorden, bedoel je met 1.000 sec één seconde of bedoel je met 1.000 sec duizend seconde?

1000 Sec. dit is net gewijzigd naar 500 Sec.

Het eerste probleem dat ik tegenkom is de olie gevulde radiator zelf.
Ondanks dat ik daarvan de thermostaat op Maximaal heb staan schakelt dat ding telkens uit, en niet op zijn omgevingsthermostaat, maar door zijn ingebouwde maximaal thermostaat. Tja zo krijg ik de Kamer natuurlijk niet warm. Ik had ook al een proef gedaan met een Straal kacheltje, maar het geluid van de ventilator is erg storend.

Lambiek

Special Member

Op 11 maart 2022 14:48:51 schreef MMSoft:
Het eerste probleem dat ik tegenkom is de olie gevulde radiator zelf.
Ondanks dat ik daarvan de thermostaat op Maximaal heb staan schakelt dat ding telkens uit, en niet op zijn omgevingsthermostaat, maar door zijn ingebouwde maximaal thermostaat.

Schakel je de radiator dan met een relais? Zoja, dan is dat een vreemd gedrag van de radiator.

Als je haar maar goed zit, GROETEN LAMBIEK.
Arco

Special Member

Schakelt die maximaalthermostaat niet gewoon af omdat de kachel te heet wordt?
(meestal iets van 60-75 graden om ernstig letsel bij aanraken te voorkomen)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

De maximaal thermostaat schakeld pas in als de normale thermostaat faalt. Die van ons kun je ook niet vast houden zo heet als hij is.

Als je haar maar goed zit, GROETEN LAMBIEK.

Schakelt die maximaalthermostaat niet gewoon af omdat de kachel te heet wordt?
(meestal iets van 60-75 graden om ernstig letsel bij aanraken te voorkomen)

Het Relais staat op dat moment constant aan, dus heeft de radiator constant voeding.
Deze radiator heeft een instelbare Thermostaat die ik op Maximaal heb staan. Je hoort binnen in de radiator een klik en de radiator is dan uit.
Als ik de instelbare Thermostaat van deze radiator verdraai, dan schakelt deze half weg, de Omgevings temperatuur is dus nog lang niet bereikt.

Maar wel is de radiator dan te warm om vast te pakken.

Nu heb ik zeker 2 kW vermogen nodig om de kamer op temperatuur te krijgen, en dat gaat zo niet lukken...

Lambiek

Special Member

Is de capaciteit van je radiator niet te klein dan?

Als je haar maar goed zit, GROETEN LAMBIEK.

Deze is 2200 W, maar doordat deze al snel uitschakelt en een hele tijd uit blijft krijg ik het hiermee nooit opgewarmd.

https://www.bol.com/nl/nl/p/mobiele-olieradiator-1000-1200-2200-w-11-v…

Lambiek

Special Member

Je kunt beter een IR-straler nemen denk.

Als je haar maar goed zit, GROETEN LAMBIEK.
Frederick E. Terman

Honourable Member

Ik ken eigenlijk geen oliegevulde radiatoren die werkelijk op hoog vermogen blijven werken. Ze schakelen allemaal het grote element uit na een paar minuten, zodat alleen het kleine overblijft.

Twee filmpjes; het eerste legt het probleem uit:
https://www.youtube.com/watch?v=W8MFaZ9-oNI
De filmmaker beschrijft hoe hij dan maar, in plaats van een stand 'hoog', juist een stand 'laag' maakt, met de elementen in serie. Hij blijft het reuze handige kacheltjes vinden.

Het tweede filmpje beschrijft een modificatiepoging om toch 'hoog' te kunnen hebben (overheat thermostat van 70 °C vervangen door een van 85 °C, extra gaten boren), die echter niet hielp:
https://www.youtube.com/watch?v=DI80FQDZBKw

Deze zijn in een 115V-gebied, en de radiatoren zijn dus maar 1500 W (eigenlijk dus 600 W), maar het verhaal is hetzelfde als hier.

Keramisch, kalibratie, parasitair: woordenlijst.org

Met een oliegevulde radiator ga ik het dus niet redden en een straal kacheltje maakt teveel lawaai.
Nu zag ik dat er ook infarood parabool kacheltjes zijn, heeft iemand van jullie daar ervaringen mee ?

Of zoiets ?
https://www.bol.com/nl/nl/p/veito-ch1800re-zwart-energiezuinige-hoge-c…

[Bericht gewijzigd door MMSoft op zaterdag 12 maart 2022 08:28:46 (40%)

Wij verbruiken onze pv overschot aan elektriciteit met een 2000w convector, daar zit geen ventilator in en kunnen makkelijk onze living op 21°C houden als we willen.

e:/ moest het echt vriezen dan weet ik het niet.

LDmicro user.
mel

Golden Member

Ik hoef niet de hele zolder te verwarmen, maar op mn werkplek heb ik onder de tafel een Rittal kastverwarming geschroefd.

mijn werkplek is dus lekker warm. ;) en dat met 500 watt...

u=ir betekent niet :U bent ingenieur..