Newsreader auf Matrixdisplay - AZ-Delivery

Dans ce projet, l'heure, la date et les derniers gros titres doivent être affichés sous forme de téléscripteur sur une matrice LED. La date et l'heure doivent être mises à jour par un serveur de temps.
Vous recevez les titres de presse à partir d'un flux RSS. Il s'agit d'un service offert par divers serveurs web tels que tagesschau.de. Ce service utilise http ou https comme protocole de transmission, mais les données ne sont pas livrées au format HTML comme d'habitude, mais au format XML, c'est-à-dire sans informations de mise en page.

Voici un exemple de ce à quoi ressemblent ces données XML:


TAGESSCHAU.DE - Les nouvelles de l'ARD </ Titre>
http://www.tagesschau.de </ link>
Tagesschau.de </ Description>
DE </ LANGUE>
http://blogs.law.harvard.edu/tech/RSS </ docs>
30 </ ttl>



Spahn espère sur le vaccin corona pour les enfants à l'été
</ titre>

            https://www.tagesschau.de/inland/coronavirus-impfung-kinder-101.html
</ link>

Le plan de vaccination pour l'Allemagne est - mais juste pour le récent manquant jusqu'à présent, un ingrédient actif manque. Le ministre fédéral de la Santé Spahn s'appuie sur le fait que jusqu'à l'été, le vaccin contre les enfants et les adolescents est en cours de développement.
</ description>

            https://www.tagesschau.de/inland/coronavirus-impfung-kinder-101.html
</ guid>
<catégorie />
</ item>



Vaccins dans l'UE: pourquoi les négociations se sont penchées depuis si longtemps
</ titre>

Le bloc principal comporte la balise XML <channel>. Après quelques informations générales, les titres individuels suivent, chacun dans un bloc avec la marque XML <item>. Dans ce bloc, il y a un bloc avec la marque XML <title>. Nous voulons afficher le contenu de ce bloc.

Matériel requis

Nombre Composant annotation
1 ESP32 D1 MINI NODEMCU
1 Max7219 8x32 4 en 1 Dot Matrix LED
1 PCB board set breadboard 6x4 cm
1 Connecteur mâle incliné à 5 pôles matrice de base avec
2 Connecteur femelle 8-pôles pour le contrôleur
1 Câble de connexion à 5 pôles de prise à prise matrice de base avec
4 Pièces du boîtier provenant de l'imprimante 3D, vis de 2,2 mm pour la fixation de l'écran.


Circuit

La matrice de LED est simplement connectée au bus SPI de l'ESP32. La sortie de données de l'ESP32 MOSI (GPIO23) est connectée au DIN de la matrice. La sortie d'horloge de l'ESP32 CLK (GPIO19) est connectée à l'entrée d'horloge de la matrice. Le GPIO16 de l'ESP32 est utilisé comme chip select, il est connecté au connecteur CS de la matrice. La matrice est alimentée en 5V, ce n'est pas un problème pour l'ESP32, car tous les connecteurs utilisés ici sont utilisés comme sortie et ne peuvent donc pas recevoir de tensions plus élevées de la matrice.


Programme

En plus du package ESP32, vous avez besoin de quatre bibliothèques.

Nous utilisons la bibliothèque TinyXML pour extraire les informations souhaitées des données XML reçues. La bibliothèque n'a que trois fonctions.

  • void init (uint8_t* buffer, uint16_t maxbuflen, XMLcallback XMLcb);

    Cette fonction est appelée dans la fonction de configuration. Le paramètre buffer pointe vers un tableau d'octets pour contenir les données temporaires, le paramètre maxbuflen spécifie la taille du tampon. Le paramètre XMLcallback pointe vers une fonction de rappel.

    vide xml_callback (UINT8_T Status Drapeaux, Char * TagName, UINT16_T TAGNONEN, CHAR * DATA, UINT16_T Datalen)

    qui est toujours appelé lorsqu'un élément XML a été complètement traité. Le paramètre statusflags spécifie quelles données sont fournies. Comme nous nous intéressons au contenu d'une balise XML, nous n'utiliserons que le statut STATUS_TAG_TEXT. Le paramètre tagName pointe vers un tableau de caractères contenant le chemin d'accès XML complet de l'élément. Pour le titre d'un élément du fil d'actualité, il s'agit alors du chemin "/rss/channel/item/title". Le paramètre tagNameLen renvoie la longueur du chemin. Le paramètre data pointe également vers un tableau de caractères contenant les données. Le dernier paramètre dataLen renvoie la taille du tableau de données.

  • void reset();
    Cette fonction réinitialise tous les pointeurs internes. Elle doit toujours être appelée avant la lecture de nouvelles données XML.

  • void processChar(uint8_t ch);
    Cette fonction envoie un caractère des données XML à traiter à l'analyseur XML. Cette fonction doit être appelée successivement pour chaque caractère reçu. Si le caractère transmis conduit à l'achèvement d'un bloc XML, la fonction de rappel est appelée avec les données correspondantes.


La bibliothèque LG_Matrix_Print est utilisée pour afficher des chaînes sur la matrice de LED. Les fonctions suivantes sont utilisées dans l'esquisse :

  • void setEnabled(bool enabled);
    L'accès à la matrice de LED est activé ou désactivé.

  • void setIntensity(uint8_t level);
    Cette fonction permet de modifier la luminosité de l'écran. Les valeurs comprises entre 0 et 15 sont autorisées. Normalement, 1 est tout à fait suffisant.

  • void display();
    Le contenu de la mémoire de l'écran est transféré à la matrice et devient ainsi visible.

  • void clear()
    La mémoire d'affichage est effacée.

  • int printText(int start, String text, boolean isUTF8 = true);
    Cette fonction convertit la chaîne de caractères spécifiée dans le paramètre texte, en commençant par le nième caractère, en un motif binaire correspondant dans la mémoire d'affichage en utilisant le jeu de caractères interne. Le caractère sur lequel l'édition doit commencer est spécifié dans le paramètre start. Le paramètre optionnel isUTF8 active ou désactive le convertisseur de code interne.

  • void ticker(String message, uint16_t wait);
    Cette fonction permet d'implémenter très facilement un ticker. Le paramètre message pointe vers une chaîne de caractères contenant le texte à afficher. Le deuxième paramètre wait indique le temps en millisecondes à attendre avant d'avancer le texte d'un pixel. La bibliothèque s'occupe de tout le reste.

  • boolean updateTicker();
    Cette fonction doit être appelée dans la fonction de boucle pour mettre à jour le téléscripteur.

La bibliothèque contient d'autres fonctions, mais elles ne sont pas utilisées dans ce sketch.

La bibliothèque WebConfig est utilisée pour configurer les données d'accès au WLAN ainsi que d'autres paramètres via un navigateur. La configuration est stockée dans le système de fichiers flash SPIFFS et est conservée même après l'arrêt du microcontrôleur. Seules quelques fonctions de cette bibliothèque sont utilisées dans ce sketch. Une description détaillée est disponible à l'adresse suivante https://github.com/GerLech/WebConfig/blob/master/README.md  ou dans mon Smarthome-Livre.

La bibliothèque WebConfig nécessite la bibliothèque Arduino_JSON, qui doit donc être installée, mais n'est pas incluse dans le sketch.

Le croquis:

#include // bibliothèque pour l'affichage matriciel
#include
// client Web pour recevoir le flux RSS
#include // système de fichiers pour enregistrer la configuration
#include // serveur Web pour la configuration
#include // DNS multidiffusion pour la résolution de nom
#include
// Bibliothèque pour la configuration via une page Web
#include // interprète XML pour lire le flux RSS

#define LEDMatrix_cs_pin 16 // CS PIN de la matrice LED

// Nombre de segments de 8x8 LED
#define LEDMATRIX_SEGMATIONS 4

// Timeout Zum Lesen des RSS-Feed à Sekunden
#define read_timeout 10

// Pramètre Für Das Konfigurations-Formular
Parames de chaîne = "["
  "{"
"'Nom': 'Ssid',"
"'Étiquette': 'Nom des Wlan',"

"'Type':" + String (InputText) + ","
"'défaut':''"
  "},"
  "{"
"'Nom': 'PWD',"
"'Étiquette': 'WLAN Passwort", "
"'Type':" + String (INPUTPASSWORD) + ","
"'défaut':''"
  "},"
  "{"
"Nom ':' rsurl ',"
"'Étiquette':" URL de flux RSS ","
"'Type':" + String (InputText) + ","
"'défaut':''"
  "},"
  "{"
"'Nom': 'NTP',"
"'Étiquette':" serveur NTP ","
"'Type':" + String (InputText) + ","
"'Par défaut': 'de.pool.ntp.org'"
  "},"
  "{"
"'Nom': 'MaxNews',"
"'Étiquette': 'Schlagzeilen',"
"Type ':" + String (InputNumber) + ","
"'Min': 1, 'max': 10,"
"'Par défaut': '1'"
  "},"
  "{"
"'Nom': 'Intens',"
"'Etiquette': 'Helligkeit',"
"Type ':" + String (InputNumber) + ","
"'Min': 1, 'max': 15,"
"'Par défaut': '1'"
  "},"
  "{"
"Nom ':" distinct ","
"'Étiquette': 'Anzeigédauer (s)',"
"Type ':" + String (InputNumber) + ","
"'Min': 1, 'max': 30,"
"'Par défaut': '5'"
  "}"
  "]";

// Server Web Instanz
Serveur WebServer;
// Web Konfigurations Instanz
Webconfig Conf;
// matrice LED Matrix Instanz
LG_MATRIX_PRINT LMD (LEDMatrix_Seégments, LEDMatrix_CS_PIN);
// Interprète XML Instanz
Tinyxml xml;


// globale variablen
uint32_t dernier = 0; // Zeit der Letzten Aktion en MS
uint8_t tampon [2000]; // tampon für xml-interprète
String News [10]; // Speicher für Nachrichten (max. 10)
uint8_t newscnt = 0; // anzahl der aktuellen nachrichten im Speicher
uint8_t cursews = 0; // index der gérade angezeigten nachricht
uint8_t DispMode = 0; // art der anzeige 0 = Zeit, 1 = Datum, 2 = nouvelles;

// Diese Funktion Wird Vom XML-INTERPRÈTE AUFGERUFEN,
// wenn ein xml-tag gelesen wurde
// TAGNAME OVERYLT DEN DEN VOLLSTÄNDIGEN XML-PFAD DES TAGS,
// Data den inhalt des balises
vide xml_callback (UINT8_T StateFlags, Char * TagName, UINT16_T TAGNONEN, CHAR * DATA, UINT16_T Datalen) {
Si (StatutFlags & Status_Tag_Text) {
//Serial.println(Tagname);
// wenn wir einen titel-tag Finden,
// und maximale anzahl der meldungen noch
// Nicht Erreicht ist, Wird Die Meldung Gespeichert
// unditer zähler erhöht
Si (Strcasecmpum (TagName, "/ RSS / Channel / Item / Titre") == 0) {
Data [DataLEN] = '\ 0';
Si (Newscnt // maximale anzahl der Nachrichten wird
// aus der konfiguration gelesen
nouvelles [Newscnt] = données;
Newscnt ++;
      }
    }
  }
}

// wlan verbindung initialisieren
boolean initwifi () {
booléen connecté = faux;
Wifi.mode (wifi_sta);
Série.Print ("verbindung zu");
Serial.Print (Conf.Values ​​[0]);
Série.println ("herstellen");
Si (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;
tandis que ((wifi.status ()! = wl_connected) && (cnt <20)) {
retard (500);
Série.Print (".");
cnt ++;
    }
Série.println ();
Si (wifi.status () == wl_connected) {
Série.Print ("IP-Adresse =");
Série.println (wifi.localip ());
connecté = vrai;
    }
  }
// konnte keine verbindung herestellt werden,
// Wird ein AccessPoint Gestartet
// der Accesspoint chapeau kein passwort. Über die ip-adresse
//192.168.4.1 Kann Die Konfiguration Durchgeführt Werden
Si (! Connecté) {
Wifi.mode (wifi_ap);
Wifi.softap (conf.getapname (), "", 1);
  }
retour connecté;
}

// Funktion Diese Wird Aufgerufen,
// wenn der Webserver eine anfrage erhält
void handleroot () {
// Die anfrage wird a die konfigurationinstanz weitergegeben
Conf.handleformRequest (& Server);
}

// Neue Nachrichten Vom RSS-Feed Lesen
vide getNews () {
Erreur de chaîne = "";
Si (wifi.status () == wl_connected) {
// client http
Httpclient http;
Série.Print ("[http] commence ... \ n");
// URL de la configuration
http.begin (conf.getvalue ("rsurl"));

Série.print ("[http] get ... \ n");
// Envoyer la demande
int httpcode = http.get ();

// httpcode est négatif dans le cas d'une erreur
Si (httpcode> 0) {
// a reçu la réponse http du serveur
Série.printf ("[http] get ... code:% d \ n", httpcode);
Si (httpcode == http_code_ok) {
Chargez la charge utile = http.getstring ();
Xml.reset ();
pour (uint16_t i = 0; i       }
Autre {
Erreur = "Réponses de serveur avec" + chaîne (httpcode);
      }
} Autre {
Erreur = "Réponses de serveur avec" + http.errorostring (httpcode);
    }

http.end ();
Si (Newscnt> 0) {
// si les messages ont été reçus,
// Le premier message est affiché
Cursews = 0;
Lmd.ticker (News [0], 100);
    }
} Autre {
Initwifi ();
Erreur = "Pas de connexion Internet!";
  }
Si (erreur! = "") {
News [0] = erreur;
Newscnt = 1;
Cursews = 0;
Lmd.ticker (News [0], 100);
  }
}


// L'heure actuelle est affichée si le début est vrai
Void showtime (démarrage booléen) {
Si (début) {
Série.println ("Time Démarrage");
Dernier = millis ();
Char STTime [10];
Struct tm timeinfo;
Dispmode = 0;
If (getlocaltime (& timeinfo)) {
Strftime (STTIME, TAILLEOF (STTIME), "% H:% M", & TimeInfo);
Lmd.printtext (0, String (Time));
Lmd.display ();
} Autre {
// Le RTC n'a-t-il aucune valeur qui revient ??: ?? affichage
Lmd.printtext (0, "???");
Lmd.display ();
    }

} Autre {
// si la fin de l'écran a été atteinte
// est commuté à la date
Si ((Millis () - dernier)> (Conf.getint ("Disputime") * 1000)) {
Montrer (vrai);
    }
  }
}

// la date actuelle est affichée si le début est vrai
Vide montrant (démarrage booléen) {
Si (début) {
Série.println ("Date de début");
Dernier = millis ();
Char STTime [10];
Struct tm timeinfo;
Dispmode = 1;
If (getlocaltime (& timeinfo)) {
Strftime (STTIME, TAILLEOF (STTIME), "% D.% B", & TimeInfo);
Lmd.printtext (0, String (Time));
Lmd.display ();
} Autre {
// si le RTC ne fournit aucune valeur ?? ??? affichage
Lmd.printtext (0, "?????");
Lmd.display ();
    }
} Autre {
// si la fin de l'écran a été atteinte
// est basculé sur Nouvelles
Si ((Millis () - dernier)> (Conf.getint ("Disputime") * 1000)) {
Medews (vrai);
    }
  }
}

// un message est affiché si le début est vrai
// les messages sont apportés par le serveur et
// le premier message affiché sinon le prochain
Void Medews (démarrage booléen) {
Si (début) {
Série.println ("Nouvelles start");
Si (cuivez-vous == 0) {
Obtenir des nouvelles ();
} Autre {
Lmd.ticker (Actualités [Turnews], 100);
    }
DISPAMODE = 2;
} Autre {
// Le ticker est mis à jour. Quand la fin du message atteint
// a été activé sur le message suivant.
// L'affichage est basculé en affichage de l'heure
Si (! LMD.UPDATECTING ()) {
Cuivez-vous ++;
Si (cuivez-vous> = NewsCnT) CURNEWS = 0;
Showtime (vrai);
    }
  }
}

// est en cours d'exécution une fois lors du démarrage du programme
Void setup () {
// initialise le système de fichiers et
// sinon pas encore, format
Ciffs.begin (vrai);
// Démarrer l'interface série
Série.begine (115200);
// Initialiser l'interpréteur XML
Xml.init ((uint8_t *) tampon, taille de (tampon) et xml_callback);
// Préparer le formulaire de configuration Web
Conf.setDescription (paramètres);
// Lire la configuration si disponible dans le système de fichiers
Conf.readconfig ();
// Initialiser l'affichage
lmd.setenabled (true);
Lmd.seintensité (Conf.getint ("intens")); // 0 = bas, 10 = élevé
Lmd.clear ();
Lmd.display ();
// Connexion sans fil
Initwifi ();
// Démarrer la multidiffusion DNS
Char DNS [30];
Sprintf (DNS, "% s.local", conf.getapname ());
Si (MDNS.BEGIN (DNS)) {
Série.println ("répondeur MDNS");
  }
// Start Web Server
Serveur.on ("/", handleroot);
Serveur.begin (80);
Retard (1000);
// Si une livraison Internet existe, l'horloge en temps réel de l'ESP32
// Démarrer avec les données à partir du serveur de temps
If (wifi.status () == wl_connected) Conflementaire ("CET-1CEST, M10.5.0 / 03, M10.5.0 / 03", Conf.getvalue ("NTP"));
Showtime (vrai);
}

Vide boucle () {
Si (millis () <dernier) charge = millis ();
// Si un débordement est survenu après environ 50 jours
// Traiter les demandes des demandes du serveur Web
Serveur.HandLeclient ();
// met à jour l'affichage
Switch (DispMode) {
Cas 0: showtime (faux); Casser;
Cas 1: Montredate (Faux); Casser;
Cas 2: Medews (Faux); Casser;
  }
}

Le croquis de téléchargement



Après le démarrage, le programme ne peut pas encore établir une connexion avec le WLAN. Un point d'accès est donc lancé. Son SSID est l'adresse MAC de l'ESP32. Dans les paramètres WLAN du smartphone, vous devriez voir le SSID. Vous pouvez maintenant sélectionner ce réseau et vous y connecter. Le réseau ne nécessite pas de mot de passe. Finalement, le smartphone vous indiquera qu'aucune connexion Internet n'est possible et si vous souhaitez conserver le réseau sélectionné. Dans ce cas, tapez sur Garder.

Vous pouvez maintenant lancer un navigateur et appeler l'URL 192.168.4.1. La page de configuration de l'horloge Matrix devrait apparaître.

Le nom du point d'accès est l'adresse MAC et peut être modifié à volonté. Viennent ensuite les données d'accès au WLAN. Pour l'URL du flux RSS, vous pouvez entrer  https://www.tagesschau.de/newsticker.rdf par exemple.
Le serveur NTP peut rester tel qu'il est. Cependant, la Fritzbox peut également être paramétrée avec fritz.box, par exemple.
Suivent le nombre maximum de titres, la luminosité pour l'affichage et l'heure en secondes, la durée d'affichage de l'heure et de la date.
Enfin, appuyez sur SAUVEGARDER et redémarrer. L'horloge matricielle redémarre et doit maintenant se connecter au WLAN. Dans la sortie sur le moniteur série vous pouvez suivre le login. La page de configuration est alors accessible via l'adresse IP attribuée à l'horloge Matrix par le routeur.

Installation dans un boîtier

Quiconque dispose d'une imprimante 3D peut imprimer un logement adapté. Quatre pièces au total sont nécessaires. Une partie inférieure horloge_fond.stl, un couvercle Horloge_couverture.stl et deux supports pour l'affichage Horloge_Support.stl.

Passons maintenant à l'assemblage. Tout d'abord, la breadboard est équipée des deux connecteurs femelles et du connecteur mâle incliné.


Le câblage suivant est effectué sur le dos.

Vous pouvez maintenant brancher le contrôleur sur les connecteurs femelles et connecter la matrice au contrôleur via le câble à 5 broches. Ici, vous devez faire attention à l'ordre correct des broches.
Après le branchement, c'est le bon moment pour tout revérifier et faire un essai avant de commencer l'installation.


L'étape suivante est l'installation de la matrice et du breadboard dans le boîtier. Pour que la matrice puisse être fixée, les deux supports doivent d'abord être fixés à la matrice.

Maintenant vous pouvez fixer la matrice dans le couvercle et le breadboard dans la partie inférieure.

 

C'est donc ça. L'horloge matricielle avec fil d'actualité est en place.

 

Amusez-vous bien en bricolant.

 La contribution en PDF

DisplaysEsp-32Esp-8266

44 commentaires

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?

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery