martin66119
14.08.2007, 12:00
Einen schönen guten Tag an alle!
Für die Steuerung meiner Heizung möchte ich den Mischer mit einem Servo regeln (was anderes wie mit dem Servo geht nicht, da ich die Originalregelung nicht ändern möchte, um Fehlerfälle abzufangen). Hierzu möchte ich in Abhängigkeit von der Raumtemperatur den Mischer öffnen oder schließen (die Funktionalität habe ich im Grundsatz im Code unten im Bereich Def. von Konstanten beschrieben).
Kann mir da jemand helfen, wie man das am besten macht (z.B. für Tagbetrieb). oder ist mein Ansatz völlig falsch.
Danke schonmal
Martin
$regfile = "M8def.dat"
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
$baud = 19200
'************************************************* ***********
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Nachtbetrieb = 21
Tagbetrieb = 5
Dim Tempmessstelle(8) As Single
'************************Def. von Konstanten***************
Const Tagtemp_og = 22.0 ' Mischer ganz zu
Const Tagtemp_ug = 21.0 ' Mischer ganz auf
Const Nachttemp_og = 21.5 ' Mischer ganz zu
Const Nachttemp_ug = 20.5 ' Mischer ganz auf
'
'Im Bereich 21.0 bis 22.0 (Tagbetrieb) sowie im Bereich 20.5 bis 21.0 (Nachtb.)
'soll mit dem Servo der Mischer gesteuert werden.
'Mischerfunktion für diesen Bereich (y = m*x + n); x = Raumtemp, y = Mischerstellung
' y = 1200*x - 24600
' Bei Tagbetrieb:
' y = 1800 für Raumtemp < 21.0 Grad
' y = 600 für Raumtemp > 22.0 Grad
'
'Bei Nachtbetrieb:
' y = 1800 für Raumtemp < 20.0 Grad
' y = 600 für Raumtemp > 22.0 Grad
Die ganz Funktion (d.h. die Sub Mischersteuerung) soll nur alle 5 min oder so (am besten einstellbar) gestartet werden.
'************************************************* ***********
Config Portc.2 = Output
'--------------------------Funktionen LCD-Display-------------------------------
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port
Dim ___lcdno As Byte
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'--------------------------------Config Timer1----------------------------------
Config Timer1 = Timer , Prescale = 256 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 ' bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 36835 'Timer1 soll schon von 65535 - x*14400
'--------------------------------Config 1Wire configurieren---------------------
Config 1wire = Portc.1 'DS1820
Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Innen Alias 0
Vorlauf Alias 1
Rücklauf Alias 2
Aussen Alias 3
Kessel Alias 4
Dim Read_temp As Integer
Dim Sensor_ids(48) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'--------------------------------Config RTC-------------------------------------
Config Sda = Portc.4
Config Scl = Portc.5
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
Config Clock = User ' this will dim the bytes automatic
Dim Weekday As Byte
'Time$ = "20:10:00" ' to watch the day changing value
'Date$ = "02.27.07" ' erstmaliges stellen der Uhr
'************************************************* ***********
Dim Mischer_max As Integer
Dim Mischer_min As Integer
Dim Mischer_ist As Integer
'************************************************* ***********
Mischer_max = 1800 ' Vorlaufminimum
Mischer_min = 600 'Vorlaufmaximum
Mischer_ist = Mischer_min
'************************************************* **********
For I = Mischer_min To Mischer_max Step 10
Locate 2 , 1 : Lcd "MS:"
Locate 2 , 4 : Lcd I
Pulseout Portc , 2 , I 'Mischer_min 'Ist
Waitms 60
Next I
'************************************************* ***********
Do
Wait 1
For Id = Innen To Kessel 'Kessel
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Temperatur = Temperatur + 0.2
Tempmessstelle(id + 1) = Temperatur
___lcdno = 0
Select Case Id
Case Innen:
Locate 1 , 1 : Lcd "WZ: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Aussen:
Locate 1 , 11 : Lcd "AU: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
Case Vorlauf: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" ) ' Inn Auss Kess Rück Vorl
Case Rücklauf: ' 14.4 52.4 67.3 43.0 62.8
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
___lcdno = 1
Locate 2 , 20
Lcd Time$
Select Case Id
Case Kessel:
Locate 1 , 11 : Lcd "KE: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Cursor Off
Next Id
Loop
End
'**************************Sub Tagbetrieb**************
Tagbetrieb:
Return
'**************************Sub Nachtbetrieb************
Nachtbetrieb:
Return
'*************************Sub Relais schalten*******
Mischersteuerung:
Select Case Tagnacht
Case 0
Gosub Nachtbetrieb
Case 1
Gosub Tagbetrieb
End Select
Return
'************************************************* ***********
Auswertung_tag_nacht:
If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Or _hour = 7 Then
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If
Return
'**************************Subroutine für Timer1*******
Isr_von_timer1: 'ISR von Timer1
Timer1 = 36835
Gosub Auswertung_tag_nacht
Gosub Mischersteuerung
Return
'***************Subs für RTC***************************
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return
'************************************************* ***********
'************************************************* ***********
$eeprom
Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF '
Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23 '
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 '
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 '
Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 '
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F
Für die Steuerung meiner Heizung möchte ich den Mischer mit einem Servo regeln (was anderes wie mit dem Servo geht nicht, da ich die Originalregelung nicht ändern möchte, um Fehlerfälle abzufangen). Hierzu möchte ich in Abhängigkeit von der Raumtemperatur den Mischer öffnen oder schließen (die Funktionalität habe ich im Grundsatz im Code unten im Bereich Def. von Konstanten beschrieben).
Kann mir da jemand helfen, wie man das am besten macht (z.B. für Tagbetrieb). oder ist mein Ansatz völlig falsch.
Danke schonmal
Martin
$regfile = "M8def.dat"
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
$baud = 19200
'************************************************* ***********
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Nachtbetrieb = 21
Tagbetrieb = 5
Dim Tempmessstelle(8) As Single
'************************Def. von Konstanten***************
Const Tagtemp_og = 22.0 ' Mischer ganz zu
Const Tagtemp_ug = 21.0 ' Mischer ganz auf
Const Nachttemp_og = 21.5 ' Mischer ganz zu
Const Nachttemp_ug = 20.5 ' Mischer ganz auf
'
'Im Bereich 21.0 bis 22.0 (Tagbetrieb) sowie im Bereich 20.5 bis 21.0 (Nachtb.)
'soll mit dem Servo der Mischer gesteuert werden.
'Mischerfunktion für diesen Bereich (y = m*x + n); x = Raumtemp, y = Mischerstellung
' y = 1200*x - 24600
' Bei Tagbetrieb:
' y = 1800 für Raumtemp < 21.0 Grad
' y = 600 für Raumtemp > 22.0 Grad
'
'Bei Nachtbetrieb:
' y = 1800 für Raumtemp < 20.0 Grad
' y = 600 für Raumtemp > 22.0 Grad
Die ganz Funktion (d.h. die Sub Mischersteuerung) soll nur alle 5 min oder so (am besten einstellbar) gestartet werden.
'************************************************* ***********
Config Portc.2 = Output
'--------------------------Funktionen LCD-Display-------------------------------
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port
Dim ___lcdno As Byte
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'--------------------------------Config Timer1----------------------------------
Config Timer1 = Timer , Prescale = 256 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 ' bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 36835 'Timer1 soll schon von 65535 - x*14400
'--------------------------------Config 1Wire configurieren---------------------
Config 1wire = Portc.1 'DS1820
Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Innen Alias 0
Vorlauf Alias 1
Rücklauf Alias 2
Aussen Alias 3
Kessel Alias 4
Dim Read_temp As Integer
Dim Sensor_ids(48) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'--------------------------------Config RTC-------------------------------------
Config Sda = Portc.4
Config Scl = Portc.5
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
Config Clock = User ' this will dim the bytes automatic
Dim Weekday As Byte
'Time$ = "20:10:00" ' to watch the day changing value
'Date$ = "02.27.07" ' erstmaliges stellen der Uhr
'************************************************* ***********
Dim Mischer_max As Integer
Dim Mischer_min As Integer
Dim Mischer_ist As Integer
'************************************************* ***********
Mischer_max = 1800 ' Vorlaufminimum
Mischer_min = 600 'Vorlaufmaximum
Mischer_ist = Mischer_min
'************************************************* **********
For I = Mischer_min To Mischer_max Step 10
Locate 2 , 1 : Lcd "MS:"
Locate 2 , 4 : Lcd I
Pulseout Portc , 2 , I 'Mischer_min 'Ist
Waitms 60
Next I
'************************************************* ***********
Do
Wait 1
For Id = Innen To Kessel 'Kessel
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Temperatur = Temperatur + 0.2
Tempmessstelle(id + 1) = Temperatur
___lcdno = 0
Select Case Id
Case Innen:
Locate 1 , 1 : Lcd "WZ: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Aussen:
Locate 1 , 11 : Lcd "AU: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
Case Vorlauf: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" ) ' Inn Auss Kess Rück Vorl
Case Rücklauf: ' 14.4 52.4 67.3 43.0 62.8
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
___lcdno = 1
Locate 2 , 20
Lcd Time$
Select Case Id
Case Kessel:
Locate 1 , 11 : Lcd "KE: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Cursor Off
Next Id
Loop
End
'**************************Sub Tagbetrieb**************
Tagbetrieb:
Return
'**************************Sub Nachtbetrieb************
Nachtbetrieb:
Return
'*************************Sub Relais schalten*******
Mischersteuerung:
Select Case Tagnacht
Case 0
Gosub Nachtbetrieb
Case 1
Gosub Tagbetrieb
End Select
Return
'************************************************* ***********
Auswertung_tag_nacht:
If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Or _hour = 7 Then
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If
Return
'**************************Subroutine für Timer1*******
Isr_von_timer1: 'ISR von Timer1
Timer1 = 36835
Gosub Auswertung_tag_nacht
Gosub Mischersteuerung
Return
'***************Subs für RTC***************************
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return
'************************************************* ***********
'************************************************* ***********
$eeprom
Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF '
Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23 '
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 '
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 '
Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 '
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F