Newsreader auf Matrixdisplay

In this project, the time, date and the latest headlines are to be displayed as a ticker on an LED matrix. Date and time are to be updated from a time server.
The headlines are received from a so called RSS feed. This is a service offered by various web servers such as tagesschau.de. This service uses http or https as transmission protocol, but the data is not delivered in HTML format as usual, but as XML, i.e. without layout information.

Here is an example of how such XML data looks like:


<rss version="2.0">
<channel>
    <title>tagesschau.de - Die Nachrichten der ARD</title>
    <link>http://www.tagesschau.de</link>
    <description>tagesschau.de</description>
    <language>de</language>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>30</ttl>
    <item>
        <title>
            Spahn hofft auf Corona-Impfstoff für Kinder bis Sommer
        </title>
        <link>
            https://www.tagesschau.de/inland/coronavirus-impfung-kinder-101.html
        </link>
        <description>
Der Impfplan für Deutschland steht - doch gerade für die Jüngsten fehlt bisher ein Wirkstoff. Bundesgesundheitsminister Spahn setzt darauf, dass bis zum Sommer auch ein Vakzin für Kinder und Jugendliche entwickelt wird.
        </description>
        <guid>
            https://www.tagesschau.de/inland/coronavirus-impfung-kinder-101.html
        </guid>
        <category/>
    </item>
    <item>
        <title>
            Impfstoffe in der EU: Warum die Verhandlungen so lange stockten
        </title>


The main block has the XML tag <channel>. Some general information is followed by the individual headlines, each in a block with XML tag <item>. Within this block there is a block with the XML tag <title>. The content of this block is what we want to display.

Hardware 

Number Component Note
1 ESP32 D1 Mini NodeMCU
1 MAX7219 8x32 4 in 1 Dot Matrix LED
1 Lochrasterplatte 4x6 cm
1 5-polige abgewinkelte Stiftleiste liegt Matrix bei
2 Federleiste 8-polig für Controller
1 5-poliges Verbindungskabel Buchse zu Buchse liegt Matrix bei
4 Gehäuseteile aus dem 3-D Drucker, Schraube 2.2 mm zur Befestigung des Displays


Circuit

The LED matrix is simply connected to the SPI bus of the ESP32. The data output of the ESP32 MOSI (GPIO23) is connected to DIN of the matrix. The clock output of the ESP32 CLK (GPIO19) is connected to the clock input of the matrix. The GPIO16 of the ESP32 is used as chip select, it is connected to the CS connector of the matrix. The matrix is supplied with 5V, this is no problem for the ESP32, because all connectors used here are used as output and therefore cannot get higher voltages from the matrix.


Program


In addition to the ESP32 package, you need four libraries.

We use the library TinyXML to extract the desired information from the received XML data. The library has only three functions.

  • void init (uint8_t* buffer, uint16_t maxbuflen, XMLcallback XMLcb);
    This function is called in the setup function. The parameter buffer points to a byte array to hold temporary data, the parameter maxbuflen specifies the size of the buffer. The parameter XMLcallback points to a callback function

    void XML_callback(uint8_t statusflags, char* tagName, uint16_t tagNameLen, char* data, uint16_t dataLen)

    which is called whenever an XML element has been completely processed. The statusflags parameter specifies which data is provided. Since we are interested in the content of an XML tag, we will only use the status STATUS_TAG_TEXT. The tagName parameter points to a character array containing the full XML path to the item. For the title of an item of the newsfeed, this is then the path "/rss/channel/item/title". The tagNameLen parameter returns the length of the path. The parameter data also points to a character array containing the data. The last parameter dataLen returns the size of the data array.

  • void reset();
    This function resets all internal pointers. It should always be called before new XML data is read in.

  • void processChar(uint8_t ch);
    This function sends one character of the XML data to be processed to the XML parser. This function must be called sequentially for each character received. If the transmitted character leads to the completion of an XML block, the callback function is called with the corresponding data.

The LG_Matrix_Print library is used to display strings on the LED matrix. The following functions are used in the sketch:
  • void setEnabled(bool enabled);
     Access to the LED matrix is enabled or disabled.

  • void setIntensity(uint8_t level);
    This function changes the brightness of the display. Values between 0 and 15 are allowed. Normally 1 is quite sufficient

  • void display();
    The content of the display memory is transferred to the matrix and thus visible.

  • void clear()
    The display memory is cleared.

  • int printText(int start, String text, boolean isUTF8 = true);
    This function converts the string specified in the text parameter, starting with the nth character, into the corresponding bit pattern in the display memory using the internal character set. The character at which the output should start is specified in the start parameter. The optional parameter isUTF8 switches the internal code converter on or off.

  • void ticker(String message, uint16_t wait);
    This function makes it possible to implement a ticker very easily. The parameter message points to a string containing the text to be displayed. The second parameter wait specifies the time in milliseconds to wait before the text is advanced by one pixel. The library takes care of everything else.

  • boolean updateTicker();
    This function must be called in the loop function to update the ticker.

The library contains other functions, but they are not used in this sketch.

The WebConfig library is used to configure the WLAN access data as well as other settings via a browser. The configuration is stored in the flash file system SPIFFS and remains even after the microcontroller is switched off. A detailed description can be found at: 
https://github.com/GerLech/WebConfig/blob/master/README.md or in my book Smarthome.

The WebConfig library requires the Arduino_JSON library, so this must also be installed, but is not included in the sketch.

The sketch

#include <LG_Matrix_Print.h> //Bibliothek für die Matrixanzeige
#include <HTTPClient.h>
//Web Client für den Empfang des RSS-Feeds
#include <SPIFFS.h> //Filesystem zum Speichern der Konfiguration
#include <WebServer.h> //Webserver für die Konfiguration
#include <ESPmDNS.h> //Multicast DNS für Namensauflösung
#include <WebConfig.h>
//Bibliothek zur Konfiguration über eine Webseite
#include <TinyXML.h> //XML-Interpreter zum Lesen des RSS-Feed

#define LEDMATRIX_CS_PIN 16 //CS Pin der LED Matrix

// Anzahl der 8x8 LED Segmente
#define LEDMATRIX_SEGMENTS 4

// Timeout zum Lesen des RSS-Feed in Sekunden
#define READ_TIMEOUT 10

//Prameter für das Konfigurations-Formular
String params = "["
  "{"
  "'name':'ssid',"
  "'label':'Name des WLAN',""'type':"+String(INPUTTEXT)+","
  "'default':''"
  "},"
  "{"
  "'name':'pwd',"
  "'label':'WLAN Passwort',"
  "'type':"+String(INPUTPASSWORD)+","
  "'default':''"
  "},"
  "{"
  "'name':'rssUrl',"
  "'label':'RSS Feed URL',"
  "'type':"+String(INPUTTEXT)+","
  "'default':''"
  "},"
  "{"
  "'name':'ntp',"
  "'label':'NTP Server',"
  "'type':"+String(INPUTTEXT)+","
  "'default':'de.pool.ntp.org'"
  "},"
  "{"
  "'name':'maxNews',"
  "'label':'Schlagzeilen',"
  "'type':"+String(INPUTNUMBER)+","
  "'min':1,'max':10,"
  "'default':'1'"
  "},"
  "{"
  "'name':'intens',"
  "'label':'Helligkeit',"
  "'type':"+String(INPUTNUMBER)+","
  "'min':1,'max':15,"
  "'default':'1'"
  "},"
  "{"
  "'name':'disptime',"
  "'label':'Anzeigedauer (s)',"
  "'type':"+String(INPUTNUMBER)+","
  "'min':1,'max':30,"
  "'default':'5'"
  "}"
  "]";

//Web Server Instanz
WebServer server;
//Web Konfigurations Instanz
WebConfig conf;
//LED Matrix Instanz
LG_Matrix_Print lmd(LEDMATRIX_SEGMENTS, LEDMATRIX_CS_PIN);
//XML Interpreter Instanz
TinyXML xml;

//Globale Variablen
uint32_t last = 0; //Zeit der letzten Aktion in ms
uint8_t buffer[2000]; //Buffer für XML-Interpreter
String news[10]; //Speicher für Nachrichten (Max. 10)
uint8_t newsCnt = 0; //Anzahl der aktuellen Nachrichten im Speicher
uint8_t curNews = 0; //Index der gerade angezeigten Nachricht
uint8_t dispMode = 0; //Art der Anzeige 0=Zeit, 1=Datum, 2=News;

//Diese Funktion wird vom XML-Interpreter aufgerufen,
//wenn ein XML-Tag gelesen wurde
//tagName enthält den vollständigen XML-Pfad des Tags,
//data den Inhalt des Tags
void XML_callback(uint8_t statusflags, char* tagName, uint16_t tagNameLen, char* data, uint16_t dataLen) {
  if (statusflags & STATUS_TAG_TEXT) {
    //Serial.println(tagName);
    //wenn wir einen Titel-Tag finden,
    //und die maximale Anzahl der Meldungen noch
    //nicht erreicht ist, wird die Meldung gespeichert
    //und der Zähler erhöht
    if (strcasecmp(tagName,"/rss/channel/item/title")==0) {
      data[dataLen] = '\0';
      if (newsCnt < conf.getInt("maxNews")) {
      //Die maximale Anzahl der Nachrichten wird
      //aus der Konfiguration gelesen
        news[newsCnt] = data;
        newsCnt++;
      }
    }
  }
}

//WLAN Verbindung initialisieren
boolean initWiFi() {
  boolean connected = false;
  WiFi.mode(WIFI_STA);
  Serial.print("Verbindung zu ");
  Serial.print(conf.values[0]);
  Serial.println(" herstellen");
  if (conf.values[0] != "") {
    //wenn eine SSID bekannt ist,
    //wird versucht eine Verbindung herzustellen
    WiFi.begin(conf.values[0].c_str(),conf.values[1].c_str());
    uint8_t cnt = 0;
    while ((WiFi.status() != WL_CONNECTED) && (cnt<20)){
      delay(500);
      Serial.print(".");
      cnt++;
    }

Serial.println();
    if (WiFi.status() == WL_CONNECTED) {
      Serial.print("IP-Adresse = ");
      Serial.println(WiFi.localIP());
      connected = true;
    }
  }

//konnte keine Verbindung hergestellt werden,
  //wird ein Accesspoint gestartet
  //der Accesspoint hat kein Passwort. Über die IP-Adresse 
  //192.168.4.1 kann die Konfiguration durchgeführt werden
  if (!connected) {
    WiFi.mode(WIFI_AP);
    WiFi.softAP(conf.getApName(),"",1);
  }
  return connected;
}

//Diese Funktion wird aufgerufen,
//wenn der Webserver eine Anfrage erhält
void handleRoot() {
//Die Anfrage wird an die Konfigurationsinstanz weitergegeben
  conf.handleFormRequest(&server);
}

//Neue Nachrichten vom RSS-Feed lesen
void getNews() {
  String error = "";
  if(WiFi.status()== WL_CONNECTED){
    //HTTP Client
    HTTPClient http;
    Serial.print("[HTTP] begin...\n");
    //url aus der Konfiguration
    http.begin(conf.getValue("rssUrl"));

Serial.print("[HTTP] GET...\n");
    // Anfrage abschicken
    int httpCode = http.GET();

// httpCode ist im Fall eines Fehlers negativ
    if(httpCode > 0) {
      // HTTP Antwort vom Server erhalten
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);
      if(httpCode == HTTP_CODE_OK) {
        String payload = http.getString();
        xml.reset();
        for (uint16_t i=0; i<payload.length(); i++) xml.processChar(payload[i]);
      }
      else{
        error = "Server antwortet mit "+String(httpCode);
      }
    } else {
        error = "Server antwortet mit "+http.errorToString(httpCode);
    }

http.end();
    if (newsCnt > 0) {
      //Falls Nachrichten empfangen wurden,
      //wird die erste Nachricht angezeigt
      curNews = 0;
      lmd.ticker(news[0],100);
    }
  } else {
      initWiFi();
      error = "Keine Internetverbindung!";
  }
  if (error != "") {
    news[0] = error;
    newsCnt = 1;
    curNews = 0;
    lmd.ticker(news[0],100);
  }
}

//Die aktuelle Uhrzeit wird angezeigt wenn start wahr ist
void showTime(boolean start){
  if (start) {
    Serial.println("Time Start");
    last = millis();
    char sttime[10];
    struct tm timeinfo;
    dispMode=0;
    if(getLocalTime(&timeinfo)){
      strftime(sttime, sizeof(sttime), "%H:%M ", &timeinfo);
      lmd.printText(0,String(sttime));
      lmd.display();
    } else {
    //liefert die RTC keine Werte so wird ??:?? angezeigt
      lmd.printText(0,"??:?? ");
      lmd.display();
    }

} else {
    //Wenn das Ende der Anzeigedauer erreicht wurde,
    //wird auf Datum umgeschaltet
    if ((millis()-last) > (conf.getInt("disptime")*1000)) {
      showDate(true);
    }
  }
}

//Das aktuelle Datum wird angezeigt wenn start wahr ist
void showDate(boolean start) {
  if (start) {
    Serial.println("Date Start");
    last = millis();
    char sttime[10];
    struct tm timeinfo;
    dispMode = 1;
    if(getLocalTime(&timeinfo)){
      strftime(sttime, sizeof(sttime), "%d.%b ", &timeinfo);
      lmd.printText(0,String(sttime));
      lmd.display();
    } else {
      //liefert die RTC keine Werte so wird ??.??? angezeigt
      lmd.printText(0,"??.???");
      lmd.display();
    }
  } else {
    //Wenn das Ende der Anzeigedauer erreicht wurde,
    //wird auf News umgeschaltet
    if ((millis()-last) > (conf.getInt("disptime")*1000)) {
      showNews(true);
    }
  }
}

//Eine Nachricht wird angezeigt wenn start wahr ist
//werden Nachrichten vom Server geholt und
//die erste Nachricht angezeigt sonst die nächste
void showNews(boolean start) {
  if (start) {
    Serial.println("News Start");
    if (curNews == 0) {
      getNews();
    } else {
      lmd.ticker(news[curNews],100);
    }
    dispMode = 2;
  } else {
  //der Ticker wird aktualisiert. Wenn das Ende der Nachricht erreicht
  //wurde wird auf die nächste Nachricht weitergeschaltet.
  //Die Anzeige wird auf Zeitanzeige umgeschaltet
    if (!lmd.updateTicker()) {
      curNews++;
      if (curNews >= newsCnt) curNews = 0;
      showTime(true);
    }
  }
}

//Wird einmal beim Start des Programms ausgeführt
void setup() {
  //Filesystem initialisieren und
  //falls noch nicht geschehen, formatieren
  SPIFFS.begin(true);
  //Serielle Schnittstelle starten
  Serial.begin(115200);
  //XML-Interpreter initialisieren
  xml.init((uint8_t *)buffer, sizeof(buffer), &XML_callback);
  //Formular zur Webkonfiguration vorbereiten
  conf.setDescription(params);
  //Konfiguration falls vorhanden aus dem Filesystem lesen
  conf.readConfig();
  // Anzeige initialisieren
  lmd.setEnabled(true);
  lmd.setIntensity(conf.getInt("intens")); // 0 = low, 10 = high
  lmd.clear();
  lmd.display();
  //WLAN Verbindung herstellen
  initWiFi();
  //Multicast DNS starten
  char dns[30];
  sprintf(dns,"%s.local",conf.getApName());
  if (MDNS.begin(dns)) {
    Serial.println("MDNS responder gestartet");
  }
  //Webserver starten
  server.on("/",handleRoot);
  server.begin(80);
  delay(1000);
  //Wenn eine Internetvebindung besteht, die Echtzeituhr des ESP32
  //mit Daten vom Zeitserver starten
  if (WiFi.status()== WL_CONNECTED) configTzTime("CET-1CEST,M3.5.0/03,M10.5.0/03", conf.getValue("ntp"));
  showTime(true);
}

void loop() {
  if (millis() < last) last=millis();
  //falls ein Überlauf auftrat nach etwa 50 Tagen
  //Anfragen des Webserver behandeln
  server.handleClient();
  //Anzeige aktualisieren
  switch (dispMode) {
    case 0: showTime(false); break;
    case 1: showDate(false); break;
    case 2: showNews(false); break;
  }
}

The sketch for download

After the start, the program cannot establish a connection to the WLAN yet. Therefore, an access point is started. Its SSID is the MAC address of the ESP32. In the WLAN setting of the smartphone you should see the SSID. You can now select this network and connect to it. The network does not need a password. Possibly the smartphone reports that no internet connection is possible and if you want to keep the selected network. In this case, tap on Keep.


Now you can start a browser and call the URL 192.168.4.1. The configuration page of the Matrix clock should appear.


The name of the access point is the MAC address and can be changed as desired. This is followed by the access data for the WLAN. For the URL of the RSS feed, you can enter https://www.tagesschau.de/newsticker.rdf, for example.
The NTP server can remain as it is. But you can also set for example the Fritzbox with fritz.box.

Next you have to set the maximum number of headlines, the brightness for the display and the time in seconds, how long time and date should be displayed.
Finally tap on SAVE and RESTART. The matrix clock will restart and should now connect to the WLAN. In the output on the serial monitor you can follow the login. The configuration page can then be reached via the IP address assigned to the matrix clock by the router.

Installation in a housing

Those who have a 3D printer at their disposal can print a suitable housing. A total of four parts are required. A bottom part Uhr_unterten.stl, a lid Uhr_deckel.stl and two holders for the display Uhr_halter.stl.

Now to the assembly. First, the breadboard is equipped with the two female connectors and the angled male connector.


The following wiring is performed on the rear panel.


Now you can plug the controller onto the female connectors and connect the matrix with the controller via the 5-pin cable. Here you have to pay attention to the correct order of the pins.
After plugging together, it is the right time to check everything again and perform a test run before starting the installation.


The next step is to install the matrix and the breadboard in the housing. In order for the matrix to be attached, the two brackets must first be attached to the matrix.


Now you can fix the matrix in the lid and the breadboard in the base.


So that's it. The matrix clock with news feed is ready.


Have fun crafting.

DisplaysEsp-32Esp-8266

35 comments

R. Gerlinger

R. Gerlinger

Hallo,
habe 2x MAX7219 8×32 4 in 1 Dot Matrix genommen, da ist die Laufschrift besser zu lesen
und habe die Uhrzeit und das Datum in die mitte gesetzt.

HerGro HerrMann

HerGro HerrMann

Hallo Gerald
Heute per Mail Dein Hinweis auf die Erweiterung des Matrix Readers Weather bekommen.
Hab mich gleich bei OpenWeatherMap.org regristriert und key bezogen,
Dein *.ino file installiert und meine Hochachtung: lief auf Anhieb, sehr beeindruckend!!
(Trotz vieler “Warnings” die man nur beim “Überprüfen” angezeigt bekommt,
beim Download allerdings nicht !!??)
Danke für Deine Arbeit
HerrMann

Gerald Lechner

Gerald Lechner

Die Änderung für # bitte nicht aus meinem Kommentar kopieren sondern direkt über Tastatur eingeben. Die Zeile im Kommentar enthält Sonderzeichen, die die Arduino IDE nicht verarbeiten kann.

Rudolf Gerlinger

Rudolf Gerlinger

Hallo Her Lechner,

es ist mir furchtbar Peinlich, ich habe gedacht ich bin fertig mit der Matrix Uhr.
Nach ihre Antwort die Zeile: payload.replace(“&#035”,“#”);
nach der Zeile: String payload = http.getString(); einzufügen
bringt folgende Fehlermeldung: exit status 1 stray ’\342` in program

Verwendetes Modul AZ-Delivery ESP32-WROOM-32
Ich weis nicht mehr weiter, die Laufschrift funktioniert
bis auf die Anzeigen &#035 im Text.

Grüße R. Gerlinger

Gerald Lechner

Gerald Lechner

Mit folgender kleinen Änderung in der Funktion getNews() wird das Anführungszeichen-Problem gelöst.
Nach der Zeile mit dem Code String payload = http.getString(); folgende Zeile payload.replace(“&#035”,“#"); einfügen. Das ist alles.

Gerald Lechner

Gerald Lechner

Es können auch mehrere Matrix-Anzeigen hintereinander geschaltet werden. Im Sketch muss die Anzahl der Segmente entsprechend geändert werden. #define LEDMATRIX_SEGMENTS 8 für zwei Matrix-Anzeigen.

Rudolf Gerlinger

Rudolf Gerlinger

Hallo Herr Lechner,
ich bins schon wieder, aber diesesmal meine letzte Anfrage.
In der Laufschrift erscheint immer wieder &#035: im Text.
Ich werde wohl das Projekt auch aufgeben…

Mit freundlichen Gruß
R. Gerlinger

Rudolf Gerlinger

Rudolf Gerlinger

Hallo Herr Lechner,
da jetzt die Newsreader auf Matrixdisplay funktioniert,
hat meine Frau gefragt ob die Anzeige nicht etwas länger sein kann…
Also zweimal MAX7219 8×32 4 in 1 Dot Matrix LED…
Frauen!?!…

Grüße R. Gerlinger

hergro HerrMann

hergro HerrMann

Hatte eben vor ca. ’ner Stunde zu die Lib geposted und auf warnings hingewiesen.
Hab mich getraut, den sketch trotzdem zu laden: >> Überraschung:
Lief auf Anhieb!
Super! Danke!
Jetzt fängt das Forschen an : – ))

HerGro HerrMann

HerGro HerrMann

In der Beschreibung wird drauf hingewiesen das die Lib “Arduino_JSON” zu includieren ist.
ergibt Fehler ArduinoJson.h nicht gefunden! Bei der erstgenannten heißt die Header Datei Arduino_JSON.h , trotz Umbenennung immer noch fehlermeldung. Dann entdeckte ich das es auch eine Lib gibt “ArduinoJson” nach installation dieser Lib wurde Sketch übersetzt allerdings mit vielen Warnings!
z.B.:/home/herrmann/Arduino/libraries/WebConfig/src/WebConfig.cpp:76:1: warning: unknown escape sequence: ‘\>’
"

<input type=‘%s’ value=‘%s’ name=‘%s’ \>\n";
oder: /home/herrmann/Arduino/libraries/WebConfig/src/WebConfig.cpp:294:104: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
case INPUTCOLOR: createSimple(buf,description[i].name,description[i].label,“color”,values[i]);
oder: /home/herrmann/.arduino15/packages/esp32/hardware/esp32/1.0.6/cores/esp32/esp32-hal-spi.c:923:40: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
uint8
t * last
data8 = &last
data;
^
Der Sketch verwendet 999134 Bytes (76%) des Programmspeicherplatzes. Das Maximum sind 1310720 Bytes.
Globale Variablen verwenden 54736 Bytes (16%) des dynamischen Speichers, 272944 Bytes für lokale Variablen verbleiben. Das Maximum sind 327680 Bytes.
Ist das normal? Oder sieht jemand auf einen Blick, was fehlt????
HerrMann
B. Borys

B. Borys

Herr Lechner,
noch mal zur Anführungszeichen-Ersetzung:
Im Blog werden die Anführungszeichen und der HTML-Code dafür nicht richtig dargestellt. Vielleicht wird es so deutlich:
Der Befehl muss lauten payload.replace ( … , … )
und der erste Parameter ist (Anführungszeichen)(Kaufmanns-und)quot;(Anführungszeichen)
der zweite ist (Anführungszeichen)(Backslash)(Anführungszeichen)(Anführungszeichen)

Gerald Lechner

Gerald Lechner

Mit folgender kleinen Änderung in der Funktion getNews() wird das Anführungszeichen-Problem gelöst.
Nach der Zeile mit dem Code String payload = http.getString(); folgende Zeile payload.replace(“"”,“\”"); einfügen. Das ist alles.

B. Borys

B. Borys

Schönes Projekt!
Ein Vorschlag: in XML_callback(), so etwa bei Codeuzeile 113 die Zeile
news[newsCnt].replace(“"”, “\”");
einfügen. Dann erscheinen im angezeigten Lauftext Anführungszeichen statt HTML-Code dafür

Mucki

Mucki

Hallo zusammen,

wenn in der angezeigten Nachricht ein Anführungszeichen vorkommt, wird anstelle dessen &quote; angezeigt. Z.B. wird anstelle von [“Hinweis”] folgendes angezeigt: ["Hinweis"].

Im Quellcode habe ich die Stelle noch nicht gefunden, an der das zu ändern wäre. Hat jemand einen Tipp für mich?

Gerald Lechner

Gerald Lechner

Der hier vorgestellte Sketch ist nur für den ESP32 geeignet, es gibt aber einen ähnlichen Beitrag “Das zwölfte Türchen” aus der Adventreihe 2020, der mit einem ESP8266 arbeitet. Dieser Beitrag nutzt ein anderes Display, aber die Teile zum Holen der Daten aus dem Netz (HTTP Client und Funktion getNews() können auch für den Sketch mit dem Matrixdisplay verwendet werden.

Jürgen Meinunger

Jürgen Meinunger

Meine Frage ist geklärt. Das von mir vorgesehene Board ist nicht geeignet. Order jetzt ein passendes Board, dann sollte es funktionieren.

Juergen

Juergen

Hallo,

ich muss auch mal um Hilfe bitten. Da noch vorhanden möchte ich gerne ein Lolin Node MCU 1.0 verwenden. Ich habe versucht den Sketch mit der Arduino IDE zu compilieren.
Ich erhalte folgende Fehlermeldung:

Arduino: 1.8.13 (Windows 10), Board: “NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:none OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200”

matrix_uhr:5:58: fatal error: WebServer.h: No such file or directory

#include //Webserver für die Konfiguration ^

compilation terminated.

exit status 1

WebServer.h: No such file or directory

Irgendwie scheint da noch eine Bibliothek zu fehlen.

Gerald Lechner

Gerald Lechner

Wichtiger Hinweis!!
In der Funktion getNews() fehlte das Zurücksetzen des Zählers, daher wurden nach dem erseten Mal keine neuen Nachrichten gelesen. In der Funktion getNews() muss nach dem Laden der Daten und vor dem Analysieren mit TinyXML der Zähler auf 0 gesetzt werden.

String payload = http.getString(); newsCnt = 0; xml.reset();

Die entsprechende Stelle im Sketch wurde gelb markiert. Der Sketch zum Herunterladen wurde aktualisiert.

Gerald

Gerald

Wichtiger Hinweis!!!
Im Text des Beitrags wurde für den Taktanschluss fälschlicher Weise GPIO19 statt GPIO18 angegeben. Alle Schalt- und Verdrahtungspläne waren aber richtig.

Dieter

Dieter

Hi, welche TinyXML muss denn verwendet werden? Es gibt eine 2. Version, die bei mir nicht in der IDE funktionert. Die erste aber auch nicht, die IDE bleibt immer bei “TinyXML xml;” hängen.
Gruss Dieter

Grauer Wolf

Grauer Wolf

Hallo, ich nochmal.
Habe gerade einen Fehler gefunden. Oben in der Beschreibung steht für CLK GPIO19, es muss aber GPIO18 sein!!!
Bis auf die Compilierungsfehler läuft es jetzt!! Würde mich aber trotzdem über eine Antwort freuen.
Gruß
Grauer Wolf

Grauer Wolf

Grauer Wolf

Hallo, sehr cooles Projekt, es hat mich glleich begeistert. Leider funktioniert überhaupt nichts. Ich verwende ein NodeMCU-ESP32 von jou-it. Eigentlich sind die Pins alle vorhanden und auch richtig angeschlossen.
Das Hochladen klappt, allerdings bekomme ich viele Fehler in der Art:
In member function ‘void WebConfig::handleFormRequest(WebServer*, const char*)’:
warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings
createSimple(buf,“apName”,“Name des Accesspoints”,“text”,apName);

warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
case INPUTTEXT: createSimple(buf,_description[i].name,description[i].label,“text”,values[i]);

Es geht schon los, dass ich keine WLAN-Verbindung bekomme. Die Konfiguration funktioniert, aber verbindet sich nicht. Wenn ich die WLAN-SSID und das Password direkt als String eintrage, klappt die Verbindung, die IP wird angezeigt.
Aber auf der Punktmatrix wird nichts angezeigt, bleibt alles dunkel. Ich habe auch mal in der IDE verschiedene Boards ausgewählt, es ist exakt das Gleiche.
Ich würde mich ja über eine Hilfe freuen.

Mit freundlichen Grüßen
Grauer Wolf

Peter

Peter

Hallo Gerald, leider habe ich auch das Problem mit der Matrix-Anzeige. Ich bekomme schon beim Kompilieren den Fehler: WARNUNG: Kategorie ‘’" in der Bibliothek LG_Matrix_Print ist ungültig und wird auf ’Uncategorized’ festgelegt. Hast Du einen Tipp für mich. Ich finde die Projektidee richtig cool!

Viele Grüße Peter

Gerald

Gerald

Hallo Herr Gottfried,
haben Sie, wie gleich nach dem Sketch beschrieben, über den Browser die Zugangsdaten für Ihr WLAN richtig eingegeben?
Immer wenn der ESP32 keine Internetverbindung aufbauen kann, startet er einen Accesspoint. Über die IP-Adresse 192.168.4.1 kann dann wie im Beitrag beschrieben die Konfiguration erfolgen.

Peter Gottfried

Peter Gottfried

Tolle Idee mein ESP will nicht ins netz gehen; im Display erscheinen Fragezeichen und keine Internet verbindung bin ratlos

Jörg

Jörg

Mal wieder ein sehr cooles Projekt. Fehlt eigentlich nur, dass auch noch das Wetter angezeigt wird. ;-)

Baengelchen

Baengelchen

Hallo Gerald,
top, läuft. Zeile war drin, allerdings wie im heruntergeladenen Sketch klein geschrieben:
#include “HttpClient.h”
Hab es von Dir übernommen (Großbuchstaben) und läuft. Danke

Gerald

Gerald

Hallo Baengelchen,
Diese Fehlermeldung erscheint wenn die Zeile
#include “HTTPClient.h”
(Zweite Zeile im Programm) fehlt.

Gerald

Gerald

Hallo Sven,
ich nehme an, dass es Verbindungsprobleme zwischen MCU und Matrix sind. Ich habe das mal durchprobiert. Wenn ich die DIN Leitung (GPIO23) unterbrochen habe, habe ich das von Dir beschriebene Verhalten beobachtet. Also Verdrahtung noch einmal genau checken.
Gruß Gerald

Baengelchen

Baengelchen

Hallo,
hab alles da gehabt und sofort los gelegt. Bin nicht der Programmierer und beim Kompilieren erscheint folgender Fehler:
D:\Cloud\Matrix Uhr und Newsreader\matrix_uhr\matrix_uhr.ino: In function ‘void getNews()’:
matrix_uhr:148:5: error: ‘HTTPClient’ was not declared in this scope
HTTPClient http;
^
matrix_uhr:151:5: error: ‘http’ was not declared in this scope
http.begin(conf.getValue(“rssUrl”));
^
matrix_uhr:161:23: error: ‘HTTP_CODE_OK’ was not declared in this scope
if (httpCode == HTTP
CODE
OK) {
^
Mehrere Bibliotheken wurden für “WiFi.h” gefunden
Benutzt: C:\arduino-1.8.13\portable\packages\esp32\hardware\esp32\1.0.6\libraries\WiFi
Nicht benutzt: C:\arduino-1.8.13\libraries\WiFi
exit status 1
‘HTTPClient’ was not declared in this scope

Woran liegt’s? Was mache ich falsch?

Sven Hesse

Sven Hesse

Hallo Hans W.

so ganz ohne WLAN/LAN – also Internet kann es nicht funktionieren, woher soll denn dann Uhrzeit/Newstext kommen?
Für 4×20 LED Displays gibt es reichlich Tutorials im Netz, mit und ohne WLAN.

Grüße

Sven Hesse

Sven Hesse

Hi Gerald,

wieder einmal mehr Danke für den Beitrag.
Natürlich direkt zusammen gebaut (wenn auch nicht mit einem ESP32 Mini) aber doch mit einem ESP Wroom 32 unter Beachtung der GPIO-Belegung.
Leider ist die LED Matrix nicht dazu zu bewegen, Zeichen darzustellen. Entweder leuchten alle LED durchweg oder es leuchtet überhaupt nix.
AccessPoint wird erstellt, ich kann die Konfigurationsseite aufrufen, im seriellen Monitor werden alle Schritte angezeigt – aber die Matrix mag eben nicht.
Woran kann das denn liegen?

VG
Sven

Mucki

Mucki

Na klar geht auch das Entwicklerbrett ESP32 D1 R32.
Die Pinbelegung steht doch oben im Text: „ Der Datenausgang des ESP32 MOSI (GPIO23) wird mit DIN der Matrix verbunden. Der Taktausgang des ESP32 CLK (GPIO19) wird mit dem Takteingang der Matrix verbunden. Als Chip-Select wird der GPIO16 des ESP32 verwendet,“ wenn diese Pins verwendet werden, muss der Code nicht verändert werden.
Welche Pins das sind findet man im Datenblatt: https://cdn.shopify.com/s/files/1/1509/1638/files/D1_R32_Board_Pinout.pdf?v=1606738342
Viel Erfolg

Wolfgang Butenhoff

Wolfgang Butenhoff

Kann ich für die Schaltung auch mit dem ESP32 D1 R32 development board with CH340G and WiFi + Bluetooth (Arduino compatible Internet Development Board) einsetzen? Wenn ja bitte die entsprechende Pinbelegung mitteilen und wenn erforderlich Code-Änderungen.
Danke für den sehr interessanten Beitrag.

Hans W

Hans W

Sieht gut aus!
funktioniert das ganze auch ohne Wlan u. Handy?
z.b mit einem TFT , 4X20 Led Display?

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. Install ESP32 now from the board manager
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP programming via WLAN