Newsreader auf Matrixdisplay - AZ-Delivery

En este proyecto, el tiempo, la fecha y los últimos titulares deben mostrarse como una banda de rodadura en una matriz LED. La fecha y la hora deben ser actualizadas por un servidor de tiempo.
Los titulares están disponibles a partir de la llamada feed RSS. Este es un servicio que ofrece varios servidores web, por ejemplo, TAGESSSCHAU.DE. Este servicio utiliza HTTP o HTTPS como protocolo de transmisión, pero los datos no se entregan como de costumbre en formato HTML, pero como XML, es decir, sin información de diseño.

Aquí hay un ejemplo como tal aspecto de datos XML:



<Título> TAGESSSCHAU.DE - LA NOTICIAS DE LA ARD </ TITLE>
http://www.tagesschau.de </ link>
<Descripción> TAGESSSCHAU.DE </ DESCRIPCIÓN>
de </ Idioma>
http://blogs.law.harvard.edu/tech/rss </ docs>
30 </ ttl>

<Título>
Spahn espera la vacuna de Corona para los niños al verano
</ title>

            https://www.tagesschau.de/inland/coronavirus-impfung-kinder-101.html
</ enlace>
<Descripción>
El plan de vacunación para Alemania es, pero solo por la reciente falta, hasta ahora, falta un ingrediente activo. El Ministro Federal de Salud Spahn se basa en el hecho de que hasta el verano, se está desarrollando la vacuna para los niños y adolescentes.
</ Descripción>

            https://www.tagesschau.de/inland/coronavirus-impfung-kinder-101.html
</ GUID>
<Categoría />
</ item>

<Título>
Vacunas en la UE: ¿Por qué las negociaciones se agacharon durante tanto tiempo?
</ title>

El bloque principal tiene la etiqueta XML . Después de una información general, siguen los titulares individuales, cada uno en un bloque con la etiqueta XML . Dentro de este bloque, hay un bloque con la etiqueta XML<title>. El contenido de este bloque es lo que buscamos mostrar.

Hardware requerido

Numero Componente Nota
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

Circuito

La matriz LED se conecta simplemente al bus SPI del ESP32. La salida de datos del MOSI del ESP32 (GPIO23) está conectada al DIN de la matriz. La salida de reloj del ESP32 CLK (GPIO19) está conectada a la entrada de reloj de la matriz. El GPIO16 del ESP32 se utiliza como chip select, que está conectado al conector CS de la matriz. La matriz se alimenta con 5V, esto no es un problema para el ESP32, porque todos los conectores que se utilizan aquí se emplean como salida y por lo tanto no pueden obtener voltajes más altos de la matriz. 


Programa

Además del paquete ESP32, se necesitan cuatro librerías.

Utilizamos la librería TinyXML para extraer la información deseada de los datos XML recibidos. Esta librería sólo tiene tres funciones.

  • void init (uint8_t* buffer, uint16_t maxbuflen, XMLcallback XMLcb);
    Esta función se llama en la función de configuración. El parámetro buffer señala una matriz de bytes para mantener los datos temporales, el parámetro maxbuflen especifica el tamaño del buffer. El parámetro XMLcallback señala una función de devolución de llamadavoid XML_callback(uint8_t statusflags, char* tagName, uint16_t tagNameLen, char* data, uint16_t dataLen)que se llama cada vez que se ha procesado completamente un elemento XML. El parámetro statusflags especifica qué datos se proporcionan. Como nos interesa el contenido de una etiqueta XML, sólo utilizaremos el estado STATUS_TAG_TEXT. El parámetro tagName señala una matriz de caracteres que contiene la ruta XML completa del elemento. Para el título de un elemento del newsfeed, se trata entonces de la ruta "/rss/channel/item/title". El parámetro tagNameLen devuelve la longitud de la ruta. El parámetro data también señala una matriz de caracteres que contiene los datos. El último parámetro dataLen devuelve el tamaño de la matriz de datos.
     
  • void reset();
    Esta función restablece todos los punteros internos. Siempre se debe llamar antes de leer nuevos datos XML.

  • void processChar(uint8_t ch);
    Esta función envía un carácter de los datos XML a procesar al parser XML. Esta función se debe llamar secuencialmente para cada carácter recibido. Si el carácter transmitido conduce a la finalización de un bloque XML, se llama a la función callback con los datos correspondientes. 

La librería LG_Matrix_Print se utiliza para mostrar cadenas en la matriz LED. Las siguientes funciones se utilizan en el sketch:

  • void setEnabled(bool enabled);
    Se activa o desactiva el acceso a la matriz LED.

  • void setIntensity(uint8_t level);
    Esta función cambia el brillo de la pantalla. Se permiten valores entre 0 y 15. Normalmente 1 es suficiente.

  • void display();
    El contenido de la memoria de la pantalla se transfiere a la matriz, por lo que es visible.
  • void clear()
    La memoria de la pantalla se borra.

  • int printText(int start, String text, boolean isUTF8 = true);
    Esta función convierte la cadena especificada en el parámetro texto, empezando por el enésimo carácter, en el correspondiente patrón de bits de la memoria de visualización utilizando el set de caracteres interno. El carácter en el que debe comenzar la salida se especifica en el parámetro start. El parámetro optional es UTF8 activa o desactiva el convertidor de código interno.

  • void ticker(String message, uint16_t wait);
    Esta función permite implementar un ticker muy fácilmente. El parámetro message señala una cadena que contiene el texto a mostrar. El segundo parámetro wait especifica el tiempo en milisegundos que hay que esperar antes de que el texto avance un píxel. La librería se encarga de todo lo demás.

  • boolean updateTicker();
    Esta función se debe llamar en la función de bucle para actualizar el ticker.

La librería contiene otras funciones, pero no se utilizan en este sketch.

La librería WebConfig se utiliza para configurar los datos de acceso a la WLAN así como otros ajustes a través de un navegador. La configuración está almacenada en el sistema de archivos flash SPIFFS y permanece incluso después de apagar el microcontrolador. Una descripción detallada se puede encontrar en: 

https://github.com/GerLech/WebConfig/blob/master/README.md o en my libro Smarthome.

La librería WebConfig requiere la librería Arduino_JSON, por lo que ésta también se debe instalar, pero que no está incluida en el sketch.

El 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);
  }
}


Después del inicio, el programa todavía no puede establecer una conexión con la WLAN. Por lo tanto, se inicia un punto de acceso. Su SSID es la dirección MAC del ESP32. En la configuración de la WLAN del smartphone debería ver el SSID. Ahora puede seleccionar esta red y conectarse a ella. La red no necesita una contraseña. Es posible que el smartphone le informe de que no es posible conectarse a Internet y que quiera mantener la red seleccionada. En este caso, pulse en "Keep".


Ahora puede iniciar un navegador y llamar a la URL 192.168.4.1. La página de configuración del reloj de la matriz debe aparecer.


El nombre del punto de acceso es la dirección MAC y puede modificarse como se desee. A continuación aparecen los datos de acceso de la WLAN. Para la URL del canal RSS, puede introducir, por ejemplo
https://www.tagesschau.de/newsticker.rdf .

El servidor NTP puede permanecer como se encuentra. Pero también se puede configurar, por ejemplo, el Fritzbox con fritz.box.

A continuación tiene que establecer el número máximo de titulares, el brillo para la pantalla y el tiempo en segundos, cuánto tiempo debe visualizarse la hora y la fecha.

Finalmente pulse sobre "SAVE" y "RESTART". El reloj de la matriz se reiniciará y ahora debería conectarse a la WLAN. En la salida del monitor en serie puede seguir el inicio de sesión. Se puede acceder a la página de configuración a través de la dirección IP asignada al reloj de la matriz por el router.

Instalación en una carcasa

Quienes tengan una impresora 3D a su disposición pueden imprimir una carcasa adecuada. Se necesitan un total de cuatro piezas. Una pieza para la parte inferior Uhr_unterten.stl, una tapa Uhr_deckel.stl y dos soportes para la pantalla Uhr_halter.stl.

Ahora pasamos al montaje. En primer lugar, se equipa la breadboard con los dos conectores hembra y el conector macho acodado.


El siguiente cableado se realiza en el panel trasero.


Ahora puede conectar el controlador en los conectores hembra y conectar la matriz con el controlador a través del cable de 5 pines. Aquí tiene que prestar atención al orden correcto de los pines.

Después de conectar, es el momento de comprobar todo de nuevo y realizar una prueba antes de comenzar la instalación.


El siguiente paso es instalar la matriz y la breadboard en la carcasa. Para poder fijar la matriz, primero hay que fijar los dos soportes a la matriz.


Ahora puede fijar la matriz en la tapa y la breadboard en la base.


Eso es todo. El reloj de la matriz con las noticias está listo.


¡Qué se divierta haciendo manualidades!










DisplaysEsp-32Esp-8266

44 comentarios

Gerald Lechner

Gerald Lechner

Ich habe festgestellt, dass sich die XML Struktur geändert hat. In der Funktion XML_callback sollte die Zeile zur Tag-Auswahl daher statt
if (strcasecmp(tagName, “/rss/channel/item/title”) == 0) ) {
neu:
if ((strcasecmp(tagName, “/rss/channel/item/title”) == 0) ||
(strcasecmp(tagName, “/item/title”) == 0)) {
lauten
@Klaus Baumann: die URL muss
https://www.tagesschau.de/infoservices/alle-meldungen-100%7Erdf.xml
lauten. Das Sonderzeichen “~” muss für HTML mit %7E codiert werden.
@Jan: Direkt ist das leider derzeit nicht möglich. Ich müsste dazu die Bibliothek LG_Matrix_Print mit einer entsprechenden Funktion erweitern. Ich kann aber nicht versprechen diese Erweiterung vorzunehmen.

Klaus Baumann

Klaus Baumann

Hallo nochmal…ich habe jetzt mehrere rrs .xml-Feeds getestet…manche gehen, andere nicht…schade…der Tagesschau-Feed funktioniert leider nicht. Focus Online z.B. funktioniert. Offenbar hat die Tagesschau .xml irgend einen Unterschied in der Syntax, der unserem Reader nicht schmeckt… :(

Klaus Baumann

Klaus Baumann

Guten Abend, ich habe das Projekt grade zusammengebastelt und es funktioniert auch soweit (Uhrzeit/Datum/Wetter). Allerdings bekomme ich statt dem Newsfeed ständig die Meldung “Server antwortet mit 404”. Ich habe den aktualisierten Link “https://www.tagesschau.de/infoservices/alle-meldungen-100~rss2.xml” für den Newsfeed eingegeben…leider auch hier dieselbe Fehlermeldung.
Hat irgendwer nen Tip für mich?

Jan

Jan

Hallo Herr Lechner,
tolles Projekt, habe es nachgebaut und es funktioniert einwandfrei. In das Gehäuse, welches ich mir ausgesucht habe (thingiverse) passt die LED-Matrix nur in eine Richtung rein, sodass die Laufschrift nun auf dem Kopf steht. Ist es möglich das Ganze innerhalb des Codes um 180° zu drehen?
Grüße Jan

Gerald Lechner

Gerald Lechner

In allen Software Varianten ist ein Fehler. Am Ende der Funktion initWifi() muss die Bedingung
if (!connected && !waitForConfig ) {
statt
if (!connected) {
lauten. Sonst wird im Falle, dass keine gültige SSID vorliegt, dauernd der Accesspoint neu initialisiert und eine Verbindung ist nicht möglich.
Außerdem hat sich die URL für den ARD Dienst geändert. Es muss jetzt
https://www.tagesschau.de/infoservices/alle-meldungen-100%7Erdf.xml
lauten.

LutzB

LutzB

Hallo, mir geht’ s genauso , wie Dieter. Alles hat perfekt funktioniert inkusive Wetter.
Jetzt will sich das Teil nicht mit dem Wlan verbinden. 192.168.4.1 klappt auch nicht.
es erscheinen nur :
Bin ich zu blöd kann es sein, dass der neue Router dran schuld ist?
Hat jemand eine Idee ?

Dieter

Dieter

Hallo Herr Lechner + Community,
nach einiger Zeit mit Fremdgehen des Matrix-Tickers als Luftmessgerät, wollte ich gern den Ticker reaktivieren. Leider funktioniert er nicht mehr, es kommt nur die Meldung: “Server antwortet mit connection refused”. Was ist passiert? Am Sketch habe ich nichts verändert. Wer schön wenn mir jemand helfen könnte?!
MfG.

Volker W.

Volker W.

Hallo Gerald,
hoffe du liest das noch, vielen dank für diesen tollen Beitrag.
Habe alles zusammen gebaut und funktionierte nach ein paar Versuchen auch wunderbar!
3x 4-1 Max7219, wegen des besseren lesens.
Habe auch schon verschiedene RSS Feeds ausprobiert, klappt!
Würde aber gerne noch die Geschwindigkeit beim RSS Feed per Konfigurationsfenster ändern können,
bei der Zeit und Datum wäre eine Mittelstellung der Anzeige nett (sind ja 3×4 Module)
Kannst du mir da weiterhelfen
Vielen Dank im Voraus
Volker W.

Jos Wich

Jos Wich

Hallo Community !
anfangs total begeistert von dieser Lösung, stehe ich jetzt vor einem größeren Problem. Ich habe 2x 4fach MAX7219 mit einander verbunden. Als diese Variante stabil lief, habe ich nicht nur die Nachrichten aus der Tagesschau gelesen, nein auch n-tv.de/rss lieferte brav Daten, sogar die Limburger Zeitung aus den Niederlanden…..

Frage: stehe ich mittlerweile auf einer Blacklist wenn alle Anzeigen eine " … connection refused …. " zurück geben ? Wenn ja, wie komme ich da wieder runter ?

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?

Deja un comentario

Todos los comentarios son moderados antes de ser publicados