'******************************************************************************* '************ Regnersteuerung18_V0.6 *************** '******************************************************************************* 'name : Regnersteuerung18_V0.6 '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.6" '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 = "" Const Head2 = "" Const Head3 = "" if Power_K1 = 1 then Status_Power = "" else Status_Power = "" end if if Haupt_K2 = 1 then Status_Haupt = "" else Status_Haupt = "" end if if Nord_aktiv = 1 then Status_Nord = "" else if Start_Nord_verz = 1 then Status_Nord = "" else Status_Nord = "" end if end if if Sued_aktiv = 1 then Status_Sued = "" else if Start_Sued_verz = 1 then Status_Sued = "" else Status_Sued = "" end if End if Sicherheit_min = Notbremse_timer / 60 Status_NT = "" print Head1 ; Head2 ; Head3 ; Status_Power ; Status_Haupt ; Status_Nord ; Status_Sued ; Status_NT ; "
Zustand Steuerung:
230V eingeschaltet
230V ausgeschaltetHauptventil für Wasser ist offen
Hauptventil für Wasser ist geschlossen
Bewässerung Nord läuft noch " + str(Restlaufzeit_N) + " min.
Bewässerung Nord wartet auf Start
Bewässerung Nord ausgeschaltetBewässerung Süd läuft noch " + str(Restlaufzeit_S) + " min.
Bewässerung Süd wartet auf Start
Bewässerung Süd ausgeschaltet
Sicherheitstimer, Ausschalten erfolgt nach " + str(Sicherheit_min) + " min.
" ; print "
.
" '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 '******************************************************************************* ' ************************************************************* ' ******************************************** ' *************************