2021 |
Ergänzungen zum Buch Messen und Steuern mit Smartphone und Tablet Ralf Beesner zeigt an anderer Stelle wie er den Videotext der ARD auf einem Linux-Computer in Morse-Töne wandelt. Die Idee kann man auch auf einem kleinen ESP8266 in C umsetzen. Mit einer LED-Matrix lasssen sich die Zeichen optional zusätzlich mitlesen. Das übt womöglich das interessierte Anfänger-Ohr. In einer Zeit als es noch kein https:// gab, war die Abfrage von Internetseiten einfach, wie der Beitrag aus dieser Zeit zeigt. Solche verschlüsselten Seiten scheitern unter MicroPython und ESP-Basic noch, so dass auf die Sprache C zurück gefriffen werden muss. Diese Sprache gestattet den Zugriff auf Seiten, die mit https:// beginnen. Allerdings reicht es nicht mehr den WiFiClient in einen WiFiClientSecure zu wandeln. Es ist vielmehr notwendig den SHA1 Fingerabdruck der betreffenden Internetseite zu kennen. Wie man das Zertifikat über den Browser kopieren und in den eigenen Quelltext einfügen kann zeigt die Hobby-Seite arduino.projekte.info sehr ausführlich in vielen Bildern. Das Programm besteht grob aus den zwei Teilen: Lesen der Internetseite und Ausgabe der entsprechend umgewandelten Texte. Nach der getrennten Initialisierung findet man folgende konkrete Routinen:
Das dargestellte Programm verwendet eine 8x8-LED-Matrix und einen passiven Piezo-Beeper an den Anschlüssen 2 und 15, Dabei dient GPIO 2 als Masse, da mit Matrix-Display der einzige GND-Pin bereits belegt ist. Die Software schaltet dazu Pin 2 auf Masse. Als Matrix dient hier ein MAX7219-Display, wie an anderer Stelle schon benutzt, mit vier Anzeigen, wobei nur die rechte Anzeige das Zeichen darstellt. Der CS-Pin ist frei wählbar, Die SPI-Anschlüsse GPIO 13/14 sind von der Hardware vorgegeben.
Das Listing morst in der hier dargestellten Form lediglich die Überschriften, da die Meldungen doch einen recht langen Durchgang zur Folge hätten. Unterhalb des Listings befindet sich der Link zum reinen Text und zu weiteren Varianten. Programm-Listing #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> const char* ssid = "FRITZ!Box oder so"; const char* password = "Mein Passwort"; WiFiClientSecure client; char fingerprint[]= "2B 19 56 BA 6B DB 1B 6E 7E 56 C8 4A 24 E1 9C BC FD 2D 66 F8"; char* host = "www.ard-text.de"; int httpsPort = 443; String pages[100];int pages_cnt=0; //-------------------------------------------------- String morseArray[63] = {"-.-.--", "", "", "...-..-", "", ".-...", ".----.", "-.--.", "-.--.-", "", ".-.-.", "--..--", "-....-", ".-.-.-", "-..-.", "-----",".----", "..---", "...--","....-", ".....", "-....", "--...", "---..", "----.", "---...", "-.-.-.", "", "-...-", "", "..--..", ".--.-.", ".-", "-...", "-.-.","-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--","--..", "", "", "", "", "..--.-"}; int morsePin = 15; bool morsePinInvert = false; int morsePause = 80; //-------------------------------------------------- #include "simple_matrix.h" // Import the library simpleMatrix disp(4,true); // gpio cs =4, mosi=13, clk=14 spi; true: mirrored //-------------------------------------------------- boolean getTextAndMorse(int page) {if(!client.connect(host,httpsPort)) {Serial.println("keine Verbindung");return(false);} String url = "/mobil/"+String(page); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: HF-DetectorESP8266\r\n" + "Connection: close\r\n\r\n"); client.setTimeout(500); while (client.connected()) {String line = client.readStringUntil('\n'); if (line == "\r")break; } String line; // Seiten 104-129 und 135-149 long t=millis(); do //SCHLAGZEILE holen und formatieren {line= client.readStringUntil('\n'); if(line.endsWith("<h2>Seite nicht vorhanden!</h2>")) return(false); if(millis()-t>5000)return(false); //Serial.println(millis()-t); }while(!line.endsWith("</b></h2>")); line.trim(); line.replace("<h2><b>",""); line.replace("</b></h2>",""); client.stop(); if(line!=pages[pages_cnt]) //BREAKING NEWS new order {Serial.print(page);Serial.println(" "+line+" #"+ pages[pages_cnt]); pages[pages_cnt]=line; morse("!!!!!"+String(page)+" "+line); } else {Serial.print(page);Serial.println(" ALT "+line); morse(" e "); } pages_cnt++; //-------------------------------------------------- //morse(String(page)+" "+line); //-------------------------------------------------- return(true); } void setup() { //-------------------------------------------------- pinMode(morsePin, OUTPUT); // pin as output //-------------------------------------------------- disp.begin(); disp.setIntensity(0x01); //-------------------------------------------------- pinMode(2, OUTPUT);digitalWrite(2,0); Serial.begin(115200); Serial.print("\n\nverbinde mit "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid,password); while (WiFi.status() != WL_CONNECTED) {delay(500);digitalWrite(morsePin,!digitalRead(morsePin)); Serial.print("."); } Serial.print("\nIP: ");Serial.println(WiFi.localIP()); Serial.println("Request: https;//www.ard-text.de"); client.setFingerprint(fingerprint); analogWriteFreq(440); WiFi.printDiag(Serial); for(int i=0;i<100;i++)pages[i]="LEER"; } void morse(String TextZeile) {TextZeile.toUpperCase(); TextZeile.replace("Ä","AE");TextZeile.replace("ä","AE"); TextZeile.replace("Ü","UE");TextZeile.replace("ü","UE"); TextZeile.replace("Ö","OE");TextZeile.replace("ö","OE"); TextZeile.replace("ß","SS"); for(int i = 0; i <= TextZeile.length(); i++) {Serial.print(TextZeile[i]); //-------------------------------------------------- char s[2]=" "; disp.print(s,4*8-6);delay(20); s[0]=TextZeile.charAt(i); disp.print(s,4*8-6); //-------------------------------------------------- if(TextZeile[i]>=33 && TextZeile[i]<=95) {String morseZeile = morseArray[TextZeile[i]-33]; for(int x = 0; x <= morseZeile.length(); x++) StrichPunkt(morseZeile[x]); delay(morsePause*3); } if (TextZeile[i]==' ') delay(morsePause*4); } delay(morsePause*14); Serial.println(); } void StrichPunkt(byte sendChar) {if(sendChar=='.') // punkt {analogWrite (morsePin, 128*!morsePinInvert); delay(morsePause); analogWrite (morsePin, 128*morsePinInvert); delay(morsePause); } if(sendChar=='-') // strich {analogWrite (morsePin, 128*!morsePinInvert); delay(morsePause*3); analogWrite (morsePin, 128*morsePinInvert); delay(morsePause); } } void loop() {pages_cnt=0; morse("cqcq"); int page=104; while(getTextAndMorse(page++)); page=136; while(getTextAndMorse(page++)); morse("qrt"); delay(30000); } Toolchain: Arduino-IDE 1.8.16 unter 32Bit Zorin, ESP8266 Arduino Core V 2.7.4, Simple LED Matrix Version 1.4.1 http://arduino.esp8266.com/stable/package_esp8266com_index.json, WittyCloud ESP8266 Hier der Quelltext ohne Matrix. Für Besitzer einer LED-Matrix mit 8x8 LED und dem Baustein MAX7219 ist eine Version verfügbar, die das gemorste Zeichen auch auf dem Display darstellt. Damit lassen sich die einzelnen Strichpunkte quasi mitlesen oder überprüfen. Hier der reine Quelltext mit zusätzlicher Matrix-Ausgabe. Falls nur neue Meldungen interessieren, folgt hier eine Version mit Matrix, die alte und neue Meldungen auf einer Text-Seite vergleicht und nur diese geänderte Nachricht ausgibt. Bleiben die Meldungen identischen, erfolgt nur die Ausgabe eines Punktes in Form eines '.' bzw. "E". Hier der reine Quelltext mit zusätzlicher Matrix-Ausgabe und Test auf neue Meldungen. Aktualisierter Quelltext für 4x8x8-Matrix-Ausgabe mit Anpassungen vom Juni 2022. |
||||||||||||||||||||||||||||||||||||||||||
. |
Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt |