Pomp aansturen werkt niet goed

Kijk. Dat is duidelijk. Die "10 graden warmer" die zat er her en der in, CJ heeft er iets mee gedaan, maar wordt door jou meteen afgeschoten. En dat komt dus omdat CJ niet wist wat jij WILDE. Niet omdat hij niet kan programmeren of omdat ie een foutje gemaakt heeft.

Uit jou beschrijving blijkt dus nu dat het iets moet worden als:

code:


  if niet aan-het-pompen  EN collector > zwembad+10
       pomp aan
       wacht 60 seconden. 
       aan-het-pompen = true

  if collector > zwembad)
     toggle pomp
     wacht 1 sec. 
  else 
     aan-het-pompen = false

Dat taaltje van jou dat wil ik niet leren (ik ken al voldoende talen). Maar het is een PRIMA oefening voor jou om mijn pseudocode in jou taaltje om te zetten.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Anoniem

Op 5 mei 2019 16:33:48 schreef Jeroennr:
Het programma doet wat het moet doen ...

Ja met een schoonheidsfout want hierdoor

pic basic code:

ElseIf PompFunctie = 1 Then
     Toggle POMP
     DelayMS POMPSNELHEID
EndIf

gaat de pomp 2min aan, 1min uit, 1min aan, enz

maar als je nu

pic basic code:

ElseIf PompFunctie = 1 Then
     DelayMS POMPSNELHEID
     Toggle POMP
EndIf

gaat de pomp 1min aan, 1min uit, 1min aan, enz

Op 5 mei 2019 16:33:48 schreef Jeroennr:
alleen als de temperatuur van de collector nou weer zakt dan houd het programma de regel

pic basic code:

ElseIf Collector > (Zwembad + Hysteresis) Then ;anders, als Collector hoger is dan Zwembad + 10 graden dan...
    If PompFunctie = 0 Then
     POMP = HOOG

aan ...

Dat is natuurlijk niet zo want in dat geval zit het programma hier

pic basic code:

If Collector < Zwembad Then                    ;Als Collector lager is dan Zwembad dan...
    POMP = LAAG                                ;pomp uit
    PompFunctie = 0

Maar je programma heeft wel een tweede schoonheidsfoutje die jouw opmerking verklaart.
Als je microcontroller een delay uitvoert doet die NIKS anders dan die delay uitvoeren, maw WACHTEN.
Dus als tijdens jouw delay van 1min de temperatuur wijzigt .....

Daar zijn oplossingen voor waar je wel zelf naar op zoek moet.
Voor de simpelste geef ik je als tip dat 60 keer 1 seconde wachten ook 1 minuut is :-)

Ik denk dat de "minstens 10 graden warmer" bedoeld is om die "1 minuut" gewoon vrijwel altijd de moeite waard te maken. En dat het te verwachten valt dat de collector wel enkele graden in temperatuur zal zakken. Dus 60x de temperatuur bekijken lijkt me juist niet de bedoeling.

Maar over het algemeen kan je dit soort programmas als een "statemachine" schrijven.

code:


Symbol STATE_WACHTEN    = 1
Symbol STATE_POMPEN     = 2
...

state=STATE_WACHTEN
While 1=1
  ; hier de temperaturen meten
  If state = STATE_WACHTEN Then
     POMP = LAAG
     if collector > zwembad+10 then 
        pomptijd = 60
        state = STATE_POMPEN
     Endif
  Endif
  If state = STATE_POMPEN Then
     pomptijd = pomptijd - 1
     POMP = HOOG
     if pomptijd = 0 then
        state = STATE_LANGZAAMPOMPEN
     state = STATE_POMPEN
  Endif
  If state = STATE_LANGZAAMPOMPEN Then
     toggle POMP
     if collector < zwembad then
        state = STATE_WACHTEN
  Endif
  sleep 1
wend

Voor iedere state moet je code schrijven: "wat te doen?" en "wanneer stoppen we hiermee?".
De "wat te doen" is hier altijd iets met de pomp. Door naar een volgende state is hier iets met temperaturen of gewoon wachten.

In de taal C zou ik een "switch / case" constructie gebruiken. Dan heb je niet steeds if state = STATE_... Hoe dat hier moet weet ik niet. Ik heb het hier zo gedaan dat zonder 1s te wachten aan het eind de volgende state al meteen geprocessed wordt (als je voorwaarts gaat in de statemachine). Als je dat niet wilt worden een aantal endifs veranderd in elseif...

Let op dat het meten van DS1820 temperaturen relatief lang duurt: haast een seconde. Als je twee sensoren hebt, kan je die twee tegelijk meten door ze alletwee de opdracht te geven de temp te meten en dan later pas ze uit te lezen.

Als je de mainloop iedere seconde wilt laten lopen zou je dan iets doen als:

code:


 ; stuur sensor 1: start temp meting
 ; stuur sensor 2: start temp meting
 while 1==1
    ; lees DS sensor1
    ; lees DS sensor2

    ; statemachine hier.

    ; stuur sensor 1: start temp meting
    ; stuur sensor 2: start temp meting
    sleep 1
 wend
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Lambiek

Special Member

Op 5 mei 2019 21:42:18 schreef anoniem015:
Als je microcontroller een delay uitvoert doet die NIKS anders dan die delay uitvoeren, maw WACHTEN.
Dus als tijdens jouw delay van 1min de temperatuur wijzigt .....

Daar zijn oplossingen voor waar je wel zelf naar op zoek moet.

Hij kan ook gewoon de on interrupt handler gebruiken natuurlijk, heb je niets met delayms of delayus te maken.

[Bericht gewijzigd door Jeroen op woensdag 22 juli 2020 22:27:58 (2%)

Als je haar maar goed zit, GROETEN LAMBIEK.

Ik zal ook hier eens wat van (proberen) te maken.
Bedankt rew!

Op 6 mei 2019 09:03:09 schreef rew:
Ik denk dat de "minstens 10 graden warmer" bedoeld is om die "1 minuut" gewoon vrijwel altijd de moeite waard te maken. En dat het te verwachten valt dat de collector wel enkele graden in temperatuur zal zakken. Dus 60x de temperatuur bekijken lijkt me juist niet de bedoeling.

Maar over het algemeen kan je dit soort programmas als een "statemachine" schrijven.

code:


Symbol STATE_WACHTEN    = 1
Symbol STATE_POMPEN     = 2
...

state=STATE_WACHTEN
While 1=1
  ; hier de temperaturen meten
  If state = STATE_WACHTEN Then
     POMP = LAAG
     if collector > zwembad+10 then 
        pomptijd = 60
        state = STATE_POMPEN
     Endif
  Endif
  If state = STATE_POMPEN Then
     pomptijd = pomptijd - 1
     POMP = HOOG
     if pomptijd = 0 then
        state = STATE_LANGZAAMPOMPEN
     state = STATE_POMPEN
  Endif
  If state = STATE_LANGZAAMPOMPEN Then
     toggle POMP
     if collector < zwembad then
        state = STATE_WACHTEN
  Endif
  sleep 1
wend

Voor iedere state moet je code schrijven: "wat te doen?" en "wanneer stoppen we hiermee?".
De "wat te doen" is hier altijd iets met de pomp. Door naar een volgende state is hier iets met temperaturen of gewoon wachten.

In de taal C zou ik een "switch / case" constructie gebruiken. Dan heb je niet steeds if state = STATE_... Hoe dat hier moet weet ik niet. Ik heb het hier zo gedaan dat zonder 1s te wachten aan het eind de volgende state al meteen geprocessed wordt (als je voorwaarts gaat in de statemachine). Als je dat niet wilt worden een aantal endifs veranderd in elseif...

Let op dat het meten van DS1820 temperaturen relatief lang duurt: haast een seconde. Als je twee sensoren hebt, kan je die twee tegelijk meten door ze alletwee de opdracht te geven de temp te meten en dan later pas ze uit te lezen.

Als je de mainloop iedere seconde wilt laten lopen zou je dan iets doen als:

code:


 ; stuur sensor 1: start temp meting
 ; stuur sensor 2: start temp meting
 while 1==1
    ; lees DS sensor1
    ; lees DS sensor2

    ; statemachine hier.

    ; stuur sensor 1: start temp meting
    ; stuur sensor 2: start temp meting
    sleep 1
 wend

Ik wil graag een regel 1x uitvoeren en daarna overslaan.
Wie weet welk commando daar voor gebruikt moet worden, het geld voor onderstaande regel.

pic basic code:

If Collector < Zwembad Then                    ;Als Collector lager is dan Zwembad dan...
    POMP = LAAG                                ;pomp uit
    PompFunctie = 0
 
ElseIf Collector > (Zwembad + Hysteresis) Then ;anders, als Collector hoger is dan Zwembad + 10 graden dan... [u][b](Om deze en bovenste gaat het)[/b][/u]
    If PompFunctie = 0 Then
        POMP = HOOG
        DelayMS 6000
        POMP = LAAG
        PompFunctie = 1
     ElseIf PompFunctie = 1 Then
        Toggle POMP
        DelayMS POMPSNELHEID
     EndIf
 
EndIf

Op 11 mei 2019 23:08:05 schreef Jeroennr:
Ik wil graag een regel 1x uitvoeren en daarna overslaan.
Wie weet hoe ik dit aan moet pakken?
Het geld voor

pic basic code:

ElseIf Collector > (Zwembad + Hysteresis) Then ;anders, als Collector hoger is dan Zwembad + 10 graden dan... 

pic basic code:

If Collector < Zwembad Then                    ;Als Collector lager is dan Zwembad dan...
    POMP = LAAG                                ;pomp uit
    PompFunctie = 0
 
ElseIf Collector > (Zwembad + Hysteresis) Then ;anders, als Collector hoger is dan Zwembad + 10 graden dan... (((Om deze gaat het)))
    If PompFunctie = 0 Then
        POMP = HOOG
        DelayMS 6000
        POMP = LAAG
        PompFunctie = 1
     ElseIf PompFunctie = 1 Then
        Toggle POMP
        DelayMS POMPSNELHEID
     EndIf
 
EndIf

Op 11 mei 2019 23:08:05 schreef Jeroennr:
Wie weet welk commando daar voor gebruikt moet worden, het geld voor onderstaande regel.

Er staan er ongeveer tien, ik weet niet welke je bedoelt.

Op 11 mei 2019 23:08:05 schreef Jeroennr:
Ik wil graag een regel 1x uitvoeren en daarna overslaan.

Dan zet je hem bovenaan, voor het begin van de while lus. Dan wordt ie 1x uitgevoerd en daarna niet meer.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Ik ben de afgelopen dagen druk bezig geweest om de programma's werkend te krijgen maar ik krijg het maar niet voor elkaar.

Nog even kort wat het moet doen in de volgende volgorde:

1: temperatuur meten van 2 ds18B20 sensoren (1 = collector en ander = zwembad)

2: meet het verschil tussen collector en zwembad

3: als het verschil van collector 10 graden hoger is dan zwembad dan..

4: LED 1 minuut laten branden, daarna

5: LED knipperen

6: als het verschil tussen zwembad en collector weer gelijk is dan

7: pomp uit

Wat de reden ook mag zijn, de LED gaat branden bij (regel 3??) als het verschil weer lager word dat moet niet want de LED moet gewoon blijven knipperen totdat temperatuur van beide sensoren gelijk zijn.

Hieronder het programma wat ik zelf gedeeltelijk heb gemaakt en wat hetzelfde doet als de voorbeelden.

pic basic code:

Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
 
Xtal = 4
 
All_Digital TRUE

Dim Collector As Word
Dim Zwembad As Word
Dim Decimalen As Byte
Dim Decimalen1 As Byte
Dim PompFunctie As Byte         ;0 = een minuut aan, 1 = knipperen

;Logische constanten
Symbol Hysteresis   = 75        ;150 staat voor 10 graden verschil.
Symbol HOOG         = 1
Symbol LAAG         = 0
Symbol POMPSNELHEID = 30       ;mSec, aan/uit snelheid pomp.



;Poortnamen
;Symbol Relais     = PORTA.4    ;Sluit een LED met 1k serie weerstand aan op deze poort
Symbol POMP        = PORTA.3    ;Sluit een LED met 1k serie weerstand aan op deze poort



DelayMS 500                     ;LCD stabilisering
 
Cls                             ;Wis scherm en zet cursor links bovenaan 
Print At 1, 1, "Zonnecollector" ;Plaats tekst op het display
Print At 2, 1, "regelaar" 
DelayMS 3000
 
Cls                             ;Wis scherm en zet cursor links bovenaan 

;Programma

 High POMP
 DelayMS 3000
 Low POMP


While 1 = 1

OWrite PORTA.0, 1, [$CC, $44]    ' Zend 'Convert' opdracht (temperatuur meten)
While ORead PORTA.0,4 = 0 : Wend ' Wacht tot conversie is voltooid...
OWrite PORTA.0, 1, [$CC, $BE]    ' Zend 'Read ScratchPad' opdracht
ORead  PORTA.0 , 2, [Collector.LowByte, Collector.HighByte] ;Lees temperatuur en plaats dit in de variabele 

OWrite PORTA.1, 1, [$CC, $44]    ' Zend 'Convert' opdracht (temperatuur meten)
While ORead PORTA.1,4 = 0 : Wend ' Wacht tot conversie is voltooid...
OWrite PORTA.1, 1, [$CC, $BE]    ' Zend 'Read ScratchPad' opdracht
ORead  PORTA.1 , 2, [Zwembad.LowByte, Zwembad.HighByte] ;Lees temperatuur en plaats dit in de variabele 

Decimalen = 0                           ' Op 0 voor de zekerheid..
Decimalen = Collector.LowByte << 4      ' Alleen de laatste 4 bits van Temperatuur zijn nodig.
Decimalen = Decimalen >> 4              ' Bits weer op de originele plaats zetten
Decimalen = Decimalen * 6.25            ' Resolutie van de DS18B20 is 0.0625 graden celcius.(aanpassen als tempratuur niet klopt)
 
Decimalen1 = 0                          ' Op 0 voor de zekerheid..
Decimalen1 = Zwembad.LowByte << 4       ' Alleen de laatste 4 bits van Temperatuur zijn nodig.
Decimalen1 = Decimalen1 >> 4            ' Bits weer op de originele plaats zetten
Decimalen1 = Decimalen1 * 6.25          ' Resolutie van de DS18B20 is 0.0625 graden celcius. (aanpassen als tempratuur niet klopt)

Print At 1, 1, "Collector ",Dec (Collector >> 4) , ".", Dec1 Decimalen / 10, 223, "C  "
                ' Door de laatste 4 bits van Temperatuur weg te gooien krijg je de graden Celcius.
 
Print At 2, 1, "Zwembad ",Dec (Zwembad >> 4) , ".", Dec1 Decimalen1 / 10, 223, "C  "
                ' Door de laatste 4 bits van Temperatuur weg te gooien krijg je de graden Celcius.



;*** Thermostaat

If Collector < Zwembad Then                  
   Low POMP      
    
ElseIf Collector > (Zwembad + Hysteresis) Then

   DelayMS 80
   Toggle POMP

EndIf
Wend 

Dus alles moet max 1x? Of ben je begin weer bij stap x vergeten?

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Op 15 mei 2019 09:48:05 schreef rew:
Dus alles moet max 1x? Of ben je begin weer bij stap x vergeten?

Nadat de temperatuur van collector 10 graden hoger is moet de pomp (led) 1 minuut branden, daarna knipperen totdat de temperatuur van beide sensoren gelijk is.
Daarna pomp (led) uit totdat tempratuur weer 10 graden hoger is enz.

Dat is de bedoeling maar als nu de tempratuur zakt bijv. Zwembad is 10 en collector 19 dan gaat de led continu branden en dan moet ie juist knipperen totdat tempratuur van beide sensoren gelijk is.