Hallo an Alle,
in der letzten Zeit war es etwas ruhig um mich geworden, und ich moechte als "Entschuldigung" meine Gesundheitliche Situation vorbringen - Einige von Euch wissen ja bescheid...
Ich hoffe ich bin damit entschuldigt
Wie ihr ja zum Teil bereits wisst, lebe ich in Ethiopia und Ersatzteile gibts hier nicht - dafuer aber Sonne. Letzteres aber nicht waehrend der Regenzeit.
In dieser Zeit ist es Nachts sehr kalt hier, besonders wo ich wohne (2.500m ueber NN). So braucht MANN auch etwas zum waermen - in meinem Fall eine Heizung
Da das mechanische Bi-Metall-Thermostat festgebrannt ist, und es keine E-Teile gibt...musste eine Loesung her....
Ich war sowieso nicht sher zufrieden mit dem "geklacke" und die Regelung war auch nicht perfekt.
Da der Heizkoerper (Oel-Radiator mit 2.800W), bedingt durch die super geplante Infrastruktur (nur 2 Steckdosen im gesamten Schlafzimmer) nicht direkt am Bett steht - waere mich auch nicht so lieb,
steht selbiger in einer Ecke des Raumes. Da das Schlafzimmer rund 30qm hat und das Thermostat ja direkt am Heizkoerper ist/war, war eine gute Regelung nicht moeglich.
Mein Gedanke nun war, einen Temp-Sensor am Kopfend des Bettes zu haben sowie die Temp. dort angezeigt zubekommen. Ebenso wollte ich die Temp. vom Bett aus einstellen koennen.
Eine "Stolper-Strippe" Quer durch den Raum wollte ich allerdings vermeiden! So kam mir der gedanke via IR!
Auf der Sensor/Sender Seite habe ich einen Mega8 mit einem zweistelligen 7-Seg. Display und zwei Tastern sowie 3 IR-LED.
Auf der Heizungs/Empfaenger Seite habe ich einen Tiny13 mit MOC3043 und BTA16-600.
Gluecklicherweise hat die Heizung ein eigenstaendigen Uebertemperaturschutzschalter (was fuer ein Wort!!!!)....somit konnte ich das alte Bi-Metal-Thermostat einfach ueberbruecken....
Den BTA habe ich in die Spannungsversorgung eingeschleift. Da die Heizung einen UAE/UK Stecker hat und die Steckdose entsprechend von mir ersetzt wurde, ist ein "verpolen" beim reinstecken unmoeglich.
Die Verwendung eines China-Adapters bei der Leistung habe ich mir verkniffen und lieber die Steckdose getauscht...
Hier mal die Programme...vielleicht kann man ja noch einiges verbessern
Sender/Regelung/Anzeige:
Empfaenger:
Die Schaltplaene / Layout und Fotos kommen noch....
Soviel fuers erste....
LG aus Addis Ababa
Klaus
in der letzten Zeit war es etwas ruhig um mich geworden, und ich moechte als "Entschuldigung" meine Gesundheitliche Situation vorbringen - Einige von Euch wissen ja bescheid...
Ich hoffe ich bin damit entschuldigt
Wie ihr ja zum Teil bereits wisst, lebe ich in Ethiopia und Ersatzteile gibts hier nicht - dafuer aber Sonne. Letzteres aber nicht waehrend der Regenzeit.
In dieser Zeit ist es Nachts sehr kalt hier, besonders wo ich wohne (2.500m ueber NN). So braucht MANN auch etwas zum waermen - in meinem Fall eine Heizung
Da das mechanische Bi-Metall-Thermostat festgebrannt ist, und es keine E-Teile gibt...musste eine Loesung her....
Ich war sowieso nicht sher zufrieden mit dem "geklacke" und die Regelung war auch nicht perfekt.
Da der Heizkoerper (Oel-Radiator mit 2.800W), bedingt durch die super geplante Infrastruktur (nur 2 Steckdosen im gesamten Schlafzimmer) nicht direkt am Bett steht - waere mich auch nicht so lieb,
steht selbiger in einer Ecke des Raumes. Da das Schlafzimmer rund 30qm hat und das Thermostat ja direkt am Heizkoerper ist/war, war eine gute Regelung nicht moeglich.
Mein Gedanke nun war, einen Temp-Sensor am Kopfend des Bettes zu haben sowie die Temp. dort angezeigt zubekommen. Ebenso wollte ich die Temp. vom Bett aus einstellen koennen.
Eine "Stolper-Strippe" Quer durch den Raum wollte ich allerdings vermeiden! So kam mir der gedanke via IR!
Auf der Sensor/Sender Seite habe ich einen Mega8 mit einem zweistelligen 7-Seg. Display und zwei Tastern sowie 3 IR-LED.
Auf der Heizungs/Empfaenger Seite habe ich einen Tiny13 mit MOC3043 und BTA16-600.
Gluecklicherweise hat die Heizung ein eigenstaendigen Uebertemperaturschutzschalter (was fuer ein Wort!!!!)....somit konnte ich das alte Bi-Metal-Thermostat einfach ueberbruecken....
Den BTA habe ich in die Spannungsversorgung eingeschleift. Da die Heizung einen UAE/UK Stecker hat und die Steckdose entsprechend von mir ersetzt wurde, ist ein "verpolen" beim reinstecken unmoeglich.
Die Verwendung eines China-Adapters bei der Leistung habe ich mir verkniffen und lieber die Steckdose getauscht...
Hier mal die Programme...vielleicht kann man ja noch einiges verbessern
Sender/Regelung/Anzeige:
Code:
'-------------------------------------------------------------------------------
' HEIZUNGSSTEUERUNG VIA IR
'
' Sender mit Temp. Sensor, Anzeige und Steuerung
'-------------------------------------------------------------------------------
' LM35 --> ADC5
' BCD input von beiden 4511 parallel and PortC.3.....0
' Enable Latch vom 4511 des ersten Digit an PortD.0
' Enable Latch vom 4511 des zweiten Digit an PortD.1
' Taste "Up" (Temp. + / Rot) an PortD.2 mit Pullup und Elko zum entprellen
' Taste "Down" (Temp. - / Blau) an PortD.3 mit Pullup und Elko zum entprellen
' LED zur Indication des Settings-Menu an PortD.4
' IR-LED's ueber 7404 Inverter an PortB.1 (OC1A)
'-------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 64
$swstack = 64
$framesize = 64
Ddrc = &B00001111
Ddrd = &B00010011
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim W As Word , Temp As Single , Volt As Single , R As Single
Dim T As Integer , Ts As String * 3 , Digit1 As Byte , Digit2 As Byte
Dim D1 As String * 2 , D2 As String * 2 , Told As Integer
Dim Up As Bit , Down As Bit , Soll As Integer , Msoll As Eram Integer
Dim Zaehler As Double , Mt As Integer , Status As Bit
Const Hyst = 2
Portd.2 = 1 ' Pullup aktivieren
Portd.3 = 1 ' Pullup aktivieren
Portd.4 = 0 ' Seetings Indicator LED aus
Soll = Msoll ' Soll-Wert aus EEprom einlesen
Status = 0 ' Status Bit der Heizung
If Soll < 10 Then ' Sicherstellen, dass keine
Soll = 10 ' "dummen" Werte aus dem EEprom kommen
End If ' besonders beim ersten Start
If Soll > 40 Then
Soll = 40
End If
'-------------------------------------------------------------------------------
Gosub Blanking ' 7-Seg. blank setzen
'-------------------------------------------------------------------------------
Do
Gosub Tasten_einlesen ' Tasten Status holen
If Up = 1 And Down = 1 Then ' Wenn beide Tasten nicht gedrueckt
Told = T ' Temp. zwischenspeichern
Gosub Temperatur_ermitteln ' Neue Temp. holen
If Told <> T Then ' Wenn sich die Temp. geaendert hat
Gosub 7segment_setzen ' Temp. anzeigen
End If
End If
If Up = 0 Or Down = 0 Then ' Wenn eine Taste gedrueckt
Gosub Settings ' ins "Settings-Menu" springen
End If
Gosub Temp_pruefen ' Temp. mit Soll-Wert vergleichen und entspr. handeln
Loop
End
'-------------------------------------------------------------------------------
Temperatur_ermitteln:
W = Getadc(5) ' Wert vom ADC holen
Volt = 5 / 1024 ' Spannung berechnen
Volt = Volt * W
Temp = Volt * 100 ' Temp. aus Spannung berechnen (fuer LM35)
R = Round(temp) ' Auf Ganzzahl runden
T = Int(r) ' Integer aus Temp. erzeugen, da vorher Single
Gosub Digits ' In die einzelnen Digit's aufteilen
Return
'-------------------------------------------------------------------------------
Digits:
Ts = Str(t) ' String aus (T)emp. erstellen
D1 = Left(ts , 1) ' D1 die erste Ziffer zuweisen
D2 = Right(ts , 1) ' D2 die zweite Ziffer zuweisen
Digit1 = Val(d1) ' Byte fuer erste Ziffer aus String erzeugen
Digit2 = Val(d2) ' Byte fuer zweite Ziffer aus String erzeugen
Return
'-------------------------------------------------------------------------------
7segment_setzen:
Portc = Portc Or Digit1 ' PortC mit dem Wert Digit1 ODER Verknuepfen
Portd.0 = 0 ' Enable Latch vom 4511 der ersten Ziffer auf low
Waitms 50 ' Etwas Zeit geben. dass der 4511 die Werte vom BCD Eingang uebernehmen kann
Portd.0 = 1 ' Enable Latch vom 4511 der ersten Ziffer auf high (ignore changes on BCD-Input)
Waitms 50 ' Etwas Zeit geben um sicherzustellen, dass Enable Latch high ist
Portc = Portc Xor Digit1 ' PortC mit dem Wert Digit1 Excl.-ODER Verknuepfen
Portc = Portc Or Digit2 ' PortC mit dem Wert Digit2 ODER Verknuepfen
Portd.1 = 0 ' Enable Latch vom 4511 der zweiten Ziffer auf low
Waitms 50 ' Etwas Zeit geben, dass der 4511 die Werte vom BCD Eingang uebernehmen kann
Portd.1 = 1 ' Enable Latch vom 4511 der zweiten Ziffer auf high (ignore changes on BCD-Input)
Waitms 50 ' Etwas Zeit geben um sicherzustellen, dass der Enable Latch high ist
Portc = Portc Xor Digit2 ' PortC mit dem Wert Digit2 Excl.-ODER Verknuepfen
Return
'-------------------------------------------------------------------------------
Blanking:
Portc = Portc Or 15 ' PortC mit dezimal 15 ODER Verknuepfen (BCD = 1111 = blank)
Portd.0 = 0 ' Enable Latch vom 4511 der ersten Ziffer auf low
Portd.1 = 0 ' Enable Latch vom 4511 der zweiten Ziffer auf low
Waitms 50 ' Etwas Zeit geben. dass der 4511 die Werte vom BCD Eingang uebernehmen kann
Portd.0 = 1 ' Enable Latch vom 4511 der ersten Ziffer auf low
Portd.1 = 1 ' Enable Latch vom 4511 der zweiten Ziffer auf low
Waitms 50 ' Etwas Zeit geben um sicherzustellen, dass Enable Latch high ist
Portc = Portc Xor 15 ' PortC mit dezimal 15 Excl.-ODER Verknuepfen
Return
'-------------------------------------------------------------------------------
Tasten_einlesen: ' Alias hat nich funktioniert - Geht wohl nur als Output ?!
Up = Pind.2 ' BIT-Variable den Wert von PortD.2 zuweisen
Down = Pind.3 ' BIT-Variable den Wert von PortD.2 zuweisen
Return
'-------------------------------------------------------------------------------
Settings:
Gosub Blanking ' 7-Seg. blank setzen
Portd.4 = 1 ' LED zur Indication des Settings-Menu ein
Soll = Msoll ' Soll-Wert aus EEprom auslesen und in Variable Soll ablegen
T = Soll ' T den Wert Soll zuweisen zur weiteren bearbeitung und Anzeige
Gosub Digits ' T in die entsprechenden Digit's zerlegen
Gosub 7segment_setzen ' T (in diesem Fall Soll-Wert) anzeigen
Do
Gosub Tasten_einlesen ' Tasten einlesen
Zaehler = Zaehler + 1 ' Zaehler um eins erhoehen (dient zum automatischem verlassen des
' Settings-Menu nach dem fuer laengere Zeit keine Taste gedrueckt wurde
If Up = 0 Then ' Wenn die Taste "Up" bzw. rote Taste gedrueckt wurde
Soll = Soll + 1 ' Soll-Wert um eins erhoehen
Zaehler = 0 ' Da ja eine Taste gedrueckt wurde -> Zaehler wieder auf Null setzen
If Soll > 40 Then ' Wenn Soll-Wert groesser 40
Soll = 40 ' Soll-Wert auf 40 setzen (um groessere Werte als 40 zu verhindern)
End If
End If
If Down = 0 Then ' Wenn Taste "Down" bzw. blaue Taste gedrueckt wurde
Soll = Soll - 1 ' Soll-Wert um eins vermindern
Zaehler = 0 ' Da ja eine Taste gedrueckt wurde -> Zaehler wieder auf Null setzen
If Soll < 10 Then ' Wenn Soll-Wert kleiner 10
Soll = 10 ' Soll-Wert auf 10 setzen (um kleinere Werte als 10 zu verhindern)
End If
End If
T = Soll ' T den Wert Soll zuweisen zur weiteren bearbeitung und Anzeige
Gosub Digits ' T in die entsprechenden Digit's zerlegen
Gosub 7segment_setzen ' T (in diesem Fall Soll-Wert) anzeigen
Waitms 250 ' 250ms warten
Loop Until Zaehler = 10000 ' Wenn fuer laengere Zeit keine Taste gedrueckt wurde, Schleife verlassen
Msoll = Soll ' Soll-Wert im EEprom speichern
Gosub Temperatur_ermitteln ' Da T ja derzeit den Soll-Wert beherbergt - Temp. neu einlesen und entsprechend T neu setzen
Portd.4 = 0 ' LED zur Indication des Settings-Menu aus
Return
'-------------------------------------------------------------------------------
Temp_pruefen:
If T => Soll Then ' Wenn die IST-Temp (T) gleich oder groesser als die Soll-Vorgabe
Gosub Heizung_aus ' Heizung ausschalten
End If
Mt = Soll - Hyst ' Mt(minimum Temp.) aus dem Soll-Wert minus Hysterese ermitteln
If T =< Mt Then ' Wenn die IST-Temp (T) gleich oder kleiner als Mt
Gosub Heizung_an ' Heizung einschalten
End If
Return
'-------------------------------------------------------------------------------
Heizung_aus:
If Status = 1 Then ' Wenn die Heizung eingeschaltet ist, dann ausschalten (um zu verhindern, dass stetig IR-Signale gesendet werden)
For Zaehler = 1 To 10 ' Das ganze 10x wiederholen um sicher zugehen, dass die IR-Signale auch angekommen sind
Rc5send 0 , 15 , 56 ' Sende IR Commando zum ausschalten der Heizung
Waitms 25 ' Etwas Zeit geben
Next Zaehler ' Vorgang wiederholen
Status = 0 ' Status der Heizung auf AUS setzen
End If
Return
'-------------------------------------------------------------------------------
Heizung_an:
If Status = 0 Then ' Wenn die Heizung ausgeschaltet ist, dann einschalten (um zu verhindern, dass stetig IR-Signale gesendet werden)
For Zaehler = 1 To 10 ' Das ganze 10x wiederholen um sicher zugehen, dass die IR-Signale auch angekommen sind
Rc5send 0 , 15 , 57 ' Sende IR Commando zum einschalten der Heizung
Waitms 25 ' Etwas Zeit geben
Next Zaehler ' Vorgang wiederholen
Status = 1 ' Status der Heizung auf EIN setzen
End If
Return
Empfaenger:
Code:
'-------------------------------------------------------------------------------
' HEIZUNGSSTEUERUNG VIA IR
'
' Empfaenger mit SFH5110-36 IR-Empfaenger
'-------------------------------------------------------------------------------
' SFH5110-36 -> PortB.2
' PortB.4 -> MOC3043 (mit Null-Durchgangserkennung) -> BTA16-600 (isolierter Typ)
'-------------------------------------------------------------------------------
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack=16
$swstack=16
$framesize=16
Ddrb = &B00010000
Config Rc5 = Pinb.2 ' RC5 - Eingang auf PortB.2 setzen
Enable Interrupts ' Fuer die RC5-Empfaenger Routine noetig
Portb.4 = 0 ' Sicherstellen, dass die Heizung aus ist beim Start
Dim Adresse As Byte , Command As Byte
Do
Getrc5(adresse , Command) ' Auf IR-Signal warten und dieses den Variablen zuweisen
Command = Command And &B01111111 ' Toggle-Bit rausfiltern/entfernen
If Adresse = 15 Then ' Wenn die Geraete-Adresse = 15
' Pruefe empfangenes Signal
If Command = 56 Then ' Wenn Signal = 56
Portb.4 = 0 ' Heizung AUS
End If
If Command = 57 Then ' Wenn Signal = 57
Portb.4 = 1 ' Heizung EIN
End If
End If
Loop
End
Die Schaltplaene / Layout und Fotos kommen noch....
Soviel fuers erste....
LG aus Addis Ababa
Klaus