Ergebnis 1 bis 4 von 4

Thema: Raumthermostat für Fußbodenheizung mit Ultra-Langsam-PWM

  1. #1
    Sponsor
    Registriert seit
    04.11.2016
    Beiträge
    27

    Raumthermostat für Fußbodenheizung mit Ultra-Langsam-PWM

    Auch hier wieder ein abgeschlossenes Projekt.

    Es gibt tausende fertige Raum-Thermostate in schier unglaublicher Funktionsvielfalt zu kaufen aber nicht das was ich wollte.


    Auslöser wie folgt:

    Mein Haus hat durchgehend Fussbodenheizung, Regelung der Vorlauftemperatur mit Berücksichtigung der Aussentemperatur.
    Also ganz normal. Auch hat zusätzlich jeder Raum noch einen Raumthermostat an der Wand mit dem man den Heizkreis entweder
    ganz abschalten oder die Raumtemperatur absenken kann.

    Funktioniert alles wunderbar mit Ausnahme des Wohnzimmers. Hier gibt es 2 "Störgrößen"
    - Der Kachelofen
    - Die Sonne da Südseite.

    Die Wandthermostate steuern die FB-Ventile im Verteilerkasten, also EIN-AUS. Mehr geben die Dinger nicht her.
    Jetzt wäre es aber schön eine Art Proportional-Regelung zu haben die bei Näherung an die Solltemperatur frühzeitig
    die Heizleistung reduziert.

    Eine FB-Heizung ist nun eine sehr träge Angelegenheit. Wenn das Zonenventil abschaltet dauert es etwa 5 Minuten bis
    das Ventil tatsächlich geschlossen ist. Bis sich das in der Raumtemperatur bemerkbar macht liegen da noch 1-2 Stunden dazwischen.
    Gleiches gilt beim Einschalten.Einen ausgekühlten Fußboden wieder auf Nenntemperatur zu bringen dauert einige Zeit.


    Mein Ansatz für eine Regelung:
    - Ultra-Langsam PWM verhindert das komplette Auskühlen des Fußbodens
    --> AUS
    --> Stufe 1 (45 Minuten EIN, 67 Minuten AUS)
    --> Stufe 2 (45 Minuten EIN, 45 Minuten AUS)
    --> Stufe 3 (90 Minuten EIN, 22 Minuten AUS)
    --> EIN, Dauerbetrieb
    - Temperaturmessung mit DS 1820
    - LCD-Display zur Anzeige der Betriebszustände
    - 2-Taster zur Einstellung der Temperatur
    - Batteriebetrieb
    - Batterieüberwachung
    - Verwendung eines polarisierten Relais für das Zonenventil
    - Funktionskontrolle über LED
    - Betriebsstundenzähler (Tage)


    Die Werte der Stufe 1...3 sind durch Versuche entstanden, funktioniert jetzt prima


    Hauptknackpunkt war der Batteriebetrieb. Hier habe ich viel experimentiert um die Batterie bestmöglich zu entlasten
    - Betrieb mit 3 Zellen AA
    - Komplette Abschaltung des Displays, also nicht nur das Abzwicken der Betriebsspannung sondern auch das Umkonfigurieren der Ports um vagabundierende Ströme ins LCD zu verhindern.
    - Verzicht auf die Fehlerkorrektur beim DS1820. Man will es nicht glauben, der DS1820 benötigt so wie er jetzt programmiert ist ca. 50% der Batteriekapazität.
    - Meßzyklus der Temperatur alle 10 Sekunden

    Den Sekundentakt gibt ein 32kHz Uhrenquarz vor

    Alle 24h wird ein Batterietest durchgeführt, bei Unterschreiten von 3,9V beginnt der Piezo zu piepsen. Quittieren mit beliebiger Taste.
    Die 3,9V werden vom polarisierten Relais vorgegeben. Unter dieser Spannung ist ein sicheres Schalten nicht mehr gewährleistet.
    Ebenfalls wird alle 24h der Tageszähler um "1" erhöht und dieser Wert ins EEPROM geschrieben.

    Bedienung:
    Taste UP oder DOWN schaltet das LCD ein und ermöglicht das Einstelle der Solltemperatur
    Taste UP UND DOWN für einige Sekunden zeigt die aktuellen Zustände
    - Zählerstände für Betrieb und Pause
    - Batteriespannung
    - Tageszähler



    Code:
    ' Thermometer mit DS1820
    ' ----------------------------------------------------------------------------
    
    '  0%  =                    immer AUS
    ' 40%  = 2700sec EIN        4050sec AUS    45min EIN    67min AUS
    ' 50%  = 2700sec EIN        2700sec AUS    45min EIN    45min AUS
    ' 80%  = 5400sec EIN        1350sec AUS    90min EIN    22min AUS
    '100% = immer EIN
    ' Betriebstagezähler eingebaut, bei Batteriewechsel löschbar
    ' Batteriespannung + Betriebstage abrufbar
    
    
    $regfile = "m88pdef.dat"
    
    
    $crystal = 1000000
    $hwstack = 150
    $swstack = 150
    $framesize = 150
    
    
    
    Config Portd.0 = Output                                     ' PIN 2 Bistabiles Relais AUS
    Spule_aus Alias Portd.0
    Spule_aus = 0
    Config Portd.1 = Output                                     ' PIN 3 Bistabiles Relais EIN
    Spule_ein Alias Portd.1
    Spule_ein = 0
    Config Portd.2 = Input                                      ' PIN 4 Taster DOWN
    Tup Alias Pind.2
    Portd.2 = 1
    Config Portd.3 = Input                                      ' PIN 5 Taster UP
    Tdown Alias Pind.3
    Portd.3 = 1
    Config Portd.4 = Output                                     ' PIN 6 LCD-Versorgungsspannung
    Lcdpower Alias Portd.4
    
    Config Portd.5 = Input                                      ' PIN 11 - FREI -
    Portd.5 = 1
    Config Portd.6 = Output                                     ' PIN 12 Piepser für Batteriealarm
    Piepser Alias Portd.6
    Config Portd.7 = Output                                     ' PIN 13 Schaltet Ub zur Spannungsmessung
    Spannungsteiler Alias Portd.7
    Config Portb.0 = Output                                     ' PIN 14 Ticker Sekundentakt
    Ticker Alias Portb.0
    Config Portb.1 = Input                                      ' PIN 15 LCD DB7
    Portb.1 = 1
    Config Portb.2 = Input                                      ' PIN 16 LCD DB6
    Portb.2 = 1
    Config Portb.3 = Input                                      ' PIN 17 MOSI
    Portb.3 = 1
    Config Portb.4 = Input                                      ' PIN 18 MISO
    Portb.4 = 1
    Config Portb.5 = Input                                      ' PIN 19 SCK
    Portb.5 = 1
    Config Portc.0 = Input                                      ' PIN 23 LCD DB5
    Portc.0 = 1
    Config Portc.1 = Input                                      ' PIN 24 LCD DB4
    Portc.1 = 1
    Config Portc.2 = Input                                      ' PIN 25 LCD E
    Portc.2 = 1
    Config Portc.3 = Input                                      ' PIN 26 LCD RS
    Portc.3 = 1
    Config 1wire = Portc.4                                      ' PIN27 Dallas 1820
    Config Portc.5 = Input                                      ' PIN 28 Messung Betriebsspannung
    Rem Portc.5 = 1
    
    
    Stop Ac                                                     ' Analog-Komparator aus
    
    
    
    '----- Sekunden-Takt (Timer2) mit Uhrenquarz
    
    Config Clock = Soft , Gosub = Sectic
    Config Date = Dmy , Separator = .                           'Datumsformat tt.mm.jj  mit Punkt als Separator
    
    
    Dim Sc(9) As Byte                                           ' DS1820 Werte
    Dim T As Integer                                            ' Temperatur 3stellig ohne Komma
    Dim T1 As Integer                                           ' Hilfsvariable zur Temperaturermittlung
    Dim Temp_round As Integer                                   ' gleitender Mittelwert
    Dim Temp_old As Integer                                     ' Alter Temperaturwert
    Dim Aenderung_soll As Integer                               ' Änderungsflag Sollwert
    Aenderung_soll = 1
    Dim Aenderung_ist As Integer                                ' Änderungsflag Istwert
    Aenderung_ist = 1
    Dim I As Byte                                               ' Hilfsvariable zur Temperaturermittlung
    Dim Anzeige As String * 4                                   ' zur formatierten LCD-Anzeige
    Dim Ventiltext As String * 5                                ' zur LCD-Ausgabe der Ventilstellung
    Dim Sollwert As Byte                                        ' Temperatur Sollwert 3stellig ohne Komma
    Sollwert = 200                                              ' Default Sollwert nach Einschalten
    Dim Xsollwert As Eram Byte                                  ' Speicher für letzten Sollwert
    If Xsollwert = 255 Then
        Xsollwert = Sollwert                                    ' Default setzen wenn Speicher leer
    Else
        Sollwert = Xsollwert
    End If
    Dim Delta As Integer                                        ' Temperaturdifferenz
    Dim Delta1 As Byte                                          ' Hilfsvariable
    Dim Zaehler As Integer                                      ' Taktgeber, Zähler in Sekunden
    Zaehler = 0
    Dim Ein_zeit As Integer                                     ' Einschaltdauer
    Dim Aus_zeit As Integer                                     ' Ausschaltdauer
    Dim Zaehler_ein As Integer                                  ' aktueller Wert EIN
    Dim Zaehler_aus As Integer                                  ' aktueller Wert AUS
    Dim Heiz_flag As Byte                                       ' Status Heizung EIN oder AUS
    Dim Anzeige_flag As Byte                                    ' Anzeigesteuerung
    Anzeige_flag = 0
    Dim Merker_spule As Byte                                    ' Merker für Ventilstellung
    Merker_spule = 1
    Dim Messzaehler As Byte                                     ' Intervall Messung (nur alle 10 Sekunden)
    Messzaehler = 10
    Dim Lcd_zaehler As Byte                                     ' Zähler für Betriebszeit LCD-Anzeige
    Lcd_zaehler = 0
    Dim Lcd_status As Byte                                      ' Zustand LCD-Anzeige EIN(1) / AUS(0) / Aktivierung nach Interrupt(2)
    Lcd_status = 1
    Dim U_messung As Word                                       ' Betriebsspannung gemessen vom ADC
    Dim U_betrieb As Single                                     ' Betriebsspannung umgerechnet
    Dim Unterspannung As Byte                                   ' Flag für Status Unterspannung
    Unterspannung = 0
    Dim A As Byte                                               ' Allgemeiner Zähler
    Dim Ticker_counter As Byte                                  ' Teiler für LED (Taktanzeige)
    Ticker_counter = 0
    Dim Betriebszaehler As Long                                 ' Sekundenzähler zum Erfassen der Betriebszeit
    Betriebszaehler = 0
    Dim Tageszaehler As Integer                                 ' Zählt die Betriebstage
    Dim Xtageszaehler As Eram Integer                           ' und legt ab im eram
    Tageszaehler = Xtageszaehler
    If Tageszaehler = -1 Then
       Tageszaehler = 0
       Xtageszaehler = 0
    End If
    
    
    
    Const Delta_max = 20                                        ' Spreizung nach Einschalten
    Const Offset = 0
    
    Gosub Ventil_aus                                            ' Nach Start Ventil auf jeden Fall AUS
    Gosub Deklaration_lcd                                       ' LCD Initialisieren
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Stop Adc
    
    
    Rem Version anzeigen
    Locate 1 , 1
    Lcd "-- Thermostat --"
    Locate 2 , 1
    Lcd "V2.00 16.07.2014"
    Wait 2
    Cls
    
    
    Rem beim Einschalten Versorgungsspannung Batterie messen
    
    Sound Piepser , 500 , 15
    Spannungsteiler = 1
    Start Adc
    Waitms 100
    For A = 1 To 5
       U_messung = Getadc(5)
       Waitms 100
       U_messung = Getadc(5)
       U_betrieb = U_messung * 1.075                            ' Faktor anpassen wg Toleranz Vorwiderstände
       U_messung = U_betrieb
      Locate 1 , 1
      Lcd "Batteriespannung"
      Locate 2 , 1
      U_betrieb = U_betrieb * 6.250                             ' Umrechnung in V
      U_messung = U_betrieb
      Anzeige = Str(u_messung)
      Lcd Format(anzeige , "0.000") ; " V ";
      If U_messung > 3900 Then
        Lcd " OK"
      Else
        Lcd " LEER"
      End If
      Waitms 400
      Sound Piepser , 100 , 20
    Next A
    Stop Adc
    Spannungsteiler = 0
    
    Cls
    Locate 1 , 1
      Lcd "Betrieb " ; Tageszaehler ; "Tage"
    Locate 2 , 1
      Lcd "Loeschen?->Taste"
    
    For A = 1 To 10
     If Tup = 0 Or Tdown = 0 Then                               ' Abfrage Löschtaste
       Waitms 1000
       If Tup = 0 Or Tdown = 0 Then                             ' Immer noch gedrückt?
        Tageszaehler = 0
        Xtageszaehler = Tageszaehler
        Locate 1 , 1
        Lcd "Betrieb 0 Tage  "
        Locate 2 , 1
        Lcd "(geloescht)     "
        Wait 2
       End If
    
     End If
     Waitms 500
    Next A
    
    Cls
    Lcd "Initialisierung"
    
    Gosub Deklaration_lcd
    
    Messzaehler = 9
    
    
    Enable Interrupts
    ' ----------------------------------------------------------------------------
    
    Do
    
    Gosub Betriebszeit
    Gosub Lcd_kontrolle
    Gosub Betriebsarten
    Gosub Temperaturmessung
    Gosub Temperatursollwert
    If Messzaehler = 10 Or Anzeige_flag > 0 Then
       Gosub Tempwertanzeige
       Gosub Phasenauswertung
       If Unterspannung = 1 Then
         Sound Piepser , 100 , 15
         Waitms 50
         Sound Piepser , 100 , 15
       End If
    End If
    If Messzaehler > 9 Then
     Messzaehler = 0
    End If
    
    Power Powersave
    
    Loop
    
    
    
    '-------------------------------------------------------
    ' Deklaration LCD
    ' Pins des LCD-Modules setzen
    
    Deklaration_lcd:
    
    Lcdpower = 1
    Waitms 500
    Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.0 , Db6 = Portb.2 , Db7 = Portb.1 , E = Portc.2 , Rs = Portc.3
    Config Lcd = 16 * 2
    Initlcd
    Cursor Off
    Cls
    
    
    Return
    
    
    '-------------------------------------------------------
    ' Überwachung Betriebsspannung
    Spannungsueberwachung:
    
       Spannungsteiler = 1
       Start Adc
    
       Waitms 400
       U_messung = Getadc(5)
       Waitms 100
       U_messung = Getadc(5)
       U_betrieb = U_messung * 1.075                            ' Faktor anpassen wg Toleranz Vorwiderstände
       U_messung = U_betrieb
    
       If U_messung < 630 Then                                  ' 630
         Unterspannung = 1                                      ' Unterspannung Flag setzen 3,9V
       Else
         Unterspannung = 0
       End If
       Stop Adc
       Spannungsteiler = 0
    
    
    Return
    
    '-------------------------------------------------------
    
    Tempwertanzeige:
    
    If Lcd_status = 1 Then
     If Anzeige_flag = 0 Then
      If Aenderung_soll = 1 Then
        Aenderung_soll = 0
        Locate 1 , 1
        Anzeige = Str(sollwert)
    
        Lcd Format(anzeige , "00.0") ;
        Lcd Chr(223) ;
        Lcd " Soll"
      End If
    
      If Aenderung_ist = 1 Then
        Aenderung_ist = 0
        Locate 2 , 1
        Anzeige = Str(temp_round)
        Lcd Format(anzeige , "00.0") ;
        Lcd Chr(223);
        Lcd " Ist " ;
       End If
     End If
    
     If Anzeige_flag = 1 Then                                   ' Phasenanzeige
      Locate 1 , 1
      Lcd "E";
      Anzeige = Str(zaehler_ein)
      Lcd Format(anzeige , "0000") ; " ";
      Anzeige = Str(ein_zeit)
      Lcd Format(anzeige , "0000")
      Locate 2 , 1
      Lcd "A";
      Anzeige = Str(zaehler_aus)
      Lcd Format(anzeige , "0000") ; " ";
      Anzeige = Str(aus_zeit)
      Lcd Format(anzeige , "0000")
      Aenderung_soll = 1
      Aenderung_ist = 1
     End If
    
     If Anzeige_flag = 2 Then                                   ' Batteriespannung
      Cls
      For A = 1 To 10
       Gosub Spannungsueberwachung
       Locate 1 , 1
       Lcd "Batterie        "
       Locate 2 , 1
       U_betrieb = U_betrieb * 6.250                            ' Umrechnung in V
       U_messung = U_betrieb
       Anzeige = Str(u_messung)
       Lcd Format(anzeige , "0.000") ; " V ";
       If U_messung > 3900 Then
        Lcd " OK         "
       Else
        Lcd " LEER        "
       End If
      Next A
    
     End If
    
     If Anzeige_flag = 3 Then                                   ' Betriebszeit
      Cls
      Locate 1 , 1
      Lcd "Betrieb           "
      Locate 2 , 1
      Lcd Tageszaehler ; " Tage              "
     End If
    
    
    End If
    
    
    Return
    '-------------------------------------------------------
    
    Phasenauswertung:
    
    
    Delta = Sollwert - Temp_round
    Delta = Delta + Offset
    If Delta < 0 Then Delta = 0
    If Delta > Delta_max Then Delta = Delta_max
    
    
    Select Case Delta
        Case 0
         Delta1 = 0                                             ' 0% Einschaltdauer
         Ein_zeit = 0
         Aus_zeit = 9999
        Case Is < 5
         Delta1 = 40                                            ' 40% Einschaltdauer
         Ein_zeit = 2700                                        '2700 sek
         Aus_zeit = 4050                                        '4050 sek
        Case Is < 10
         Delta1 = 50                                            ' 50% Einschaltdauer
         Ein_zeit = 2700                                        '2700 sek
         Aus_zeit = 2700                                        '2700 sek
        Case Is < 15
         Delta1 = 80                                            ' 80% Einschaltdauer
         Ein_zeit = 5400                                        '5400 sek
         Aus_zeit = 1350                                        '1350 sek
        Case Is < 21
         Ein_zeit = 9999
         Aus_zeit = 0
         Delta1 = 100                                           ' 100% Einschaltdauer
    End Select
    
    
    Anzeige = Str(delta1)
    If Lcd_status = 1 Then
       Locate 1 , 11
       Lcd "|"
       Lcd Format(anzeige , "  0") ; "%"
    End If
    
    
    
    If Delta1 = 0 Then                                          ' AUS
       Heiz_flag = 0
       Gosub Ventil_aus
       Ventiltext = " Aus "
    End If
    
    If Delta1 > 1 And Delta1 < 99 Then                          ' Taktbetrieb
       If Heiz_flag = 0 Then
          Heiz_flag = 2
          Gosub Ventil_ein
          Ventiltext = " Ein "
       End If
       If Zaehler_ein => Ein_zeit Then
          Gosub Ventil_aus
          Heiz_flag = 1
          Ventiltext = "Pause"
       End If
       If Zaehler_aus => Aus_zeit Then
          Heiz_flag = 2
          Gosub Ventil_ein
          Ventiltext = " Ein "
       End If
    End If
    
    If Delta1 = 100 Then                                        ' EIN
       Heiz_flag = 0
       Gosub Ventil_ein
       Ventiltext = "Dauer"
    End If
    
    If Lcd_status = 1 Then
       Locate 2 , 11
       Lcd "|";
       Lcd Ventiltext
    End If
    
    Return
    
    
    ' -------------------------------------------------
    Ventil_aus:
       If Merker_spule = 1 Then
          Merker_spule = 0
          Spule_aus = 1
          Waitms 8
          Spule_aus = 0
       End If
    Return
    
    ' -------------------------------------------------
    Ventil_ein:
       If Merker_spule = 0 Then
          Merker_spule = 1
          Spule_ein = 1
          Waitms 8
          Spule_ein = 0
       End If
    Return
    
    ' -------------------------------------------------
    Sectic:                                                     'wird jede Sekunde angesprungen
    
    If Ticker_counter > 4 Then
        Ticker = 1                                              'Sekunden-LED für Funktionskontrolle alle 5 Sekunden
        Waitms 3
        Ticker = 0
        Ticker_counter = 0
    End If
    
      If Anzeige_flag > 0 Then
        Incr Zaehler
      Else
        Anzeige_flag = 0
      End If
      If Heiz_flag = 2 Then
        Incr Zaehler_ein
      Else
        Zaehler_ein = 0
      End If
      If Heiz_flag = 1 Then
        Incr Zaehler_aus
      Else
        Zaehler_aus = 0
      End If
    
      Incr Messzaehler                                          ' Intervall hochzählen
      Incr Lcd_zaehler                                          ' Betriebszeit LCD hochzählen
      Incr Ticker_counter                                       ' Zähler für Sekunden-LED
      Incr Betriebszaehler                                      ' Erfassung der Betriebszeit
    
    
    Return
    
    ' -------------------------------------------------
    ' Temperaturerfassung
    Temperaturmessung:
    
    If Messzaehler = 10 Then
    
       1wreset
       1wwrite &HCC                                             ' Überspringe Rombefehl Seriennummer
       1wwrite &H44                                             'messen
       Waitms 5
       1wreset
       1wwrite &HCC
       1wwrite &HBE                                             ' Start Daten lesen
    
       Sc(1) = 1wread(9)
       I = Sc(1) And 1
       If I = 1 Then Decr Sc(1)
       T = Makeint(sc(1) , Sc(2))
       T = T * 50
       T = T - 25
       T1 = Sc(8) - Sc(7)
       T1 = T1 * 100
       T1 = T1 / Sc(8)
       T = T + T1
       T = T / 10
    
    If T < 350 And T > 50 Then
                                                                ' Ausrutscher vom DS1820 wegbügeln <5° und > 35°
        Temp_round = T
        If Temp_round <> Temp_old Then
          Temp_old = Temp_round
          Aenderung_ist = 1
        End If
    End If
    
    
    End If
    
    Return
    
    ' -------------------------------------------------
    Betriebsarten:
     If Tup = 0 And Tdown = 0 Then                              ' Umschaltung Betriebsarten
       Waitms 2000
       If Tup = 0 And Tdown = 0 Then                            ' Umschalten Temperaturanzeige --> Timer
        Anzeige_flag = 1
        Gosub Tempwertanzeige
        Lcd_zaehler = 0                                         ' Counter für AutoAusLCD zurücksetzen
        Messzaehler = 10                                        ' Sofort Messung starten
       End If
     End If
    
     If Anzeige_flag = 1 And Zaehler > 5 Then                   ' nach 15 Sekunden Batteriespannung
       Anzeige_flag = 2
     End If
    
     If Anzeige_flag = 2 And Zaehler > 10 Then                  ' nach 20 Sekunden Betriebszeit
       Anzeige_flag = 3
     End If
    
     If Zaehler > 15 Then                                       ' nach 15 Sekunden autom. Rückstellung auf Temperatur
       Zaehler = 0
       Anzeige_flag = 0
       Aenderung_soll = 1
       Aenderung_ist = 1
       Messzaehler = 10                                         ' Sofort Messung starten
     End If
    
    Return
    ' -------------------------------------------------
    Temperatursollwert:
    
    
     If Tdown = 0 Then
       If Unterspannung = 1 Then
          Unterspannung = 0                                     ' Merker für Unterspannungsalarm löschen
          Return
       End If
       Aenderung_soll = 1
       Sollwert = Sollwert - 5                                  ' Solltemperatur senken
       If Sollwert < 100 Then Sollwert = 100
       Xsollwert = Sollwert                                     ' ins EERAM übernehmen
       Gosub Tempwertanzeige                                    ' Sofort ausgeben
       Lcd_zaehler = 0                                          ' Counter für AutoAusLCD zurücksetzen
       Messzaehler = 10                                         ' Sofort Messung starten
     End If
     If Tup = 0 Then
       If Unterspannung = 1 Then
          Unterspannung = 0
          Return
       End If
       Unterspannung = 0                                        ' Merker für Unterspannungsalarm löschen
       Aenderung_soll = 1
       Sollwert = Sollwert + 5                                  ' Solltemperatur erhöhen
       If Sollwert > 250 Then Sollwert = 250
       Xsollwert = Sollwert                                     ' ins EERAM übernehmen
       Gosub Tempwertanzeige                                    ' Sofort ausgeben
       Lcd_zaehler = 0                                          ' Counter für AutoAusLCD zurücksetzen
       Messzaehler = 10                                         ' Sofort Messung starten
     End If
    
    Return
    
    
    
    ' -------------------------------------------------
    ' Steuerung EIN/AUS LCD-Anzeige
    Lcd_kontrolle:
    If Lcd_zaehler > 20 And Lcd_status = 1 Then                 'LCD AUS nach 20 Sekunden
       Lcd_zaehler = 20
       Disable Interrupts
       Display Off
    Rem LCD-Ports
    
    Config Portb.1 = Input                                      ' PIN 15 LCD DB7
    Portb.1 = 0
    Config Portb.2 = Input                                      ' PIN 16 LCD DB6
    Portb.2 = 0
    Config Portc.0 = Input                                      ' PIN 23 LCD DB5
    Portc.0 = 0
    Config Portc.1 = Input                                      ' PIN 24 LCD DB4
    Portc.1 = 0
    Config Portc.2 = Input                                      ' PIN 25 LCD E
    Portc.2 = 0
    Config Portc.3 = Input                                      ' PIN 26 LCD RS
    Portc.3 = 0
       Lcdpower = 0
       Lcd_status = 0
       Enable Int1                                              ' Taste DOWN zum Aufwachen
       On Int1 Irq_int
       Enable Int0                                              ' Taste UP zum Aufwachen
       On Int0 Irq_int
       Enable Interrupts
    End If
    
    If Lcd_status = 2 Then                                      ' LCD EIN nach Interrupt
       Disable Int0
       Disable Int1
       Gosub Deklaration_lcd                                    ' LCD Init
       Lcd_status = 1
       Aenderung_soll = 1
       Aenderung_ist = 1
       Messzaehler = 10
    End If
    
    
    Return
    ' -------------------------------------------------
    ' Abfangen Taster UP / DOWN
    Irq_int:                                                    '
      Lcd_status = 2
      Lcd_zaehler = 0
      Unterspannung = 0                                         ' Flag für Unterspannungsmeldung löschen
    Return
    ' -------------------------------------------------
    
    ' Betriebstageszähler und Spannungsüberwachung
    Betriebszeit:                                               '
      If Betriebszaehler > 86400 Then                           ' 1 Tag höherzählen (86400 Sekunden)
        Betriebszaehler = 0
        Tageszaehler = Xtageszaehler
        Incr Tageszaehler
        Xtageszaehler = Tageszaehler                            ' und abspeichern im eeram
    
    
        Gosub Spannungsueberwachung                             ' 1 x täglich Batteriespannung messen
    
    
      End If
    
    
    Return
    ' -------------------------------------------------
    
    
    End


    Das Thermostat ist jetzt fast 3 Jahr in Betrieb, funktioniert einwandfrei.
    Die Batterielebensdauer mit billigen AA-Batterien vom ALDI lag bei 825 Tagen!


    Eingebaut in ein PVC-Gehäuse mit Klarsichtdeckel. Der "gefährliche" 230V-Teil mit dem monostabilen Relais ist
    hinter dem Gehäuse in der UP-Dose untergebracht und damit berührungsgeschützt bei Batteriewechsel.


    Layout und Schaltplan
    Thermostat BOARD.pdf
    Thermostat SCHALTPLAN.pdf

    Einige Bildchen
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Betriebszeit.JPG 
Hits:	25 
Größe:	54,7 KB 
ID:	307
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Einschaltdauer.JPG 
Hits:	23 
Größe:	62,3 KB 
ID:	308
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Soll_Ist.JPG 
Hits:	18 
Größe:	58,6 KB 
ID:	309
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	von_hinten.JPG 
Hits:	30 
Größe:	88,6 KB 
ID:	310
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	von_Seite.JPG 
Hits:	23 
Größe:	80,9 KB 
ID:	311
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	von_Vorne.JPG 
Hits:	25 
Größe:	79,8 KB 
ID:	312
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Wanddose.JPG 
Hits:	23 
Größe:	63,0 KB 
ID:	313
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Batteriestand.JPG 
Hits:	20 
Größe:	52,3 KB 
ID:	306
    Geändert von Riedleweg (12.12.2016 um 22:51 Uhr)

  2. #2
    Administrator Avatar von DON
    Registriert seit
    19.11.2016
    Ort
    Herford
    Beiträge
    459
    Die Batterielebensdauer mit billigen AA-Batterien vom ALDI lag bei 825 Tagen!
    Respekt.
    Ein Mensch mag noch so herausragende Fähigkeiten haben – wenn er arrogant und selbstsüchtig ist, sind sie nichts wert.
    Konfuzius


  3. #3
    Neuer Benutzer
    Registriert seit
    02.11.2016
    Beiträge
    54
    Hallo Riedleweg,

    ein interessantes Projekt.
    Frage was soll im Schaltplan der 5 Volt Anschlusspunkt bedeuten.
    Frage zwei Energieverbrauch. Diese ist eigentlich der Punkt für mein Interesse.
    LCD komplett abgenabelt okay Aber doch schon ab und zu mal an(Verbrauch ?)
    Controller ständig AN noch okay bei 32,768 kHz(ca.< 2 mA).
    Nun kommen die Stromfresser es sind die Relais. Kann leider die Typenbezeichnung nicht lesen aber der Spulenwiderstand wird wohl kleiner 250 Ohm sein(ca. 20mA Schaltzeit laut Code 8 mSek)
    Meßzyklus der Temperatur alle 5 Sekunden (min. 1mA)
    Nun habe ich mal mit“ --> Stufe 2 (45 Minuten EIN, 45 Minuten AUS)“ die Arbeit der Batterieversorgung ermittelt und komme nicht mal annähernd an die „Lebensdauer“. Bin auf Max 140 Tage gekommen.
    Wenn deine praktischen Erfahrungen bestätigt, dass mehr als 2 Jahre Batteriebetrieb möglich sind, ist dies wirklich ein tolles Projekt.

    P.S. Ich verlasse mich lieber auf Praxiserfahrungen als auf Seitenweise theoretische Abhandlungen mit Hinweis wie es nicht geht.
    Habe vielleicht ein Denkfehler in meinen Berechnungen oder es ist nur ein Komma verrutscht.
    In der Theorie peinlich aber in der Praxis Qualm oder noch viel schlimmer.

    Gruß

  4. #4
    Sponsor
    Registriert seit
    04.11.2016
    Beiträge
    27
    Hallo Fredred,

    zu 1) Die 5V sind ist ein Überbleibsel von einem anderen Schaltplan. Cut & Paste, im Eagle nicht angepasst
    Den Eagle-Plan hätte ich schöner zeichnen können. Will´s ja auch nicht verkaufen.....

    zu 2) Ich hatte ähnliche Überlegungen angestellt wie du; Landung im Wald, so komme ich nicht weiter.

    Ich habe dann tatsächlich für die einzelnen Phasen echte Strom-Messungen durchgeführt. War nicht immer ganz einfach vor allem bei den Phasen mit niedriger Stromaufnahme und kurzen Zeiten. Aber die Tendenz zeigt es zumindest an.
    Messfehler werden drin sein da ist einfach meine Messtechnik nicht präzise genug.
    Und ich bin auch von Annahmen ausgegangen was z.B. die Anzahl der LCD-Ablesungen/Tag oder die Anzahl der Relais-Schaltvorgänge/Tag angeht.
    Das ganze dann ins EXCEL gehackt und zusammengezählt.

    Große Überraschung, die Relais sind mitnichten die Stromfresser, hatte ich auch gedacht dass das die Spulen sind.
    Relais sind nicht mal mit 1% am Energieverbrauch beteiligt!
    Hauptfresser ist der DS1820 mit rund 50%. Das war auch der Grund um auf die Fehlerkorrektur zu verzichten. Die Abfragedauer des DS1820 gilt es kurz zu halten.

    Ich hab mal ein EXCEL-File drangehängt mit dem ich damals gearbeitet habe. Echte reale Lebensdauer der Batterie kommt schon in etwa hin.


    Batterielebensdauer.zip

    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Übersicht.jpg 
Hits:	18 
Größe:	170,2 KB 
ID:	316

    Steinigt mich nicht wenn da ein Denkfehler drin ist. Die Richtung stimmt.
    Geändert von Riedleweg (13.12.2016 um 12:00 Uhr)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •