Hallo,
ich möchte mit der nachfolgend eingestellten Schaltung und mit Hilfe des Programms die Außentemperatur (Garageninnentemperatur, dort überwintern Kübelpflanzen) als auch die Innentemperatur (Kaminheizkessel) überwachen.
Das Programm zur Messung der Temperaturen funktioniert recht zufriedenstellend. Es stammt nicht von mir, ich habe es aus anderen Programmteilen, die ich im Netz gefunden hatte, zusammengestellt. Selbst bin ich leider noch nicht in der Lage, diese Programme zu schreiben, aber ich bemühe mich, daraus zu lernen.
Wie aus dem Schaltplan zu ersehen ist, möchte ich noch Folgendes signalisieren:
1. Temperaturvergleich zwischen Ist- und Solltemperaturen in kritischen Bereichen. Da interessieren die Temperaturen: < 1°C, 60°C, 70°C. Außerdem hatte ich vorgesehen, mittels eines Fototransistors die Hintergrundbeleuchtung des Displays bei abgedunkeltem Raum auf ~ 20-30 % abzuschwächen. Den BPW 40 hatte ich daher auf PD.3 (Interrupt 1) gelegt, um mit Hilfe des Int1 bei wechselnder Flanke, den Interrupt auslösen zu können.
2. Dimmung der LCD Hintergrundbeleuchtung mit dem im Listing unten angehängten Teil. Dieses Programm habe ich 1:1 von der “Elektronikerseite.de“ entliehen, weil es vorzüglich arbeitet und ich es auf gar keinen Fall besser schreiben könnte. Es sind halt die unangenehmen Probleme des Anfängers.
Zu 1. Ich gehe davon aus, dass die aus den scratchpads des DS18B20 ausgelesenen Temperaturen jeweils im Ausdruck “Celsius“ enthalten sind. Bisher hatte ich versucht, einen Temp.-Vergleich über: If >= der Schwellentemperatur in hex als auch binär vornehmen zu können. Schlug alles fehl. Im Netz hatte ich auch keine Anhaltspunkte gefunden, wie ich da vorgehen könnte und das Datenblatt des Sensors liefert mir da auch keine Informationen.
Zu 2. Ich finde keinen Weg, das PWM-Programm der Dimmung mit dem eigentlichen Hauptprogramm der Temperaturmessung zu verbinden oder auch umgekehrt. Angedacht hatte ich, mit dem Taster Ta1 jederzeit in den Ablauf der Temp.-Messung eingreifen zu können, um das Gerät ein/ausschalten und/oder die Hintergrund-LED dimmen zu können. M. E. kann dies nur unter Einbeziehung des Int0 aus dem Dimmerprogramm ins Hauotprogramm funktionieren. Unzählige Versuche waren bislang aber erfolglos. Ich hatte schon mit dem “worst case“ geplant und wollte einen zweiten mega8 für die Dimmung nutzen. Dann laufen tatsächlich beide Programme ungestört nebeneinander ab, doch das Gerät als solches, der zweite µC, lässt sich dann softwaremäßig nicht mittels Ta1 in die Sleep-Funktion versetzen.
Ich denke, ich stelle zuerst einmal beide Programme hintereinander ein und belasse die Ergänzung um Int1.
Natürlich stelle ich das spätere Layout, falls keine Änderungen mehr nötig sind, hier ebenfalls ein.
Tja, mit meinem Latein bin ich am Ende und würde mich über jeden Tipp, der mir weiter hilft, riesig freuen! Besten Dank schon mal im Voraus!
Schöne Grüße
Robin
ich möchte mit der nachfolgend eingestellten Schaltung und mit Hilfe des Programms die Außentemperatur (Garageninnentemperatur, dort überwintern Kübelpflanzen) als auch die Innentemperatur (Kaminheizkessel) überwachen.
Das Programm zur Messung der Temperaturen funktioniert recht zufriedenstellend. Es stammt nicht von mir, ich habe es aus anderen Programmteilen, die ich im Netz gefunden hatte, zusammengestellt. Selbst bin ich leider noch nicht in der Lage, diese Programme zu schreiben, aber ich bemühe mich, daraus zu lernen.
Wie aus dem Schaltplan zu ersehen ist, möchte ich noch Folgendes signalisieren:
1. Temperaturvergleich zwischen Ist- und Solltemperaturen in kritischen Bereichen. Da interessieren die Temperaturen: < 1°C, 60°C, 70°C. Außerdem hatte ich vorgesehen, mittels eines Fototransistors die Hintergrundbeleuchtung des Displays bei abgedunkeltem Raum auf ~ 20-30 % abzuschwächen. Den BPW 40 hatte ich daher auf PD.3 (Interrupt 1) gelegt, um mit Hilfe des Int1 bei wechselnder Flanke, den Interrupt auslösen zu können.
2. Dimmung der LCD Hintergrundbeleuchtung mit dem im Listing unten angehängten Teil. Dieses Programm habe ich 1:1 von der “Elektronikerseite.de“ entliehen, weil es vorzüglich arbeitet und ich es auf gar keinen Fall besser schreiben könnte. Es sind halt die unangenehmen Probleme des Anfängers.
Zu 1. Ich gehe davon aus, dass die aus den scratchpads des DS18B20 ausgelesenen Temperaturen jeweils im Ausdruck “Celsius“ enthalten sind. Bisher hatte ich versucht, einen Temp.-Vergleich über: If >= der Schwellentemperatur in hex als auch binär vornehmen zu können. Schlug alles fehl. Im Netz hatte ich auch keine Anhaltspunkte gefunden, wie ich da vorgehen könnte und das Datenblatt des Sensors liefert mir da auch keine Informationen.
Zu 2. Ich finde keinen Weg, das PWM-Programm der Dimmung mit dem eigentlichen Hauptprogramm der Temperaturmessung zu verbinden oder auch umgekehrt. Angedacht hatte ich, mit dem Taster Ta1 jederzeit in den Ablauf der Temp.-Messung eingreifen zu können, um das Gerät ein/ausschalten und/oder die Hintergrund-LED dimmen zu können. M. E. kann dies nur unter Einbeziehung des Int0 aus dem Dimmerprogramm ins Hauotprogramm funktionieren. Unzählige Versuche waren bislang aber erfolglos. Ich hatte schon mit dem “worst case“ geplant und wollte einen zweiten mega8 für die Dimmung nutzen. Dann laufen tatsächlich beide Programme ungestört nebeneinander ab, doch das Gerät als solches, der zweite µC, lässt sich dann softwaremäßig nicht mittels Ta1 in die Sleep-Funktion versetzen.
Ich denke, ich stelle zuerst einmal beide Programme hintereinander ein und belasse die Ergänzung um Int1.
Natürlich stelle ich das spätere Layout, falls keine Änderungen mehr nötig sind, hier ebenfalls ein.
Tja, mit meinem Latein bin ich am Ende und würde mich über jeden Tipp, der mir weiter hilft, riesig freuen! Besten Dank schon mal im Voraus!
Schöne Grüße
Robin
Code:
$regfile "m8def.dat"
$crystal = 1000000
$hwstack = 82
$framesize = 68
$swstack = 68
'
Initlcd
Cursor Off
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Cls
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
Config Lcd = 16 * 4
Config Lcdbus = 4
Config Portb.2 = Input
Config 1wire = Portb.2
Dim X As Byte
Dim Celsius As Integer
Dim T(8) As Single
Dim Ar1(8) As Byte '1. 1wire
Dim Ar2(8) As Byte '2. 1wire
Dim Ar3(8) As Byte '3. 1wire
Dim Ar4(8) As Byte '4. 1wire
Dim Ar5(8) As Byte '5. 1wire
Dim Ar6(8) As Byte '6. 1wire
Dim Ar7(8) As Byte '7. 1wire
Dim Ar8(8) As Byte '8. 1wire
Dim Mini(8) As Single 'minimaler Temperaturwert
Dim Maxi(8) As Single 'maximaler Temperaturwert
Dim I As Byte
Dim W As Word
Dim Sp(12) As Byte '12 bit Genauigkeit
Declare Sub Temperatur
Wait 1
If Err = 0 Then
Ar1(1) = 1wsearchfirst() 'Sensorabfrage
For I = 1 To 8
Next
End If
If Err = 0 Then 'Sensorabfrage
Ar2(1) = 1wsearchnext()
End If
For I = 1 To 8
' beliebig erweiterbar
W = 1wirecount()
Locate 1 , 1
Lcd "Anzahl nutzbarer"
Locate 2 , 1
Lcd "Sensoren: " ; W 'Anzahl der Themperatursensoren werden angezeigt
Wait 3
Cls
Call Temperatur
Mini(1) = 999
Mini(2) = 999
Maxi(1) = 000
Maxi(2) = 000 'beliebig erweiterbar
Do
Call Temperatur
Loop
Sub Temperatur
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 300
Do
Sp(1) = 1wread(12) '12-bit Genauigkeit
Waitus 200
If Err = 0 Then
1wverify Ar1(1)
1wwrite &HBE
Sp(1) = 1wread(12)
For I = 1 To 12
Next
Celsius = Makeint(sp(1) , Sp(2))
Celsius = Celsius * 10
Celsius = Celsius / 16
T(1) = Celsius
T(1) = T(1) / 10
Lcd T(1)
Locate 1 , 1
Lcd "Aussen: " ; Fusing(t(1) , "#.#") ; Chr(0) ; "C "
If Mini(1) > T(1) Then Mini(1) = T(1)
If Maxi(1) < T(1) Then Maxi(1) = T(1)
Locate 3 , 1
Lcd "Min: " ; Fusing(mini(1) , "#.#") ; Chr(0) ; "C "
Locate 4 , 1
Lcd "Max: " ; Fusing(maxi(1) , "#.#") ; Chr(0) ; "C "
1wreset
Wait 5
If W >= 2 Then
1wverify Ar2(1)
1wwrite &HBE
Sp(1) = 1wread(12)
For I = 1 To 8
Next
Celsius = Makeint(sp(1) , Sp(2))
Celsius = Celsius * 10
Celsius = Celsius / 16
Print Celsius
T(2) = Celsius
T(2) = T(2) / 10
Lcd T(2)
Locate 1 , 1
Lcd "Kamin: " ; Fusing(t(2) , "#.#") ; Chr(0) ; "C "
If Mini(2) > T(2) Then Mini(2) = T(2)
If Maxi(2) < T(2) Then Maxi(2) = T(2)
Locate 3 , 1
Lcd "Min: " ; Fusing(mini(2) , "#.#") ; Chr(0) ; "C "
Locate 4 , 1
Lcd "Max: " ; Fusing(maxi(2) , "#.#") ; Chr(0) ; "C "
End If
1wreset
Wait 5
Next
End If
'beliebig erweiterbar
End Sub
Loop
'Dimmprogramm
Dim Hell As Word
Dim An As Word
Dim Aus As Word
Dim Pressed As Word
Dim Neu As Word
Dim Heller As Word
Dim Pwm As Word
Dim Dunkler As Word
Dim Standby As Word
' Festlegen der Starthelligkeit beim Antippen des Tasters
' 0=Dunkel, 255=Hell
Const Starthelligkeit = 254
Const Abdunkeln = 100 'ergänzt
Config Portb.1 = Output
Config Portd.1 = Output
Config Portd.0 = Input
Config Portd.2 = Input
Config Portd.3 = Output 'ergänzt
Portd.3 = 1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
Compare1a = 255 : Portd.0 = 1
An = 0 : Neu = 0 : Pwm = 255
Hell = 255 - Starthelligkeit
Dunkler = Hell
If Dunkler = 0 Then Dunkler = 255
On Int0 Int0_isr
Config Int0 = Low Level
Enable Int0
On Int1 Fototrans 'Um Int1 ergänzt
Config Int1 = Change
Enable Int1
Enable Interrupts
Do
Loop
Fototrans:
If Portd.3 = 0 Then 'Um Fototrans ergänzt
Hell = Starthelligkeit - Abdunkeln
If Portd.3 = 1 Then
Goto Entry
End If
End If
Return
Entry:
Do
Portd.1 = 0
If Pind.0 = 0 Then
Incr Pressed : Waitms 1 : Neu = Heller
End If
If Pwm = 0 Then Heller = 0
If Pwm = 255 Then Heller = 1
If Pressed > 250 Then
If Heller = 0 Then Incr Pwm Else Decr Pwm
Waitms 30
End If
If Pind.0 = 1 And Pressed > 0 And Pressed < 250 Then
If Pressed < 50 Then
If Pwm = 0 Then
Do
Incr Pwm : Compare1a = Pwm : Waitms 5
Pressed = 0 : Neu = 1 : An = 1
Loop Until Pwm = Dunkler Or Pind.0 = 0
Else
Do
Decr Pwm : Compare1a = Pwm : Waitms 5
Pressed = 0 : Neu = 0 : An = 1
Loop Until Pwm = 0 Or Pind.0 = 0
End If
Elseif An = 1 Then
Do
Incr Pwm : Compare1a = Pwm : Waitms 5
Pressed = 0 : Neu = 1 : An = 0
Loop Until Pwm = 255 Or Pind.0 = 0
Else
Do
Decr Pwm : Compare1a = Pwm : Waitms 5
Pressed = 0 : Neu = 0 : An = 1
Loop Until Pwm = Hell Or Pind.0 = 0
End If
If Pind.0 = 0 Then Pressed = 250
Elseif Pressed > 0 And Pind.0 = 1 Then
If Neu = 1 Then Heller = 0
If Neu = 0 Then Heller = 1
Pressed = 0 : Waitms 100
End If
If Pwm = 255 Then An = 0 Else If Aus > 5 Then An = 1
Incr Aus : Compare1a = Pwm
If Pwm = 255 Then Incr Standby Else Standby = 0
Loop Until Standby > 100
Standby = 0
Portd.1 = 1
Mcucr = Mcucr And &B10101111
Mcucr = Mcucr Or &B10100000
sleep
Goto Entry
End
Int0_isr:
nop
Do
Loop
Return