' 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 ...
' - für 3 Sekunden die laufende Uhrzeit
' - für 2 Sekunden der Text "WC *FREI*" oder "WC BESETZT"
' je nach dem Status eines externen Schalters zwischen Pin 33 und GND.
' 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 = 23 '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
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
TIMER0 PAUSENZEIT, HAUPT_ROUTINE 'Der Timer0 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.
'Bei den ersten drei Aufrufen soll die aktuelle Zeit aufgerufen werden.
'Dann soll zwei Sekunden lang der Frei oder der Besetzt-Text angezeigt werden.
'Dazu wird der Eingangspin mit dem externem Schalter abgefragt.
SEKUNDEN_ZAEHLER = SEKUNDEN_ZAEHLER + 1'Zähler erhöhen
SELECT CASE SEKUNDEN_ZAEHLER
CASE 1, 2, 3 'Sekunde 1 bis 3:
TEXT$ = TIME$ 'in TEXT$ steht nun die aktuelle Zeit
CASE 4 , 5 'Sekunde 4 und 5
TUERSTATUS = PIN(SCHALTER_PIN) 'TUERSTATUS ist nun 0 oder 1, je nach Schalterzustand
IF TUERSTATUS = OFFEN then TEXT$ = TEXT_FREI$ 'FREI!!
IF TUERSTATUS = GESCHLOSSEN then TEXT$ = TEXT_BESETZT$ 'BESETZT!!
END SELECT
SEKUNDEN_ZAEHLER = SEKUNDEN_ZAEHLER mod 5 'SEKUNDEN_ZAEHLER BEI 5 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
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