' WC-*FREI*/BESETZT-Anzeige mit X*8x8-Modulen MAX7218-Matrix
'
' Zeigt nach dem Start einmalig kurz die eigene IP-Adresse und
' den Text "rechts", "links" und "mittig".
' Dann wird endlos mittig angezeigt ...
' - die laufende Uhrzeit HH:HH:SS
' - das Tagesdatum DD/MM/YYYY
' - der deutsche Text für "WC *FREI*" oder "WC BESETZT"
' - der englische Text für "WC OPEN" oder "WC in use"
' Der Text wird durch den Status eines externen Schalters zwischen Pin 33 und GND bestimmt.
' Der Pin ist mit PULLUP auf 3V3 hochgezogen.
' Bei einer längeren Leitungen zum Schalter sollte der Pin 33
' jedoch vorsorglich mit einem 1k-Widerstand gegen 3V3 gezogen werden.
WLOG "START"
' Definition einiger Variablen, die schon beim Start bestimmte Werte haben sollten
VERSION$ = "2.0" 'TextVariable mit der aktuellen Programmversion
'ANZEIGE_ANZAHL = 10 'Anzahl der 8*8 Module
ANZEIGE_ANZAHL = 8 'Anzahl der 8*8 Module
ANZEIGE_PIN = 15 'CS-Pin der Anzeige
ANZEIGE_PIXEL = ANZEIGE_ANZAHL*8 'Anzahl der horizontalen Pixel der Anzeige
CHAR_PIXEL = 6 'Anzahl der Pixel für einen einzelnen Charakter
POSITION = 0 'Variable für die Textposition (von rechts beginnend!)
SEKUNDEN_ZAEHLER = 0 'Variable für Schleifenzähler
SCHALTER_PIN = 33 'Variable mit dem Pin an dem ein Schalter gegen GND hängt
TUERSTATUS = 1 ' 1 = Schalter offen, O = Schalter geschlossen
OFFEN = 1 'Variable für Statusvergleich bei offenem Schalter
GESCHLOSSEN = 0 'Variable für Statusvergleich bei geschlossenem Schalter
TEXT_BESETZT$ = " WC BESETZT" 'Vorbelegung für Besetzt-Text
TEXT_FREI$ = " WC FREI" 'Vorbelegung für Frei-Text
TEXT_BESETZT_EN$ = "! TOILET OCCUPIED" 'Vorbelegung für englischen Besetzt-Text
TEXT_FREI_EN$ = "! TOILET VACANT" 'Vorbelegung für englischen Frei-Text
TEXT_TIMER = 30 'ms Verzögerung für den timer zum Oszillieren des Textes
PIN.MODE SCHALTER_PIN, INPUT, PULLUP 'Einen Pin als Eingang für den Schalter definieren
' Zieht den PIN als INPUT-Pin mit einem Widerstand auf 3V3-Pegel
' Der geschlossene Schalter zieht den Pin dann auf 0 Volt Pegel
'PIN.MODE SCHALTER_PIN, INPUT, PULLDOWN 'Wenn diese Zeile nicht auskommentiert ist,
' simuliert dies einen geschlossenen Schalter mit Widerstand auf GND
' schaltet also testweise den BESETZT-Text an
WLOG "INIT Display ..."
MaxScroll.Setup ANZEIGE_ANZAHL,ANZEIGE_PIN 'Die Anzeige initialisieren
' Beim Start kurz die IP-Adresse anzeigen ------------------------------------------------------
Text$ = Word$(IP$,1) 'Die eigene IP-Adreese ist das erste Wort in dem String IP$
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL 'Anzahl der horizontalen Pixel dieses Textes
POSITION = TEXT_PIXEL 'damit der rechte Teil der Adresse immer zu sehen ist
GOSUB ZEIGE_DEN_TEXT
PAUSE 1500
' Text rechts ausgeben--------------------------------------------------------------------------
TEXT$ = "rechts->"
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL 'Anzahl der horizontalen Pixel dieses Textes
POSITION = TEXT_PIXEL 'Position um Textlänge nach links geschoben
GOSUB ZEIGE_DEN_TEXT
PAUSE 1000
' Text links ausgeben---------------------------------------------------------------------------
TEXT$ = "<-links"
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL 'Anzahl der horizontalen Pixel für diesen Text
POSITION = ANZEIGE_PIXEL 'Position ist gleich Anzahl der Anzeigepixel
GOSUB ZEIGE_DEN_TEXT
PAUSE 1000
' Text mittig ausgeben--------------------------------------------------------------------------
TEXT$ = "mittig"
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL 'Anzahl der horizontalen Pixel für diesen Text
POSITION = (ANZEIGE_PIXEL/2)+(TEXT_PIXEL/2) 'Berechnen der mittigen Ausgabe-Position
GOSUB ZEIGE_DEN_TEXT
PAUSE 1000
' Nun übernimmt der Timer0 einmal pro Sekunde die regelmäßige weitere Regie
PAUSENZEIT = 1000
TIMER1 PAUSENZEIT, HAUPT_ROUTINE 'Der Timer1 ruft nun endlos alle 1000ms das Unterprgm auf
WAIT 'Ab jetzt werden nur noch Hintergrundprozesse abgewickelt;
' hier also der timer0 und das ONHTMLRELOAD
END
' #######################################################################################
' #######################################################################################
' Hinter dem WAIT und END stehen ab hier nur noch Unterprogramme,
' die mit ihrem Namen aus dem obigen Skript-Code aufgerufen werden,
' und die jeweils mit RETURN enden müssen.
' - - - - - - - U N T E R P R O G R A M M E - - - - - - - - - - - -
'==========================================================================
HAUPT_ROUTINE:
'==========================================================================
'Dieses Unterprgm wird einmal pro Sekunde vom TIMER0 aufgerufen.
'Es wird in einem Zeitinterval wechselnd enweder die laufende Zeit, das Datum
'oder eine von einem extrenen Schalter abhängige FREI bzw BESETZT Nachricht angezeigt.
'Dazu wird der Eingangspin mit dem externem Schalter abgefragt.
SEKUNDEN_ZAEHLER = SEKUNDEN_ZAEHLER + 1 'Zähler erhöhen
SELECT CASE SEKUNDEN_ZAEHLER
CASE 1 to 15 'Sekunde 1 bis 3
IF TEXT_STEHT_STILL then TIMER0 TEXT_TIMER ,BEWEGE_DEN_TEXT
TUERSTATUS = PIN(SCHALTER_PIN) 'TUERSTATUS ist nun 0 oder 1, je nach Schalterzustand
IF TUERSTATUS = OFFEN then TEXT$ = TEXT_FREI$ + TEXT_FREI_EN$ 'FREI!!
IF TUERSTATUS = GESCHLOSSEN then TEXT$ = TEXT_BESETZT$ + TEXT_BESETZT_EN$ 'BESETZT!!
TEXT$ = TEXT$ + TEXT$ + TEXT$
MAXSCROLL.TEXT TEXT$
CASE 16 to 19
TIMER0 0
TEXT$ = DATE$
TEXT$ = REPLACE$(TEXT$, "/", ".")
GOSUB ZEIGE_DEN_TEXT_MITTIG
CASE ELSE 'alle anderen Sekunden
TIMER0 0
TEXT$ = TIME$ 'in TEXT$ steht nun die aktuelle Zeit
GOSUB ZEIGE_DEN_TEXT_MITTIG
END SELECT
SEKUNDEN_ZAEHLER = SEKUNDEN_ZAEHLER mod 30 'SEKUNDEN_ZAEHLER BEI x wieder auf 0 setzen
'GOSUB ZEIGE_DEN_TEXT_MITTIG 'Text$ anzeigen
RETURN
'==========================================================================
ZEIGE_DEN_TEXT:
'==========================================================================
MAXSCROLL.PRINT TEXT$ 'hier geht TEXT$ nur in den Puffer
MAXSCROLL.SHOW POSITION 'Erst jetzt wird der Puffer an der Position angezeigt
TEXT_STEHT_STILL = 1 ' Variable zeigt ob sich Text schon bewegt soll
WLOG TEXT$ 'Zusätzlich nur zur Rückmeldung in der Entwicklungsoberfläche
RETURN 'Zurück zur aufrufenden Zeile
'==========================================================================
ZEIGE_DEN_TEXT_MITTIG:
'==========================================================================
TEXT_PIXEL = Len(TEXT$)*CHAR_PIXEL 'Anzahl der horizontalen Pixel für diesen Text
POSITION = (ANZEIGE_PIXEL/2)+(TEXT_PIXEL/2) 'Berechnen der mittigen Ausgabe-Position
GOSUB ZEIGE_DEN_TEXT
RETURN
'==========================================================================
BEWEGE_DEN_TEXT:
'==========================================================================
'MAXSCROLL.OSCILLATE
MAXSCROLL.scroll
TEXT_STEHT_STILL = 0
RETURN
'----- last line not empty to avoid problems -----