'*******************************************************************************
'************ 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ür Wasser ist offen</td></tr>"
else
Status_Haupt = "<td class = 'td' width=300 bgcolor=#F7819F>Hauptventil für Wasser ist geschlossen</td></tr>"
end if
if Nord_aktiv = 1 then
Status_Nord = "<tr><td class = 'td' width=300 bgcolor=#00FF40><b>Bewässerung Nord läuft 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ässerung Nord wartet auf Start</b></td>"
else
Status_Nord = "<tr><td class = 'td' width=300 bgcolor=#F2F2D9><b>Bewässerung Nord ausgeschaltet</b></td>"
end if
end if
if Sued_aktiv = 1 then
Status_Sued = "<td class = 'td' width=300 bgcolor=#00FF40><b>Bewässerung Süd läuft 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ässerung Süd wartet auf Start</b></td></tr>"
else
Status_Sued = "<td class = 'td' width=300 bgcolor=#F2F2D9><b>Bewässerung Süd 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
'*******************************************************************************
' *************************************************************
' ********************************************
' *************************