2023
HOME
Diese Seite ist veraltet. Die aktualisierte Version liefert dieser Link.
Raspberry PicoW espBASIC on RP2040 - im Mai '23
WiFi-BASIC-News-Ticker
25 Zeilen auf RP PicoW


Schrittmotor als Genarator

Mit dem Arduino Core für den Raspberry Pi Pico und einigen Anpassungen an den offenen Quellen von ESP8266BASIC kann ein Raspberry Pi PICO W auch mit wenigen Zeilen die Schlagzeilen des ARD-Textes aka Videotext auf einem Matrix-Display als Laufband anzeigen.

Schrittmotor als GenaratorAn anderen Stellen auf dieser Seite steht unter dem Titel ARD-Text-Morser der Quelltext zur Ausgabe der Nachrichten aus dieser Quelle mit Morsetönen; einmal als RFO-BASIC-Programm und einmal als Sketch in Arduino C für den ESP8266. Hier folgt eine Kombination in Form eines espBasic on RP2040-Listings zur Dekodierung und Ansteuerung der Matrix, welches wiederum auf einen in Arduino-Pico-C verfassten und teilweise portierten Quellcode von ESP8266Basic zurückgreift. Der Anwender kann per Drag & Drop die weiter unten im temporären Arbeits-Archiv gepackte *.uf2-Software auf das Laufwerk des Pico W ziehen. Der Pico startet dann den BASIC-Interpreter, welches eine Teilmenge des von mmiscool geschaffenem ESP8266Basic ist, der auch in den Büchern [3] und [4] dieser Homepage verwendet wurde und wird. Die WebSocket-Funktionalität des ESP8266-Originals konnte bisher in diesem Monat für den hier verwendeten Pico W nicht implementiert werden.

Als Proof of Concept soll dieser Laufschrift-Nachrichtenticker mit den hierfür erweiterten Funktionen des BASIC für den Pico W einer Funktion zugeführt werden.

Die zur Zeit lauffähige Teilmenge erlaubt die Ansteuerung der LED-Matrix mit einfachen BASIC-Befehlen, die schon im Beitrag WiFi-LED Dot Matrix mit MAX7219 Verwendung fand. Zusätzlich ist die Funktion wgets() implementiert, die den Inhalt über https:// einer Seite lädt.

Ein einfacher Test ohne die LED-Matrix zeigt, ob die Abfrage der Seite https://www.ard-text.de/mobil/104 und folgende funktioniert. Wie bei der Originalversion wget(), entfällt der Vorsatz https:// und der Parameter in der Klammer ist die URL als Zeichenkette. Der Aufruf

s = wgets("www.ard-text.de/mobil/104")

liefert bei Erfolg den Quelltext der HTML-Seite in die Zeichenkette s. Ein Ausschnitt der etwa 16k langen Seite auf etwa 1/3 der Gesamtinhalts hat etwa das folgende Aussehen:

<div class="master" style="padding-top: 110px;">
<h1 class="sectionTitle">tagesschau: Nachrichten </h1>
<h2>Bundestag soll Einsatz zustimmen</h2> <div class='std'> <p>Auf Antrag der Bundesregierung ....

Die Suche der Zeichenkette "<h2> zeigt auf die gesuchte Überschrift der gerade aktuellsten Meldung im ARD-Text und ein "</h2>" schließt diese Überschrift ab.

Mit den vertrauten BASIC-Funktionen Instr, Mid, und Replace lassen sich solche Zeichenketten finden und bearbeiten. Auf diese Art und Weise lassen sich die ersten Schlagzeilen des Tages mit Print seriell ausgeben. Aufgrund der noch fehlenden WebSockets klappt die Ausgabe im Browser nur nach neuem Laden der Seite.

Beispiel-Meldungen vom 26.04.2023 um 11:00 Uhr:

  • Bundestag soll Einsatz zustimmen
  • Bundeswehr beendet Rettungsflüge
  • Schiff mit 1700 Geflüchteten
  • Russische Flugzeuge über Ostsee
  • Neue Warnstreiks im Nahverkehr
  • Koalitionsvertrag für Berlin
  • Deutsche trinken und rauchen viel
  • Wirtschaft soll leicht wachsen
  • Reform für Medikamentenversorgung
  • Erneut Massenproteste in Israel
  • Taliban töten IS-Drahtzieher
  • Tabakkonzern zahlt Rekordstrafe
  • ----------------------------------

Wer solche Meldungen wirklich lesen will, kann das folgende Listing versuchen:

p = 104
u = "www.ard-text.de/mobil/"
h1 = "<h2>"
h2 = "</h2>"
h3 = "Seite nicht vorhanden!"
timer 4000,[tm]
wait

[tm]
s = wgets(u & str(p))
l = len(s)
if l <> 0 then p = p + 1
a = instr(s,h1)
b = instr(s,h2)
c = mid(s,a,b-a)
c = replace(c,h1,"")
c = replace(c,h2,"")
if instr(c,h3) = 0 && len(c)>0 then
	print c
else
	p = 104
	print "----------------------------------"
	cls
end if
wait

Das Minimum der Schlagzeilenanzeige überprüft mittels "Seite nicht vorhanden!", ob weitere Seiten folgen, sonst wird wieder bei Seite 104 begonnen. Ein Timer ruft über das Label [tm] alle vier Sekunden eine Seite auf.

Um die Schlagzeile auf der LED-Matrix als Laufschrift zu zeigen reicht nach einer möglichen Initialisierung der Aufruf matrix.print(c,20,1,0). Diese Anweisung erzeugt eine 20 ms verzögerte Laufschrift beginnend bei Position 1 von rechts nach links. Die Matrix-Anzeige mit ihren vier 8x8 LED-Segmenten wird per SPI-angesteuert. In diesem Fall sind das die Verbindungen

LED Matrix

Pin Pico W

GPIO Pico W

Vcc

40

Gnd

38

Din

10

7

Cs

7

5

Clk

9

6

Diese BASIC-Version ist in der Lage mit einer einzigen Zeile die Temperatur auf der Matrix-Anzeige darzustellen:

matrix.print(str(io(ai,3)),0,2)

Dabei liefert die I/O-Abfrage io(ai,3) die Temperatur im RP2040 über ADC 3 als Fließpunktzahl, die mittels str als Zeichenkette der Matrix-Ausgabe weitergegeben wird, die diese ohne Scroll (0) ab Position x = 2 darstellt. Wird aus der 0 eine 30, tickert der Wert mit allen Nachkomastellen nach links. Legt man die x-Position auf 4*8 oder 32, so scrollt die Temperatur rechts herein und links heraus - alles in einer Programmzeile.

Wer ESP8266BASIC kennt, kann den Pico per USB mit dem PC bei gedrücktem BOOTSEL-Button des Boards verbinden. Durch das Kopieren der uf2-Datei auf das nun erscheinende Laufwerk wird das Basic-Betriebssystem übertragen. Nach Abschluss der Übertragung meldet sich der Pico als Laufwerk ab und die PicoW-Variante steht zur Verfügung. Der Flash-Prozess ist damit abgeschlossen.

Die PicoW-Variante der hier vorliegenden Arbeits-Version von PicoW ESP8266 BASIC und der Testaufbau zeigt im Zusammenspiel mit der WiFi-Hardware des PicoW an einigen Stellen eigenartiges Verhalten, wodurch es erforderlich erscheint entsprechende Maßnahmen zu ergreifen, damit der PicoW nicht plötzlich die Verbindung zum Netz und damit zur Nachrichtenquelle und auch zum Benutzer dauerhaft unterbricht. Auch die https-Gegenstelle verweigert ab und zu die Verbindung, von Wackelkontakten der LED-Matrix-Verbindung ganz abgesehen. Das nachfolgende Programm in diesem BASIC läuft ununterbrochen 24/7. Dabei erfolgen Überprüfungen bei der Sprungmarke [dbg] hinsichtlich der IP, der Länge der empfangenen Daten und der Laufzeit. Ein Zwangs-Reset erfolgt in der 6. Minute einer Stunde und hebelt dadurch den Ticker möglicherweise wieder ins Gleis.

Um eine typische Anzeige mit Uhrzeit und Temperatur zu erzeugen, liefert das Unterprogramm [tmp] die Chip-Temperatur des PicoW mit einem um 5 Grad reduzuiertem Wert, um etwa der Raumtemperatur zu entsprechen. Diese Anzeige kaschiert auch den Reboot in der 6. Minute.

Die Schlagzeilen des Tickers kommen aus dem Internet, so dass ein Pi PicoW zwingend über einen Router diesen Zugang erhält. Zu Beginn kennt der PicoW üblicherweise keinen Router und spannt einen eigenen HotSpot (Access-Point) auf, der mit der Bezeichnung PicoW beginnt. Durch Verbindung mit diesem WiFi-Netz ist das Basic über die IP 192.168.42.1 erreichbar. In den Optionen bzw. Settings kann nun der gewünschte Router mit Password eingetragen werden. Mit Save übernimmt Basic die Einstellungen für den nächsten Start (Restart). Details findet man auf der Webseite von ESP8266Basic oder im Buch MSR mit WiFi und ESPBASIC oder MSR mit Smartphone und Tablet.

Um einen 4x8x8-LED-MATRIX-Ticker dieser Art zu betreiben sind folgende Schritte erforderlich:

  • Download der uf2-Datei (568K-Zip) und flashen des Basic mit BOOTSEL-Button, wie oben beschrieben. Der Pico sucht anschließend einen Router, dabei blinkt die eingebaute LED bis zu 20 mal kurz im Sekundentakt. Da zu Beginn kein Router gefunden werden kann, startet der PicoW im AP-Modus.
  • Anmelden bei PicoW AP ohne Passwort.
  • In einem Browser die IP 192.168.42.1 aufrufen und in den Settings den eigenen Router eintragen. Mit Save sichern. Mit Reset den PicoW neu starten.
  • Sobald der Router gefunden wird, stoppt die Blinkfolge und das Basic-Betriebssystem ist nun unter der vom Router vergebenen IP im lokalen Netz erreichbar.

Die serielle Ausgabe zeigt die lokale IP z. B.

...
4 5 6 7
Connected to FRITZ!Box Fon WLAN 9720
IP address : 192.168.178.59
WIFIname
WIFIpass
....

Die erweiterten Zeilen des News-Tickers sorgen dafür, dass die Schlagzeilen des ARD-Textes in einer Laufschrift zur Anzeige kommen. Diese Zeilen sind über das Menü EDIT in ein leeres Programm-Feld zu kopieren und als default.bas zu speichern. Das Basic-Programm soll später nach einem Neustart des PicoW automatisch vom Basic-Betriebssystem gestartet werden. Nach Save kann mit RUN das Ticker-Programm gestartet und getestet werden. Wenn alles zur Zufriedenheit funktioniert kann der Autostart von default.bas in den SETTINGS per Haken eingeschaltet werden. Nach einem Reset startet nun der News-Ticker automatisch:

  • PowerUp des PicoW: Kurzblinken während der Routersuche
  • Basic lädt default.bas und startet dies nach 30 Sekunden nach Bootup (Wechselblinken)
  • Durch das Drücken von BOOTSEL kann der Autostart im Fehlerfall abgebrochen werden
  • Die Temperatur wird angezeigt
  • Die aktuellen Meldungen laufen mit vorangestellter Uhrzeit ein
  • Am Ende eines Durchlaufs erscheint die Minuten:Sekunden-Anzeige für 10 Sekunden
  • Zu jeder 6. Minute erfolgt ein Zwangs-Reset

Das erweiterte PicoW-ESP-BASIC-Programm:

matrix.brightness(5)
'matrix.setup(5,1) 'CS,180
gosub [tmp]
p = 104
u = "www.ard-text.de/mobil/"
h1 = "<h2>"
h2 = "</h2>"
h3 = "Seite nicht vorhanden!"
timer 7000,[tm]
wait

[tm]
h1 = "<h2>"
h2 = "</h2>"
s = wgets(u & str(p))
l = len(s)
gosub [dbg]
if l <> 0 then p = p + 1
a = instr(s,h1)
b = instr(s,h2)
c = mid(s,a,b-a)
c = replace(c,h1,"")
c = replace(c,h2,"")
if instr(c,h3) = 0 && len(c)>0 then
	print c
	c = time("hour:min") & "  " & c
	matrix.print(c,20,1,0)
else
 	p = 104
	print "----------------------------------"
	cls
	matrix.print("ARD-TEXT-TICKER PI PICO ESP BASIC " & ip(),15,32,0)
	matrix.print(time("hour:min"),0,2)
	timer 1000,[sec]
	i = 1
end if
wait

[sec]
t$ = time("min:sec")
matrix.print(t$,0,2)
i = i + 1
if i < 10 then 
	wait
end if
gosub [tmp]
timer 7000,[tm]
wait

[dbg]
'192.168.178.59 STA vs. 192.168.42.1 AP
if (val(word(ip(),4,".")) <=1) then
	wifi.connect("FRITZ!Box...", "0123456789")
end if
'matrix.print(str(l),0,2)
matrix.print(time("hour:min"),0,2)
if time("min") = "06" or (s = "connection failed") then
	gosub [tmp]
	reboot
end if 
delay 500
return

[tmp]
t = int((io(ai,3)-5)*10)/10
matrix.print(replace(str(t)&"C",".",","),0,2)
return

Dieser Basic-Test berücksichtigt die Eigenart, dass der Pi PicoW ab und zu die Verbindung zum Router nicht wieder aufnimmt und somit nur noch zu Fuß erreichbar ist. Das Basic überprüft dies und leitet bei einer Unterbrechung eine erneute Verbindung ein. Sollte dem Basic-Interpreter im PicoW die Kontrolle länger als acht Sekunden entzogen werden, so erfolgt ein Zwangs-Reset (Laufschrift-Dauer ist zu beachten). Dieses Verfahren soll dafür sorgen, dass ein PicoW auf jeden Fall erreichbar bleibt, solange ein Router aktiv ist. Damit bleiben auch die Schlagzeilen über das Internet auf dem aktuellen Stand. Eine nicht ausreichend stabile Spannungs-Versorgung kann beim PicoW zu einer Endlos-Boot-Schleife führen.

Mittels der uf2-Datei kann ein RP PicoW auf einfachste Weise viele Dinge aus den ersten zwei Kapiteln dieses Buches ausführen. Die Programmierung in BASIC über einen Browser auf einem beliebigen Gerät ist nun auch auf dieser preiswerten Hardware möglich. Das Basic basiert auf Branch 3 der ESP8266-Variante und unterstützt zur Zeit nur eine geringe Teilmenge der Befehle und Funktionen. Insbesondere die vielen Hardware-Biliotheken aus Kapitel 3 sind noch nicht verfügbar.

Das 2019 erschienene Messen, Steuern und Regeln mit WiFi und ESP-BASIC zeigt was mit dieser Sprache alles möglich ist.

Pi PicoW als Rheinturmuhr mit Neopixel (PicoW-ESP-BASIC)
Pi PicoW als PC-Interface für Compact Red Needle
Pi PicoW als Bluertooth-Interface für Compact Red Needle


												

Compact Red Needle
MSR mit Arduino & Compact
Mehr Software

.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt