Sie sind hier: Home » Bewässerungssteuerung 2018 » Programm RST

Link zu: Programm Regnersteuerung.bas

'*******************************************************************************
'************                 Regnersteuerung18_V0.5             ***************
'*******************************************************************************

'name                     : Regnersteuerung18_V0.5
'copyright                : (c) 29.01.2019 jep
'purpose                  : Steuert Rasenbewässerung
'micro                    : Mega1284P-PU
'
'Changelog:               : V0.3: 10/15 Min und ESP-Eingang nachgetragen
'                         : V0.4: "zuerst" wieder eliminiert
'                         : V0.5: WEB-Page angepasst + seriellen Eingang
'                         : V0.6: Debuggen auf SW-UART umgeschrieben
'
'_______________________________________________________________________________

$regfile = "m1284Pdef.dat"                                  'ATMEL Mega1284-PU
$crystal = 8000000                                          'mit 8 MHz-Clock
$hwstack = 40                                               'default use 32 for the hardware stack
$swstack = 16                                               'default use 10 for the SW stack
$framesize = 60                                             'default use 40 for the frame space
$baud = 115200                                              'serielle Schnittstelle


'========================== Portkonfiguration ==================================
Config PortA.0 = Input                                      'Tastatur
PortA.0 = 0                                                 'kein Pullup !!!!!

Config Portb.5 = Output                                     'Output MOSI
PortB.5 = 1                                                 'Pullup
MOSI Alias PinB.5

Config Portb.6 = Input                                      'Input MISO
PortB.6 = 1                                                 'Pullup
MISO Alias PinB.6

Config Portb.7 = Output                                     'Output SCK
PortB.7 = 1                                                 '
SCK Alias PinB.7

Config PortC.4 = Input                                      'Debug-Eingang
Debuggen Alias PortC.4                                      '1 = Debuggen; 0 = keine Ausgabe

Config PortC.5 = Output                                     'blockiert RX-Eingang des ESP
PortC.5 = 1                                                 'und damit da Senden des ESP
ESP_block Alias PortC.5

Config Portc.6 = Input
PortC.6 = 1                                                 'Pullup
GPIO0 Alias Pinc.6                                          'vom ESP8266-GPIO0

Config PortC.7 = Input
PortC.7 = 1                                                 'Pullup
GPIO2 Alias Pinc.7                                          'vom ESP8266-GPIO2

Config PortD.2 = Input                                      'Input 1 sec. Interrupt
PortD.2 = 1                                                 'Pullup
1s_IRQ Alias PinD.2

Config PortD.3 = Output                                     'Relais K4
PortD.3 = 0                                                 'ausschalten
Sued_K4 Alias PortD.3

Config PortD.4 = Output                                     'Relais K3
PortD.4 = 0                                                 'ausschalten
Nord_K3 Alias PortD.4

Config PortD.5 = Output                                     'Relais K2
PortD.5 = 0                                                 'ausschalten
Haupt_K2 Alias PortD.5

Config PortD.6 = Output                                     'Relais K1
PortD.6 = 0                                                 'ausschalten
Power_K1 Alias PortD.6

Config PortD.7 = Input                                      '
PortD.7 = 1                                                 'Pullup


'============================= ADC Konfiguration  ==============================
Config Adc = Single , Prescaler = Auto , Reference = AVCC   'Für Tastenabfrage


'==================== LCD Display mit 2 Zeilen zu 16 Zeichen ===================
Config Lcdpin = Pin , E = PortA.3 , Rs = PortA.1 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
Config Lcd = 16 * 2
Config PortA.2 = Output                                     'LCD-Beleuchtung
PortA.2 = 1                                                 'und auf 1 legen, Beleuchtung aus
Beleuchtung Alias PortA.2

Initlcd                                                     'Initialisieren
Cursor Off                                                  'Cursor aus
Cls                                                         'Display löschen
Home                                                        'Cursor auf Position 1 , 1

'============================== Serielle Konfiguration =========================

Config Serialin = Buffered , Size = 10 , Bytematch = 13     'Carridge Return als Bytematch


'=============================== I2C/TWI Konfiguration =========================
$lib "I2C_TWI.LBX"                                          'Library für HW-I2C-Bus
Config Twi = 100000                                         'DS1307 läuft nur mit 100kHz
I2cinit                                                     'Port´s nicht konfigurieren,
                                                            'sie sind HW-mässig festgelegt
'address of ds1307
Config clock = user
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

'$lib "ds1307clock.lib"                                      'DS1307 Library

Config Int0 = Falling                                       '1 sec-Takt
on Int0 sectic
Enable Interrupts
Enable Int0

Config Date = DMY , Separator = DOT

'_______________________________________________________________________________

Dim Jahr As Byte                                            'für Manipulationen nötig
Dim Monat as Byte
Dim Tag As Byte
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte
Dim Weekday As Byte
dim bcd_day as Byte
Dim bcd_month as Byte
Dim bcd_year as Byte
Dim bcd_hour as Byte
Dim bcd_min as Byte
Dim bcd_sec as Byte
Dim Datum as string * 10
Dim Zeit as string * 10
Dim alte_minute as Byte
Dim Neue_Sekunde as Byte
Dim Timeout as Byte

Dim Taste as Byte
Dim Tastenpuffer as Byte
Dim letzte_Taste as Byte
Dim serCode_da as Byte
Const Up = 8
Const Down = 2
Const Links = 6
Const Rechts = 4
Const OK = 5
Const Nord = 7
Const Sued = 9
Const LZ10 = 1
Const LZ15 = 3

Dim Ventillaufzeit as Byte                                  'Sekunden
Ventillaufzeit = 20                                         'Default 20 sec
Dim Laufzeit_N as Byte                                      'Vorgabe in min
Laufzeit_N = 0                                              'Default
Dim Laufzeit_S as Byte                                      'Vorgabe in min
Laufzeit_S = 0                                              'Default
Dim akt_Laufzeit_N as Byte                                  'aktuelle Laufzeit in min
akt_Laufzeit_N = 0                                          'Default 0
Dim akt_Laufzeit_S as Byte                                  'aktuelle Laufzeit in min
akt_Laufzeit_N = 0                                          'Default 0
Dim Restlaufzeit_N as Byte                                  'min
Restlaufzeit_N = 0                                          'Default 0
Dim Restlaufzeit_S as Byte                                  'min
Restlaufzeit_S = 0                                          'Default 0
Dim Notbremse as Byte                                       'Merker
Notbremse = 0                                               'ausgeschaltet (0)
Dim max_Zeit as Word                                        'absolut max. Laufzeit
max_Zeit = 1800                                             'in Sec(30 Min)
Dim Notbremse_timer as Word                                 'Timer für max. Laufzeit
Notbremse_timer = max_Zeit                                  'Default ist max_Zeit
Dim Sicherheit_min as Word                                  'Anzeige in Minuten
Dim Powertime as Byte                                       'Nachlaufzeit der 230V in min
Powertime = 3                                               'Default 3 min
Dim Power_timer as Byte                                     'Timer für Nachlaufzeit
Power_timer = 0                                             'Default 0
Dim Nord_aktiv as Byte
Nord_aktiv = 0
Dim Sued_aktiv as Byte
Sued_aktiv = 0
Dim Menue_aktiv as Byte
Menue_aktiv = 0

Dim X as Byte
Dim Y as Byte
Dim Z as Word
Dim Start_Nord_verz as Byte
Dim Start_Sued_verz as Byte
Dim WEB_Ausgabe_erledigt as Byte
Dim Status_Power as string * 100
Dim Status_Haupt as string * 100
Dim Status_Nord as string * 150
Dim Status_Sued as string * 150
Dim Status_NT as string * 100
Dim Befehl as string * 5
Dim Vergleich as string * 5
Dim Resultat as Word
Dim Meldung as String * 80
Config PortA.0 = Input                                      'Tastatur
PortA.0 = 0                                                 'kein Pullup da analog !!!!!

 

'****************************************************************************************************************************
'***************************** PROGRAMMSTART ********************************************************************************
'****************************************************************************************************************************

'Print "************************************************"
'Print "************** Programmstart *******************"
'Print "************************************************"

Meldung = "************************************************"
gosub SWPrint
Meldung = "************** Programmstart *******************"
gosub SWPrint
Meldung = "************************************************"
gosub SWPrint

Meldung = "SW-Serieschnittstelle mit 19200 Baud" + chr(13) + chr(10) + chr(10)       'Test der SW-Serieschnittstelle
Gosub SWPrint

Beginn:
Disable Interrupts                                          'sonst wird die Anzeige durcheinandergebracht
gosub Set_1sec_tick                                         '1 sec-Takt auf DS1307 einschalten

Initlcd                                                     'LCD initialisieren
Cursor Off                                                  'Cursor aus
Cls                                                         'Display löschen
Locate 1 , 1
LCD "Regnersteuerung "                                      'Titel
Locate 2 , 1                                                'und
Lcd "2018  Vers: V0.5"                                      'Version immer anpassen !!!!!!!!!!!!!!!!!!!!!
Beleuchtung = 0                                             'Beleuchtung einschalten
Wait 4                                                      '4 Sekunden warten
Cls

'Ventil in eine definierte Stellung bringen (geschlossen)

Haupt_K2 = 0                                                'Hauptventil zu
Nord_K3 = 0                                                 'Nord zu
Sued_K4 = 0                                                 'Süd zu
waitms 50
Power_K1 = 1                                                '220VAC auf die Ventile geben
Locate 1 , 1
LCD "Ventile         "
Locate 2 , 1
LCD "schliessen      "
Gosub Vent_Timer                                            '20sec-Timer aufrufen
Power_K1 = 0                                                '220V für die Ventile abschalten

Gosub Getdatetime                                           'die aktuellen Zeiteinstellungen übernehmen
gosub Normalanzeige
waitms 100
Beleuchtung = 1                                             'Beleuchtung ausschalten

Enable Interrupts                                           'und nun los

gosub WEB_Anzeige

 

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'++++++++++++++++++++++++++++ Hauptschleife ++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

do
   Gosub Tastenabfrage
   Select Case Taste
      Case OK : gosub Menue1
      Case Nord : gosub Nord_ea
      Case Sued : gosub Sued_ea
      Case LZ10 : gosub 10_ea
      Case LZ15 : gosub 15_ea
   End Select

   if serCode_da = 1 then gosub Code_auswerten

   if _sec = 10 then gosub WEB_Ausgabe                      'WEB -Seite nachführen

   If Neue_sekunde = 1 Then
      Neue_sekunde = 0
      if alte_minute <> _min then
         gosub mintic
         alte_minute = _min
      end if
   End If
loop

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'=========================================================================
'===================== Alles was pro Sekunde abläuft =====================

Sectic:
'   Meldung = "*"                                            'Sekundentick auf Printer
'   gosub SWPrint

   gosub Getdatetime
   Neue_sekunde = 1

'Überwachung auf Maximalzeit; sollte (hoffentlich) nie auftreten
   if Notbremse = 1 then                                    'Notbremse eingeschaltet
      decr Notbremse_timer
      if Notbremse_timer = 0 then
         Notbremse = 0                                      'Notbremse ausschalten
         Notbremse_timer = max_Zeit
         gosub Not_aus                                      'alles aus und RESET
      end if
   End if

'stellt wieder die Normalanzeige her
   If Nord_aktiv = 0 and Sued_aktiv = 0 and Menue_aktiv = 0 then       'nichts aktiv
      gosub Normalanzeige
   End if
Return

'=========================================================================
'=========================================================================
'#########################################################################
'################ Alles was einmal pro Minute abläuft ####################
'diese Unterprogramme werden jede Minute ausgeführt

Mintic:

   if Debuggen = 1 then
      gosub CRLF
      Meldung = "Nord / Süd aktiv: " + bin(Nord_aktiv) + " / " + bin(Sued_aktiv)
      Gosub SWPrint
      Meldung = "Nord verz: " + bin(Start_Nord_verz)
      Gosub SWPrint
      Meldung = "Sued verz: " + bin(Start_Sued_verz)
      Gosub SWPrint
      Meldung = "Nottimer: " + bin(Notbremse_timer)
      Gosub SWPrint
   end if

   WEB_Ausgabe_erledigt = 0                                 'zu jeder vollen Minute zurücksetzen

   If Nord_aktiv = 0 and Sued_aktiv = 0 then
      decr Power_timer
      if Power_timer = 1 then                               'Hauptventil zu, braucht
         Haupt_K2 = 0                                       'ca 20 sec zum schliessen
         if Debuggen = 1 then
            Meldung = "Wasser aus"
            gosub SWPrint
         end if
      End if
      if Power_timer = 0 then                               '1 Min. später
         Notbremse = 0                                      'Notbremse ausschalten
         Notbremse_timer = max_Zeit
         Power_K1 = 0                                       '230V ausschalten
         Beleuchtung = 1                                    'Beleuchtung ausschalten
         if Debuggen = 1 then
            Meldung = "Power off"
            gosub SWPrint
         end if
      End if
   End if
   if Nord_aktiv = 1 then                                   'Nord wurde zuerst gestartet
      gosub Anzeige_Nord
      goto Mintic_End
   end if
   if Sued_aktiv = 1 then                                   'Süd wurde zuerst gestartet
      gosub Anzeige_Sued
      goto Mintic_End
   end if
   if Nord_aktiv = 0 and Sued_aktiv = 0 then                'keiner mehr aktiv
      if Start_Nord_verz = 1 then                           'Start Nord wurde verzögert
         Start_Nord_verz = 0                                'Merker zurückstellen
         Nord_aktiv = 1                                     'Nord ist nun aktiv
         gosub Start_Nord                                   'und Nord starten
      end if
      if Start_Sued_verz = 1 then                           'Start Süd wurde verzögert
         Start_Sued_verz = 0                                'Merker zurückstellen
         Sued_aktiv = 1                                     'Süd ist nun aktiv
         gosub Start_Sued                                   'und Süd starten
      end if
   end if

   gosub Anzeige_Nord
   gosub Anzeige_Sued

Mintic_End:
Return

'__________________________________________

Anzeige_Nord:
   If akt_Laufzeit_N < Laufzeit_N then
      akt_Laufzeit_N = akt_Laufzeit_N + 1
      if Debuggen = 1 then
         Meldung = "akt. LZN: " + bin(akt_Laufzeit_N)
         gosub SWPrint
      end if
      Restlaufzeit_N = Laufzeit_N - akt_Laufzeit_N
      if akt_Laufzeit_N >= Laufzeit_N then
         gosub Stop_Nord
        Else
         cls
         Locate 1 , 1
         LCD "Laufzeit  N: " ; Laufzeit_N ; "m"
         Locate 2 , 1
         LCD "Restlaufz N: " ; Restlaufzeit_N ; "m"
      End if
   End if
Return

Anzeige_Sued:
   If akt_Laufzeit_S < Laufzeit_S then
      akt_Laufzeit_S = akt_Laufzeit_S + 1
      if Debuggen = 1 then
         Meldung = "akt. LZS: " + bin(akt_Laufzeit_S)
         gosub SWPrint
      end if
      Restlaufzeit_S = Laufzeit_S - akt_Laufzeit_S
      if akt_Laufzeit_S >= Laufzeit_S then
         gosub Stop_Sued
       Else
         cls
         Locate 1 , 1
         LCD "Laufzeit  S: " ; Laufzeit_S ; "m"
         Locate 2 , 1
         LCD "Restlaufz S: " ; Restlaufzeit_S ; "m"
      End if
   End if
Return

'##########################################################################
'##########################################################################


'--------------------------- Unterprogramme -------------------------------
'dies sind Unterprogramme die nach einem Tastendruck aufgerufen werden

Nord_ea:
   If Laufzeit_N = 0 then                                   'Start, erster Tastendruck
      Laufzeit_N = Laufzeit_N + 5                           'Startwert 5 Min
Nord_ea1:
      akt_Laufzeit_N = 0                                    'aktuelle Laufzeit ist 0
      Restlaufzeit_N = Laufzeit_N - akt_Laufzeit_N
      Beleuchtung = 0                                       'Beleuchtung einschalten
      cls
      Locate 1 , 1
      LCD "Laufzeit  N: " ; Laufzeit_N ; "m"
      Locate 2 , 1
      LCD "Restlaufz N: " ; Restlaufzeit_N ; "m"
      if Sued_aktiv = 0 then                                'Süd nicht aktiv
         Nord_aktiv = 1                                     'Nord ist nun aktiv
         gosub Start_Nord                                   'also Starten
        else
         Start_Nord_verz = 1                                'Nord startet nach Süd
         gosub WEB_Anzeige                                  'und auf WEB darstellen
      end if
    Else                                                    'für weitere Tastendrücke
      Laufzeit_N = Laufzeit_N + 5                           'Wert um 5 Min. erhöhen
      Restlaufzeit_N = Laufzeit_N - akt_Laufzeit_N
      if Laufzeit_N = 25 then                               'max. Laufzeit ist 25 min.
         Laufzeit_N = 0
         gosub Stop_Nord                                    'Relais ausschalten
      End if
      cls                                                   'Anzeige wenn noch
      Locate 1 , 1                                          'nicht 25 Min
      LCD "Laufzeit  N: " ; Laufzeit_N ; "m"                'erreicht
      Locate 2 , 1
      LCD "Restlaufz N: " ; Restlaufzeit_N ; "m"
   End if
Return

Start_Nord:
   Power_timer = 3                                          'für 3 Min Nachlauf
   Power_K1 = 1                                             '230V einschalten
   Haupt_K2 = 1                                             'Wasser einschalten
   Nord_K3 = 1                                              'Ventil Nord ein
   Notbremse = 1                                            'Notbremse einschalten
   Notbremse_timer = max_Zeit                               'und laden
   if Debuggen = 1 then
      Gosub CRLF
      Meldung = "Start N"
      gosub SWPrint
      Meldung = "Power on"
      gosub SWPrint
      Meldung = "Wasser ein"
      gosub SWPrint
      Meldung = "Nord ein"
      gosub SWPrint
   end if
   gosub WEB_Anzeige
Return

Stop_Nord:
   Nord_aktiv = 0                                           'Merker Nord zurückstellen
   Laufzeit_N = 0                                           'alle Zeiten zurücksetzen
   akt_Laufzeit_N = 0
   Restlaufzeit_N = 0
   Power_timer = 3                                          'für 3 min 230V-Nachlauf
   Nord_K3 = 0                                              'Ventil Nord schliessen
   Start_Nord_verz = 0
   if Debuggen = 1 then
      Gosub CRLF
      Meldung = "Stop N"
      gosub SWPrint
   end if
   gosub Normalanzeige
   gosub WEB_Anzeige
Return

'_______________________________________________

Sued_ea:
   If Laufzeit_S = 0 then                                   'Start, erster Tastendruck
      Laufzeit_S = Laufzeit_S + 5                           'Startwert 5 Min.
Sued_ea1:
      akt_Laufzeit_S = 0                                    'aktuelle Laufzeit ist 0
      Restlaufzeit_S = Laufzeit_S - akt_Laufzeit_S
      Beleuchtung = 0                                       'Beleuchtung einschalten
      cls
      Locate 1 , 1
      LCD "Laufzeit  S: " ; Laufzeit_S ; "m"
      Locate 2 , 1
      LCD "Restlaufz S: " ; Restlaufzeit_S ; "m"
      if Nord_aktiv = 0 then                                'Nord nicht aktiv
         Sued_aktiv = 1                                     'Süd ist nun aktiv
         gosub Start_Sued                                   'also Starten
        else
         Start_Sued_verz = 1                                'Süd startet nach Nord
         gosub WEB_Anzeige                                  'und auf WEB darstellen
      end if
    Else                                                    'für weitere Tastendrücke
      Laufzeit_S = Laufzeit_S + 5                           'Wert um 5 Min. erhöhen
      Restlaufzeit_S = Laufzeit_S - akt_Laufzeit_S
      if Laufzeit_S = 25 then                               'max. Laufzeit ist 25 min.
         Laufzeit_S = 0
         gosub Stop_Sued                                    'Relais ausschalten
      End if
      cls                                                   'Anzeige wenn noch
      Locate 1 , 1                                          'nicht 25 Min
      LCD "Laufzeit  S: " ; Laufzeit_S ; "m"                'erreicht
      Locate 2 , 1
      LCD "Restlaufz S: " ; Restlaufzeit_S ; "m"
   End if
Return

Start_Sued:
   Power_timer = 3                                          'auf 3 Min Nachlauf stellen
   Power_K1 = 1                                             '230V einschalten
   Haupt_K2 = 1                                             'Wasser einschalten
   Sued_K4 = 1                                              'Ventil Süd ein
   Sued_aktiv = 1                                           'Merker Süd setzen
   Notbremse = 1                                            'Notbremse einschalten
   Notbremse_timer = max_Zeit                               'und laden
   if Debuggen = 1 then
      gosub CRLF
      Meldung = "Start S"
      gosub SWPrint
      Meldung = "Power on"
      gosub SWPrint
      Meldung = "Wasser ein"
      gosub SWPrint
      Meldung = "Süd ein"
      gosub SWPrint
   end if
   gosub WEB_Anzeige
   Return

Stop_Sued:
   Sued_aktiv = 0                                           'Merker Süd zurückstellen
   Laufzeit_S = 0                                           'alle Zeiten zurücksetzen
   akt_Laufzeit_S = 0
   Restlaufzeit_s = 0
   Power_timer = 3                                          '3 min 230V-Nachlauf
   Sued_K4 = 0                                              'Ventil Süd schliessen
   Start_Sued_verz = 0
   if Debuggen = 1 then
      Gosub CRLF
      Meldung = "Stop Süd"
      gosub SWPrint
   end if
   gosub Normalanzeige
   gosub WEB_Anzeige
Return

Stop_N_S:
   gosub Stop_Nord
   wait 1
   gosub Stop_Sued
Return

Not_aus:
   Disable Interrupts
   Nord_aktiv = 0                                           'Merker Nord zurückstellen
   Laufzeit_N = 0                                           'alle Zeiten zurücksetzen
   akt_Laufzeit_N = 0
   Restlaufzeit_N = 0
   Sued_aktiv = 0                                           'Merker Süd zurückstellen
   Laufzeit_S = 0                                           'alle Zeiten zurücksetzen
   akt_Laufzeit_S = 0
   Restlaufzeit_s = 0
   Start_Nord_verz = 0
   Start_Sued_verz = 0
   Haupt_K2 = 0
   Nord_K3 = 0                                              'Ventil Nord schliessen
   Sued_K4 = 0                                              'Ventil Süd schliessen
   Power_K1 = 1
   if Debuggen = 1 then
      gosub CRLF
      Meldung = ">>>>> NOT-AUS <<<<<"
      gosub SWPrint
      gosub CRLF
   end if
   wait 20
   Power_K1 = 0
   wait 1
   goto 0                                                   'RESET
Return                                                      'dakommt er nie hin

05_ea:
   Laufzeit_N = 5                                           'Startwert 5 Min
   gosub Nord_ea1
   wait 10
   Laufzeit_S = 5                                           'Startwert 5 Min
   gosub Sued_ea1
Return

10_ea:
   Laufzeit_N = 10                                          'Startwert 10 Min
   gosub Nord_ea1
   wait 10
   Laufzeit_S = 10                                          'Startwert 10 Min
   gosub Sued_ea1
Return

15_ea:
   Laufzeit_N = 15                                          'Startwert 15 Min
   gosub Nord_ea1
   wait 10
   Laufzeit_S = 15                                          'Startwert 15 Min
   gosub Sued_ea1
Return


Fehler:

Return


Vent_Timer:
wait Ventillaufzeit                                         'Ventillaufzeit
Return

Normalanzeige:
   cls
   Locate 1 , 1
   LCD "    " ; Zeit
   Locate 2 , 1
   LCD "    " ; Datum
Return


'-------------------------------------------------------------------------------
'-------------------    Unterprogramme für WEB-Auswertung     ------------------
'-------------------------------------------------------------------------------

Serial0charmatch:                                           'Interrupt vom seriellen Eingang
dim charakter as string * 1

   Befehl = ""
   While Ischarwaiting() = 1                                'Zeichen sind da
      charakter = inkey()                                   'abholen
      Befehl = Befehl + charakter
      If Len(Befehl) = 3 then                               'es werden nur 3 Zeichen empfangen
         Clear serialin
      end if
   WEND
   Clear serialin
   serCode_da = 1
Return


Code_auswerten:

if Debuggen = 1 then
   gosub CRLF
   Meldung = "vor Select Case: " + Befehl
   gosub SWPrint
   gosub CRLF
end if

'Auswerung mittels Select Case

   Select Case Befehl
      Case "N05" :
         Laufzeit_N = 5                                     'Startwert 5 Min
         gosub Nord_ea1
         Befehl = ""
      Case "N10"
         Laufzeit_N = 10                                    'Startwert 10 Min
         gosub Nord_ea1
         Befehl = ""
      Case "S05" :
         Laufzeit_S = 5                                     'Startwert 5 Min
         gosub Sued_ea1
         Befehl = ""
      Case "S10" :
         Laufzeit_S = 10                                    'Startwert 10 Min
         gosub Sued_ea1
         Befehl = ""
      Case "AUS" :
         gosub Stop_N_S
         Befehl = ""
      Case else : Print "NIX"
   End Select

   serCode_da = 0
Return


'-------------------------------------------------------------------------------
'-------------------    Unterprogramme für WEB-Ausgabe     ---------------------
'-------------------------------------------------------------------------------

WEB_Ausgabe:

   if WEB_Ausgabe_erledigt = 0 then Gosub WEB_Anzeige       'damit nicht mehrmals gesendet wird
   WEB_Ausgabe_erledigt = 1                                 'für diese Minute Ausgabe erledigt
Return


WEB_Anzeige:
   Const Head1 = "<html><style>.td{color:black;font-family:Arial,sans-serif;font-size:26px;font-weight:bold;}</style>"
   Const Head2 = "<body><table border=1px cellspacing=0 cellpadding='5' style= width:100%>"
   Const Head3 = "<tr><td class = 'td' colspan=2>Zustand Steuerung:</Font></td></tr>"

   if Power_K1 = 1 then
      Status_Power = "<tr><td class = 'td' width=300 bgcolor=#00FF40>230V eingeschaltet</td>"
     else
      Status_Power = "<tr><td class = 'td' width=300 bgcolor=#F7819F>230V ausgeschaltet</td>"
   end if

   if Haupt_K2 = 1 then
      Status_Haupt = "<td class = 'td' width=300 bgcolor=#00FF40>Hauptventil f&uumlr Wasser ist offen</td></tr>"
     else
      Status_Haupt = "<td class = 'td' width=300 bgcolor=#F7819F>Hauptventil f&uumlr Wasser ist geschlossen</td></tr>"
   end if

   if Nord_aktiv = 1 then
      Status_Nord = "<tr><td class = 'td' width=300 bgcolor=#00FF40><b>Bew&aumlsserung Nord l&aumluft noch " + str(Restlaufzeit_N) + " min.</b ></td>"
     else
        if Start_Nord_verz = 1 then
           Status_Nord = "<tr><td class = 'td' width=300 bgcolor=#BBE094><b>Bew&aumlsserung Nord wartet auf Start</b></td>"
          else
           Status_Nord = "<tr><td class = 'td' width=300 bgcolor=#F2F2D9><b>Bew&aumlsserung Nord ausgeschaltet</b></td>"
        end if
   end if

   if Sued_aktiv = 1 then
      Status_Sued = "<td class = 'td' width=300 bgcolor=#00FF40><b>Bew&aumlsserung S&uumld l&aumluft noch " + str(Restlaufzeit_S) + " min.</b></td></tr>"
     else
      if Start_Sued_verz = 1 then
         Status_Sued = "<td class = 'td' width=300 bgcolor=#BBE094><b>Bew&aumlsserung S&uumld wartet auf Start</b></td></tr>"
        else
         Status_Sued = "<td class = 'td' width=300 bgcolor=#F2F2D9><b>Bew&aumlsserung S&uumld ausgeschaltet</b></td></tr>"
      end if
   End if

   Sicherheit_min = Notbremse_timer / 60
   Status_NT = "<tr><td colspan=2 bgcolor=#E0F2F7><Font size='5'><b>Sicherheitstimer, Ausschalten erfolgt nach " + str(Sicherheit_min) + " min.</b></Font></td></tr>"

   print Head1 ; Head2 ; Head3 ; Status_Power ; Status_Haupt ; Status_Nord ; Status_Sued ; Status_NT ; "</table>" ;
   print "<table><tr><td class = 'td'>.  </Font></td></tr></table></body></html>"       'schaft etwas Abstand zwischen den Tabellen
   waitus = 20
Return


'-------------------------------------------------------------------------------
'-----------------    Unterprogramme für Tastenauswertung     ------------------
'-------------------------------------------------------------------------------

'Diese Unterfunktion fragt die Tastatur am analogen Port ab;
'wird keine Taste gedrückt so wird 0 zurückgegeben

Tastenabfrage:
   X = 0
   For y = 1 to 10
   Start Adc
      Z = Getadc(0)                                         'ist Port PA.0
      Select Case Z
         Case 0 To 50
            Taste = 0
         Case 51 To 150
            Taste = LZ10
         Case 151 To 250
            Taste = Down
         Case 251 To 350
            Taste = LZ15
         Case 351 To 450
            Taste = Rechts
         Case 451 To 550
            Taste = OK
         Case 551 To 650
            Taste = Links
         Case 651 To 750
            Taste = Nord
         Case 751 To 850
            Taste = Up
         Case 851 To 970
            Taste = Sued
         Case is > 971
            Taste = 0
      End Select
      waitms 10
      if Tastenpuffer = Taste then
         Incr X
         if X > 5 then goto welche_Taste
        Else
         Tastenpuffer = Taste
         waitms 1
      End if
   next y
welche_Taste:
   if Taste = letzte_Taste then                             'ist noch die gleiche Taste wie zuvor
      if Taste = 0 then                                     'Ausnahme ist 0 = keine Taste gedrückt
         goto Ende_Taste
       else                                                 'sonst solange abfragen bis
         goto Tastenabfrage                                 'eine andere Taste gedrückt wird
      end if
   end if
Ende_Taste:
   letzte_Taste = Taste
   waitms 100
Return


'-------------------------------------------------------------------------------
'------------------    Unterprogramme für SW-Print-Ausgabe     -----------------
'-------------------------------------------------------------------------------

SWPrint:                                                    'Ausgabe über die SW-Serieschnittstelle
   Disable interrupts
   serout Meldung , 0 , P0rtC , 2 , 19200 , 0 , 8 , 1
   enable interrupts
Return

CRLF:
   Meldung = chr(13) + chr(10)                              'CR + LF
   Disable interrupts
   serout Meldung , 0 , P0rtC , 2 , 19200 , 0 , 8 , 1
   enable interrupts
End                                                         ' Programmende


'===============================================================================
'================================   Menueauswahl   =============================
'===============================================================================

Menue1:
   Menue_aktiv = 1
   Disable Interrupts

   Beleuchtung = 0                                          'Beleuchtung einschalten
   cls
   Locate 1 , 1
   LCD "OK= Wasser Stop"
   Locate 2 , 1
   LCD "mit down weiter"
   Do
      gosub Tastenabfrage
      Select Case Taste
         Case 0
         Case OK : goto Wasser_Stop
         Case up : goto Menue6
         Case down : goto Menue2
         Case else goto Ende_Eingabe
      End Select
   Loop

Menue2:
   cls
   Locate 1 , 1
   LCD "OK= Zeit stellen"
   Locate 2 , 1
   LCD "mit down weiter"
   Do
      gosub Tastenabfrage
      Select Case Taste
         Case 0
         Case OK : goto Zeitstellen
         Case up : goto Menue1
         Case down : goto Menue3
         Case else goto Ende_Eingabe
      End Select
   Loop

Menue3:
   cls
   Locate 1 , 1
   LCD "OK= Laufd. Nord "
   Locate 2 , 1
   LCD "mit down weiter "
   Do
      gosub Tastenabfrage
      Select Case Taste
         Case 0
         Case OK : goto LD_Nord
         Case up : goto Menue2
         Case down : goto Menue4
         Case else goto Ende_Eingabe
      End Select
   Loop

Menue4:
   cls
   Locate 1 , 1
   LCD "OK= Laufd. Sued "
   Locate 2 , 1
   LCD "mit down weiter "
   Do
      gosub Tastenabfrage
      Select Case Taste
         Case 0
         Case OK : goto LD_Sued
         Case up : goto Menue3
         Case down : goto Menue5
         Case else goto Ende_Eingabe
      End Select
   Loop

Menue5:
   cls
   Locate 1 , 1
   LCD "Reserve 1       "
   Locate 2 , 1
   LCD "mit down weiter "
   Do
      gosub Tastenabfrage
      Select Case Taste
         Case 0
         Case OK : goto Menue1
         Case up : goto Menue4
         Case down : goto Menue6
         Case else goto Ende_Eingabe
      End Select
   Loop

Menue6:
   cls
   Locate 1 , 1
   LCD "Reserve 2       "
   Locate 2 , 1
   LCD "mit down weiter "
   Do
      gosub Tastenabfrage
      Select Case Taste
         Case 0
         Case OK : goto Menue1
         Case up : goto Menue5
         Case down : goto Menue1
         Case else goto Ende_Eingabe
      End Select
   Loop

Ende_Eingabe:
   gosub Normalanzeige
   Beleuchtung = 1                                          'Beleuchtung ausschalten
   Menue_aktiv = 0
   Enable Interrupts
Return

'===========================================================================
'========================  Menue1: Wasser Stop  ============================
'===========================================================================

Wasser_Stop:
   cls
   Locate 1 , 1
   LCD "  Wasser wird   "
   Locate 2 , 1
   LCD "  gestoppt      "
   wait 2                                                   '2 sec Anzeige
   gosub Stop_N_S
   gosub Ende_Eingabe
Return

'===========================================================================
'================= Menue2: Zeit und Datum einstellen =======================
'===========================================================================

Zeitstellen:
   gosub Getdatetime                                        'Zeit aus dem RTC holen

Zeit_stellen_Tag:

   Locate 1 , 1
   LCD "Tag einstellen  "
   Locate 2 , 1
   LCD Datum                                                'Date$

Zeit_stellen_Tag1:
   Tag = makebcd(_day)                                      'zur einfacheren Darstellung; Tag(1) wird sonst nicht gebraucht
   Locate 2 , 1
   LCD "                "
   Locate 2 , 1
   LCD Hex(Tag)

   gosub Tastenabfrage
   If Taste = Up then goto Tagplus
   If Taste = Down then goto Tagminus
   If Taste = Links then goto Zeit_stellen_Sec
   If Taste = Rechts then goto Zeit_stellen_Monat
   If Taste = Ok then goto Zeit_speichern_Ende
   Goto Zeit_stellen_Tag1

Tagplus:
   _day = _day + 1
   if _day > 31 then _day = 1
   gosub setdate
   gosub Getdatetime
   goto Zeit_stellen_Tag1

Tagminus:
   _day = _day - 1
   if _day = 0 then _day = 31
   gosub setdate
   gosub Getdatetime
   goto Zeit_stellen_Tag1
'____________

Zeit_stellen_Monat:

   cls
   Locate 1 , 1
   LCD "Monat einstellen"
   Locate 2 , 1
   LCD Datum                                                'Date$

 Zeit_stellen_Monat1:
   Monat = makebcd(_month)                                  'zur einfacheren Darstellung; Tag(1) wird sonst nicht gebraucht
   Locate 2 , 1
   LCD "                "
   Locate 2 , 1
   LCD Hex(Monat)

   gosub Tastenabfrage
   If Taste = Up then goto Monatplus
   If Taste = Down then goto Monatminus
   If Taste = Links then goto Zeit_stellen_Tag
   If Taste = Rechts then goto Zeit_stellen_Jahr
   If Taste = Ok then goto Zeit_speichern_Ende
   Goto Zeit_stellen_Monat1

Monatplus:
   _month = _month + 1
   if _month > 12 then _month = 1
   gosub setdate
   gosub Getdatetime
   goto Zeit_stellen_Monat1

Monatminus:
   _month = _month - 1
   if _month = 0 then _month = 1
   gosub setdate
   gosub Getdatetime
   goto Zeit_stellen_Monat1
'_______________

Zeit_stellen_Jahr:
   cls
   Locate 1 , 1
   LCD "Jahr einstellen "
   Locate 2 , 1
   LCD Datum                                                'Date$

Zeit_stellen_Jahr1:
   Jahr = makebcd(_year)                                    'zur einfacheren Darstellung; Tag(1) wird sonst nicht gebraucht
   Locate 2 , 1
   LCD "                "
   Locate 2 , 1
   LCD Hex(Jahr)
   gosub Tastenabfrage

   If Taste = Up then goto Jahrplus
   If Taste = Down then goto Jahrminus
   If Taste = Links then goto Zeit_stellen_Monat
   If Taste = Rechts then goto Zeit_stellen_Std
   If Taste = Ok then goto Zeit_speichern_Ende
   Goto Zeit_stellen_Jahr1

Jahrplus:
   _Year = _Year + 1
   if _Year > 99 then _Year = 0
   gosub setdate
   gosub Getdatetime
   goto Zeit_stellen_Jahr1

Jahrminus:
   _Year = _Year - 1
   if _Year = 255 then _Year = 99
   gosub setdate
   gosub Getdatetime
   goto Zeit_stellen_Jahr1
'__________________

Zeit_stellen_Std:

   cls
   Locate 1 , 1
   LCD "Std einstellen  "
   Locate 2 , 1
   LCD Zeit                                                 'Time$

Zeit_stellen_Std1:
   Stunden = makebcd(_hour)                                 'zur einfacheren Darstellung; Stunden(1) wird sonst nicht gebraucht
   Locate 2 , 1
   LCD "                "
   Locate 2 , 1
   LCD Hex(Stunden)
   gosub Tastenabfrage
   If Taste = Up then goto Stdplus
   If Taste = Down then goto Stdminus
   If Taste = Links then goto Zeit_stellen_Jahr
   If Taste = Rechts then goto Zeit_stellen_Min
   If Taste = Ok then goto Zeit_speichern_Ende
   Goto Zeit_stellen_Std1

Stdplus:
   _hour = _hour + 1
   if _hour = 24 then _hour = 0
   gosub settime
   gosub Getdatetime
   goto Zeit_stellen_Std1

Stdminus:
   _hour = _hour - 1
   if _hour = 255 then _hour = 23
   gosub settime
   gosub Getdatetime
   goto Zeit_stellen_Std1
'__________________

Zeit_stellen_Min:
   cls
   Locate 1 , 1
   LCD "Min einstellen  "
   Locate 2 , 1
   LCD Zeit                                                 'Time$

Zeit_stellen_Min1:
   Minuten = makebcd(_min)                                  'zur einfacheren Darstellung; Tag(1) wird sonst nicht gebraucht
   Locate 2 , 1
   LCD "                "
   Locate 2 , 1
   LCD Hex(Minuten)
   gosub Tastenabfrage
   If Taste = Up then goto Minplus
   If Taste = Down then goto Minminus
   If Taste = Links then goto Zeit_stellen_Std
   If Taste = Rechts then goto Zeit_stellen_Sec
   If Taste = Ok then goto Zeit_speichern_Ende
   Goto Zeit_stellen_Min1

Minplus:
   _min = _min + 1
   if _min > 59 then _min = 0
   gosub settime
   gosub Getdatetime
   goto Zeit_stellen_Min1

Minminus:
   _min = _min - 1
   if _min > 59 then _min = 0
   gosub settime
   gosub Getdatetime
   goto Zeit_stellen_Min1
'_________________

Zeit_stellen_Sec:
   cls
   Locate 1 , 1
   LCD "Sec einstellen  "
   Locate 2 , 1
   LCD Zeit                                                 'Time$

Zeit_stellen_Sec1:
   Sekunden = makebcd(_sec)                                 'zur einfacheren Darstellung; Tag(1) wird sonst nicht gebraucht
   Locate 2 , 1
   LCD "                "
   Locate 2 , 1
   LCD Hex(Sekunden)
   gosub Tastenabfrage
   If Taste = Up then goto Secplus
   If Taste = Down then goto Secminus
   If Taste = Links then goto Zeit_stellen_Min
   If Taste = Rechts then goto Zeit_stellen_Tag
   If Taste = Ok then goto Zeit_speichern_Ende
   Goto Zeit_stellen_Sec1

Secplus:
   _sec = _sec + 1
   if _sec > 59 then _sec = 0
   gosub settime
   gosub Getdatetime
   goto Zeit_stellen_Sec1

Secminus:
   _sec = _sec - 1
   if _sec > 59 then _sec = 0
   gosub settime
   gosub Getdatetime
   goto Zeit_stellen_Sec1


Zeit_speichern_Ende:
   cls
   Locate 1 , 1
   LCD "Zeit gestellt"
'   Locate 2 , 1
'   LCD "Neuprogr. mit OK"
   wait 2
   gosub Ende_Eingabe
Return                                                      'und zurück
'_____________________________________________________________________________


'called from ds1307clock.lib

Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte bcd_sec , Ack
  I2crbyte bcd_min , Ack                                    ' MINUTES
  I2crbyte bcd_hour , Ack                                   ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte bcd_day , Ack                                    ' Day of Month
  I2crbyte bcd_month , Ack                                  ' Month of Year
  I2crbyte bcd_year , Nack                                  ' Year
  I2cstop
  _sec = Makedec(bcd_sec) : _min = Makedec(bcd_min) : _hour = Makedec(bcd_hour)
  _day = Makedec(bcd_day) : _month = Makedec(bcd_month) : _year = Makedec(bcd_year)
  Datum = hex(bcd_day) + "." + hex(bcd_month) + "." + hex(bcd_year)
  Zeit = hex(bcd_hour) + ":" + hex(bcd_min) + ":" + hex(bcd_sec)
Return

Setdate:
  bcd_day = Makebcd(_day) : bcd_month = Makebcd(_month) : bcd_year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte bcd_day                                          ' Send Data to DAY
  I2cwbyte bcd_month                                        ' MONTH
  I2cwbyte bcd_year                                         ' YEAR
  I2cstop
Return

Settime:
  bcd_sec = Makebcd(_sec) : bcd_min = Makebcd(_min) : bcd_hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte bcd_sec                                          ' Send Data to SECONDS
  I2cwbyte bcd_min                                          ' MINUTES
  I2cwbyte bcd_hour                                         ' HOURS
  I2cstop
Return

Set_1sec_tick:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 7                                                ' address in 1307
  I2cwbyte &B11110000                                       ' SQWE = 1 ; 1 sec
  I2cstop
Return


'===========================================================================
'========================  Menue3: Laufdauer Nord  =========================
'===========================================================================

LD_Nord:
   gosub Ende_Eingabe
Return

'===========================================================================
'========================  Menue4: Laufdauer Süd  ==========================
'===========================================================================

LD_Sued:
   gosub Ende_Eingabe
Return


'===========================================================================
'========================  Menue5: Reserve 1  ==============================
'===========================================================================

Reserve1:
   gosub Ende_Eingabe
Return


'===========================================================================
'========================  Menue6: Reserve 2  ==============================
'===========================================================================

Reserve2:
   gosub Ende_Eingabe
Return

 


'*******************************************************************************
'        *************************************************************
'                ********************************************
'                        *************************


 
besucherzaehler-kostenlos.de