2X ds18b20 Temperatuur verschil

Hallo allemaal,

Ik heb onderstaande in elkaar gezet (knip en plak werk)
maar het doet iets, namelijk een led aan of uitzetten wanneer er 2 ds18B20 sensoren worden vergeleken alleen zou ik het verschil graag wat groter willen hebben.

Bijv: de led moet pas aan als er een verschil is van meer dan 10 graden
vergeleken met sensor 1.
Als de tempratuur gelijk of lager is als sensor 1 dan moet de led uit gaan.

Ka iemand mij hier bij helpen?

' **************************************
' ******** 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 Temperatuur As Word
Dim Temperatuur1 As Word
Dim Decimalen As Byte
Dim Decimalen1 As Byte

;Logische constanten
Symbol HOOG = 1
Symbol LAAG = 0

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

DelayMS 500 ;LCD stabilisering

; 76543210
PORTA = %00000000 ;Alle PORTA uitgangen laag bij opstart
TRISA = %11111011 ;Alles ingang, behalve PORTA.2 voor de LED

Cls ;Wis scherm en zet cursor links bovenaan

OPNIEUW:

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, [Temperatuur.LowByte, Temperatuur.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, [Temperatuur1.LowByte, Temperatuur1.HighByte] ;Lees temperatuur en plaats dit in de variabele

Decimalen = 0 ' Op 0 voor de zekerheid..
Decimalen = Temperatuur.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.

Decimalen1 = 0 ' Op 0 voor de zekerheid..
Decimalen1 = Temperatuur1.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.

If Temperatuur > Temperatuur1 Then LED = HOOG ;Uitgang HOOG als temp te laag is
If Temperatuur < Temperatuur1 Then LED = LAAG ;Uitgang LAAG als temp te hoog is

Print At 1, 1, "Collector ",Dec (Temperatuur >> 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 (Temperatuur1 >> 4) , ".", Dec1 Decimalen1 / 10, 223, "C "
' Door de laatste 4 bits van Temperatuur weg te gooien krijg je de graden Celcius.
DelayMS 300

GoTo OPNIEUW

End ;Einde programma

;A0 = collector

Hensz

Golden Member

Je beschrijving kan beter, net zoals de keuze van namen voor variabelen. Noem die Temperatuur1 en -2 of nog beter LuchtTemperatuur en WaterTemperatuur o.i.d.
Je hebt het over verschil tussen die 2 sensors, de één mag dus 10 graden hoger of lager zijn als de ander.

code:

Pseudocode:
Repeat
   Vul LuchtTemperatuur met waarde van sensor 1
   Vul WaterTemperatuur met waarde van sensor 2
   TemperatuurVerschil = INT(ABS(WaterTemperatuur - LuchtTemperatuur))
   If TemperatuurVerschil > 9 then zet led aan
   If TemperatuurVerschil = 0 then zet led uit
End repeat
Don't Panic!

Je hebt gelijk, dit word nog verbeterd.
Ga vanavond aan de slag, bedankt alvast voor je hulp.

Je kan beter geen ABS() gebruiken, want dat geeft verkeerde resultaten als niet de één, maar de ander groter is.
Je moet ook ELSE gebruiken om zeker te weten dat je niet onbedoeld dingen uitsluit.

Dus:

code:


Pseudocode:
Repeat
   Vul LuchtTemperatuur met waarde van sensor 1
   Vul WaterTemperatuur met waarde van sensor 2
   TemperatuurVerschil = [b]WaterTemperatuur - LuchtTemperatuur[/b]
   If TemperatuurVerschil > 9 then zet led aan
   [b]else[/b]
     zet led uit
End repeat
Leuk vanuit de lucht: https://youtu.be/DrnBaUXwbFA

Op 17 april 2019 15:52:05 schreef Boudie:
Je kan beter geen ABS() gebruiken, want dat geeft verkeerde resultaten als niet de één, maar de ander groter is.
Je moet ook ELSE gebruiken om zeker te weten dat je niet onbedoeld dingen uitsluit.

Dus:

code:


Pseudocode:
Repeat
   Vul LuchtTemperatuur met waarde van sensor 1
   Vul WaterTemperatuur met waarde van sensor 2
   TemperatuurVerschil = [b]WaterTemperatuur - LuchtTemperatuur[/b]
   If TemperatuurVerschil > 9 then zet led aan
   [b]else[/b]
     zet led uit
End repeat

Voorbeeld:

Als watertemperatuur nu 15 graden is en de luchttemperatuur is 4 graden is dan gaat de led aan
Als watertemperatuur nu 15 graden is en de luchttemperatuur is 26 graden dan...;-)
En wat bij negatieve waarden?

Ik zou het als volgt doen:

Repeat
Temperatuur = ABS ( Lees temperatuur sensor 1 uit )
Temperatuur1 = ABS ( Lees temperatuur sensor 2 uit )
if ( ABS ( Temperatuur - Temperatuur2 ) > 9 )
{ Led is uit }
else
P Led is aan }
Until true

Misschien een stomme vraag maar hoe kom ik aan de waardes van de sensoren.

@Vincent:

"Als watertemperatuur nu 15 graden is en de luchttemperatuur is 26 graden dan...;-)
En wat bij negatieve waarden?
"
Dan gaat die LED dus uit, want 15-26 = -11 en dat is niet groter dan 9.

Leuk vanuit de lucht: https://youtu.be/DrnBaUXwbFA

Op 17 april 2019 16:05:22 schreef vincent1971:
Temperatuur = ABS ( Lees temperatuur sensor 1 uit )
Temperatuur1 = ABS ( Lees temperatuur sensor 2 uit )

Dat werkt natuurlijk niet.

Als Temperatuur = 3 en Temperatuur1 = -10 word die -10 op jouw nadrukkelijke verzoek +10.

Evengoed, TS moet eerst eens beginnnen met zijn variabelen duidelijk te declareren. Nu heet de waarde van sensor1 -> Temperatuur en van sensor 2 -> Temperatuur1. Mja, dan krijg je onduidelijkheden.

Op 17 april 2019 18:35:26 schreef Jeroennr:
Misschien een stomme vraag maar hoe kom ik aan de waardes van de sensoren.

Die heb je al.

De waarde van sensor 1 heb je immers in Temperatuur opgeslagen, en die van sensor 2 heb je in Temperatuur1 opgeslagen.

Mocht je dat verwarrend vinden: dat klopt. ;-)

Ik heb het even wat netter/duidelijker gemaakt maar het programma werkt niet, wat ik ook probeer.

Ik ben hier niet goed in en hoop dat iemand mij kan helpen in begrijpelijke taal.

' **************************************
' ******** 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 HOOG = 1
Symbol LAAG = 0

;Poortnamen
;Symbol Relais = PORTA.3 ;Sluit een LED met 1k serie weerstand aan op deze poort
Symbol LED = PORTA.2 ;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

; 76543210
;PORTA = %00000000 ;Alle PORTA uitgangen laag bij opstart
;TRISA = %11111011 ;Alles ingang, behalve PORTA.2 voor de LED

Cls ;Wis scherm en zet cursor links bovenaan

OPNIEUW:

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.

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.

If Collector > Zwembad Then LED = HOOG ;Uitgang HOOG als temp te laag is
If Collector < Zwembad Then LED = LAAG ;Uitgang LAAG als temp te hoog is

;Repeat
;Collector = Abs
;Zwembad = Abs
;If Abs(Collector-Zwembad) > 9 Then
;LED = LAAG
;Else
;LED = HOOG
;Until true

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.
DelayMS 300

GoTo OPNIEUW

End ;Einde programma