Pomp aansturen werkt niet goed

Hallo allemaal, ik heb onderstaand programma (bewerkt) maar nu wil ik graag de pomp in het programma 60 sec laten draaien en daarna moet de pomp wat anders doen, wat ik ook probeer het lukt me niet..

Het gaat om de regel: DelayMS 60000 ;Pomp blijft 1 minuut lopen

pic basic code:


' **************************************
' ******** DS18B20 uitlezen !!! ********
' **************************************
 
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

;Logische constanten
Symbol Hysteresis   = 75 ;150 staat voor 10 graden verschil.
Symbol Hysteresisstart   = 75 ;150 staat voor 10 graden verschil.
Symbol HOOG         = 1
Symbol LAAG         = 0
Symbol POMPSTART    = 4000
Symbol POMPSNELHEID = 20       ;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

;        76543210
PORTA = %00000000             ;Alle PORTA uitgangen uit (laag maken)
TRISA = %11110111             ;PORTA.3 omschakelen als uitgang voor de pomp

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

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  ;Als Collector lager is dan Zwembad dan...
      POMP = LAAG           ;pomp uit
    ElseIf Collector > (Zwembad + Hysteresis) Then ;anders, als Collector hoger is dan Zwembad + 10 graden dan...
      DelayMS 60000 ;Pomp blijft 1 minuut lopen
    Toggle POMP 
      DelayMS POMPSNELHEID ;Pomp aan/uit.
      
      
    EndIf

;If Zwembad >= 384 Then POMP = LAAG   ;stopt pomp als temp hoger is dan 23 °C of 448

;END                           ;Einde programma

Wend

DelayMS 300


End                           ;Einde programma
Anoniem

Pomp start wel maar pas NA 1 minuut ;-)
Dus pas bij toggle pomp!
Bedoeling van je delayms pompsnelheid zie ik niet

Op 23 april 2019 18:24:32 schreef anoniem015:
Pomp start wel maar pas NA 1 minuut ;-)
Dus pas bij toggle pomp!
Bedoeling van je delayms pompsnelheid zie ik niet

Heb het aangepast maar kom er nog niet uit..

pic basic code:

If Collector < Zwembad Then  ;Als Collector lager is dan Zwembad dan...
      POMP = LAAG           ;pomp uit
    ElseIf Collector > (Zwembad + Hysteresis) Then ;anders, als Collector hoger is dan Zwembad + 10 graden dan...
      Toggle POMP 
    DelayMS 6000 ;Pomp blijft 1 minuut lopen 
      DelayMS POMPSNELHEID ;Pomp aan/uit.

De pomp moet eerst 1 minuut lopen en daarna aan/uit gaan (knipperen)

[Bericht gewijzigd door Jeroen op woensdag 22 juli 2020 22:26:16 (1%)

benleentje

Golden Member

Na de delayMS 6000 moet de pomp wel worden uitgezet.

Als de voorwaarde voor elseif waar is word deze slechts maar 1 keer doorlopen en pas bij de volgende keerde dat de elseif waar is word deze weer 1 keer doorlopen.

De pomp moet eerst 1 minuut lopen en daarna aan/uit gaan (knipperen)

Onder welke voorwaarde en hoelang moet de pomp gaan knipperen. En wat bedoel je met knipperen? Maar het belangrijkste is dat je eerst duidelijk de voorwaarde bepaald. Dan kan je in je programma elke keer als die voorwaarde waar is de pomp 1 keer laten knipperen

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
Anoniem

pic basic code:


If .... then
 Pomp   = Uit
 Merker = 0
Elseif ... then
 If Merker = 0 then
  Pomp  = Aan
  Delayms 60000
  Pomp  = Uit
  Merker = 1
 Elseif Merker = 1 then
  Toggle Pomp
  Delayms Pompsnelheid
 Endif
Endif

Met Knipperen zal TS wel PWM 50% bedoelen
Maar 20ms geeft hier een PWM freq van 25Hz, das wel laaaag...

Wat bedoel je met merker anoniem015?

[Bericht gewijzigd door Jeroen op woensdag 22 juli 2020 22:26:58 (19%)

Anoniem

Hij herkent de opdracht 'merker' niet.
Is dit een andere programeertaal?

Ik gebruik Proton (pic basic)

"Merker" is gewoon een variabele in het voorbeeld van anoniem015. Die zul je nog moeten declareren:

code:

Symbol Merker = 0

Overigens is het netter om die variabele een functionele naam te geven. Bijvoorbeeld:

code:

Symbol PompFunctie = 0 ;0 = een minuut aan, 1 = knipperen

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

Anoniem

Op 26 april 2019 06:22:57 schreef Jeroennr:
Hij herkent de opdracht 'merker' niet.

Euh... je compiler geeft als error: Variabele 'MERKER' niet gevonden.
Met de regelnummers waar de variabele MERKER voorkomt.
Altijd goed lezen en dan de link leggen :-)

Overigens is het netter om die variabele een functionele naam te geven.

Klopt, merkerbits en -bytes noem ik steeds Mb_ en MB_ gevolgd door een naam die naar de functe verwijst waarvoor ze nodig zijn.
Bij Mb_Pomp zie je dan onmiddelijk dat het over een Merkerbit gaat voor de functie van een pomp
Bij MB_Temp_Low zie je dat het over een Merkerbyte gaat voor de functie van een laagste temperatuur meting, instelling, grenswaarde

Op 23 april 2019 20:39:41 schreef anoniem015:

pic basic code:


If .... then
 Pomp   = Uit
 Merker = 0
Elseif ... then
 If Merker = 0 then
  Pomp  = Aan
  Delayms 60000
  Pomp  = Uit
  Merker = 1
 Elseif Merker = 1 then
  Toggle Pomp
  Delayms Pompsnelheid
 Endif
Endif

Met Knipperen zal TS wel PWM 50% bedoelen
Maar 20ms geeft hier een PWM freq van 25Hz, das wel laaaag...

Ik snap dat je "merker" moet declareren maar dan heb ik ook nog de pomp in bovenstaande voorbeeld, waar staat merker dan voor?

Dit word een programma om een pomp aan te sturen voor een zonnecollector.
Wanneer de temperatuur in de collector 10 graden warmer is dan het zwembad dan moet de pomp 1 minuut lopen om de collector te vullen met water daarna moet het verschil tussen zwembad en collector gemeten worden en als de collector nog steeds warmer is dan het zwembad dan moet de pomp om de seconde aan en weer uit gaan.
Als het verschil gelijk of kleiner is moet de pomp stoppen.

Dit is de hele bedoeling van de schakeling.

[Bericht gewijzigd door Jeroen op woensdag 22 juli 2020 22:26:30 (1%)

benleentje

Golden Member

Onder welke voorwaarde en hoelang moet de pomp gaan knipperen.

Je hebt nog geen antwoord op mijn post gegeven. En daarom begrijp je niet wat merker moet doen.

Je moet dus gaan bedenken wanneer de pomp moet gaan knipperen, of hoelang of hoeveel keer.

Dit regel kan bv je voorwaarde zijn

pic basic code:

ElseIf Collector > (Zwembad + Hysteresis)

Is die voorwaarde voldaan dan maak je merker 1 en anders maak je merken 0. Nu kan je het stukje code van anoniem015 gebruiken om in het gaval als merker 1 is de pomp te laten knipperen.

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

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

De pomp moet 1 minuut aangaan onder de voorwaarde

pic basic code:

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

Dus als de ds1820 een hogere temp. geeft dan de andere ds1820.
Daarna moet de pomp aan/uit gaan met een vertraging van ongeveer 1 sec.
Dit moet zolang doorgaan totdat het verschil in temp. gelijk of lager is.

Anoniem

Op 27 april 2019 06:11:22 schreef Jeroennr:
De pomp moet 1 minuut aangaan onder de voorwaarde

pic basic code:

Collector > (Zwembad + Hysteresis)

Dus... en waar ga je dat nu invullen in onderstaande?

Op 23 april 2019 20:39:41 schreef anoniem015:

pic basic code:


If .... then
 Pomp   = Uit
 Merker = 0
Elseif ... then
 If Merker = 0 then
  Pomp  = Aan
  Delayms 60000
  Pomp  = Uit
  Merker = 1
 Elseif Merker = 1 then
  Toggle Pomp
  Delayms Pompsnelheid
 Endif
Endif

:O

[Bericht gewijzigd door Jeroen op woensdag 22 juli 2020 22:26:42 (1%)

Ok, dat heb ik gedaan (hoop dat ik het zo aardig goed heb..
Alleen krijg ik de volgende melding.

Anoniem

Met de foutmelding 'Toewijzing kan niet aan een Constante' heeft de compiler volkomen gelijk.
Dat zie ik aan wat er in de linker kolom van je printscreen staat :-)
Jij kan dat ook nog zien ergens bovenaan in je programma ;-)

Ik heb van alles geprobeerd maar ik loop vast..

Ik ben geen gevorderde programmeur maar een beginneling en snap de logica van de variabele "merker" ook niet.

paaltje73

Golden Member

Heel simpel en kort door de bocht, een Merker is zoals de naam suggereert een merktekentje, een vlag of hoe je het noemen wilt.
Als een soort geheugensteuntje dus. Declareer het als bit.
Zet de merker of wis hem naar jou behoefte op de plaats van een test.
Controleer zijn toestand waar nodig en onderneem een passende actie.
Hoop dat het iets helpt.
Gr. en succes.
Paaltje

Anoniem

Alle begin is moeilijk maar in dit topic:
https://www.circuitsonline.net/forum/view/77877
vertelt forumlid DE OLDE simpel wat je over een merker moet weten.

Een merker heeft de functie van een geheugenrelais.
Ergens zet je die aan, ergens zet je die uit en ergens kijk je of die aan of uit staat.
Een merker is dus een variabele (dim merker as ...) en geen constante (symbol merker = ...) zoals bij u het geval is.
Je geeft die 'geheugenrelais' de naam die volgens jouw het best past

Lees alle posts van de andere forumleden in dit topic nog eens door ;-)

Ik heb onderstaande wijziging gemaakt maar nu gaat de led (pomp) aan als de collector warmer is en schakelt naar 6000 Ms weer uit, tot hier gaat het goed maar vervolgens begint het programma weer opnieuw en gaat de led niet knipperen..
Ik zie niet wat er fout ga en wat ik ook probeer het lukt me nog steeds niet..

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...
    ;If PompFunctie = 0 Then
     POMP = HOOG
    DelayMS 6000
     POMP = LAAG
    PompFunctie = 1
     ElseIf PompFunctie = 1 Then
    Toggle POMP
     DelayMS POMPSNELHEID
    EndIf
     ;EndIf

Als is de regel

pic basic code:

;If PompFunctie = 0 Then en ;EndIf

mee laat draaien doet de led helemaal niks

Jeroen, ik vind het leuk om te helpen, maar dan moet je het wel MOGELIJK maken om dat te doen. Je openingsvraag kan ik samenvatten tot: "ik heb dit programma en het doet niet wat ik wil". Tja... moet ik nu dat programma gaan proberen te lezen en als ik dan begrijp wat het doet, moet ik gaan gokken wat het HAD moeten doen?

Een goede vraag begint met een situatieschets. Zwembad, collector, pomp. Huidige opstelling. (nu een led ipv de pomp?) en wat je wilt dat het doet: Als dit dan dat, maar dan na zoveel seconden weer zus. (en waarom!).

Op 23 april 2019 17:59:50 schreef Jeroennr:
Hallo allemaal, ik heb onderstaand programma (bewerkt) maar nu wil ik graag de pomp in het programma 60 sec laten draaien en daarna moet de pomp wat anders doen, wat ik ook probeer het lukt me niet..

code:


POMP = HOOG
DelayMS 60000
POMP = watanders

Dat is precies wat je omschreven hebt wat het moet doen.

Als is de regel

Daar zit denk ik een typefout in. Lees je bericht nog eens door en haal dat soort fouten er uit. Dat maakt het ook makkelijker om te helpen.

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

Dit is een eenvoudig stukje code waar een kat haar jongen gaat verliezen ;-(

Op 5 mei 2019 09:48:14 schreef Jeroennr:

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...
    If PompFunctie = 0 Then
     POMP = HOOG
    DelayMS 6000
     POMP = LAAG
    PompFunctie = 1
     ElseIf PompFunctie = 1 Then
    Toggle POMP
     DelayMS POMPSNELHEID
    EndIf
     EndIf

Dit is hetzelfde stukje code waar de kat bij haar jongen ligt te spinnen :-)

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...
    If PompFunctie = 0 Then
        POMP = HOOG
        DelayMS 6000
        POMP = LAAG
        PompFunctie = 1
     ElseIf PompFunctie = 1 Then
        Toggle POMP
        DelayMS POMPSNELHEID
     EndIf

EndIf

Als je constante 'pompsnelheid' nog steeds op 20 staat zoals in je startpost zal er van knipperen weinig sprake zijn.

Zoals rew ook al zegt moet je het programma LEZEN.
De microcontroller voert de instructies gewoon uit in de volgorde dat jij ze schrijft. (ik zie de volgende vraag al komen)
Als er niet gebeurt wat jij wil ligt dat nooit aan de compiler of de microcontroller maar aan de programmeur :+

Nou begrijp ik ook hoe dat met die 'blokken' zit, dus Wanneer het programma moet stoppen.

Bedankt anoniem015!

En ja, ik heb inderdaad weer een vraag.
Het programma doet wat het moet doen 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 en dat is nou net weer niet de bedoeling want de led moet in dit geval gewoon blijven knipperen totdat de temperatuur tussen collector en zwembad weer gelijk zijn.

Nou is mijn vraag: in welke regel moet ik dit dan zoeken?

[Bericht gewijzigd door Jeroen op woensdag 22 juli 2020 22:27:37 (1%)

mel

Golden Member

In assembler zou ik het wel weten, maar die Arduino taal...

u=ir betekent niet :U bent ingenieur..

Op 5 mei 2019 10:50:15 schreef rew:
Jeroen, ik vind het leuk om te helpen, maar dan moet je het wel MOGELIJK maken om dat te doen. Je openingsvraag kan ik samenvatten tot: "ik heb dit programma en het doet niet wat ik wil". Tja... moet ik nu dat programma gaan proberen te lezen en als ik dan begrijp wat het doet, moet ik gaan gokken wat het HAD moeten doen?

Een goede vraag begint met een situatieschets. Zwembad, collector, pomp. Huidige opstelling. (nu een led ipv de pomp?) en wat je wilt dat het doet: Als dit dan dat, maar dan na zoveel seconden weer zus. (en waarom!).

[...]

code:


POMP = HOOG
DelayMS 60000
POMP = watanders

Dat is precies wat je omschreven hebt wat het moet doen.
[...]Daar zit denk ik een typefout in. Lees je bericht nog eens door en haal dat soort fouten er uit. Dat maakt het ook makkelijker om te helpen.

Dit word een programma om een pomp aan te sturen voor een zonnecollector die het zwembad verwarmd dmv een wisselaar.
Wanneer de temperatuur in de collector 10 graden warmer is dan het zwembad dan moet de pomp 1 minuut lopen om de collector te vullen met water (zit een terugloopvat voor de pomp) daarna moet het verschil tussen zwembad en collector gemeten worden en als de collector nog steeds warmer is dan het zwembad dan moet de pomp om de seconde aan en weer uit gaan (dit is om de temperatuur van de collector hoger te houden dan het zwembad)
Als het verschil gelijk of kleiner is moet de pomp stoppen, anders wordt er niks verwarmt.

Dit is de hele bedoeling van de schakeling.
Hoop dat ik het nu duidelijk genoeg heb uitgelegd.