ESP8266 antwort von API auf MX7219 anzeigen

Hallo liebe Community :slight_smile:
..seit + - 14 Tagen beschäftige ich mich mit der Programmiersprache C# und verschiedenen Mikrocontroller.

Ich hab mir für den ESP8266 einen Sketch gebastelt der mir alle 15min von newsapi dot org die aktuellen Meldungen abruft und auf der Konsole ausgibt. Das funktioniert ohne Probleme (auch wenns evtl schlecht programmiert ist/ das sagt ihr mir hoffentlich :).

Nun würde ich gerne wissen und verstehen können, wie ich die Nachrichten an das Display schicken kann.
Ich hatte es geschafft mir den Text anzeigen zu lassen mit der P(arola).print funktion, jedoch bekam ich den ScrollEffekt nicht gemeistert.

Nach etlichen verschiedenen Tutorials seh ich jetzt den Wald vor lauter Bäumen nicht mehr und komme in meinem Sketch nicht mehr weiter . Bitte um Hilfe

ESP8266
MD_Parola
MAX7219 /4 devices
ArduinoIDE

Was ich versuche:

  1. Internetverbindung herstellen
  2. alle 15min die aktuellen 5 Top News von newsapi dot org abrufen
  3. die ersten drei Nachrichten auf meinem Display darzustellen
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <MD_MAX72xx.h>
#include <MD_Parola.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   D5 // or SCK
#define DATA_PIN  D7 // or MOSI
#define CS_PIN    D8 // or SS

 

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

// Wlan Zugangsdaten
const char* ssid = "XY";
const char* passwd = "XY";

// Fingerprint 
const char* fingerprint = "XY";

ESP8266WiFiMulti WiFiMulti;

///////////////////////// SETUP ///////////////////////////////////
void setup() {

// Parola Max7219 start
  P.begin();

// starte die Konsole mit einer Baudrate von 115200
  Serial.begin(115200);
  //Serial.setDebugOutput(true);

// Leerzeile(n)
  Serial.println();
  Serial.println();
  Serial.println();

// Countdown
  for (uint8_t t = 6; t > 0; t--) {
    Serial.printf("...%d\n", t);
    Serial.flush();
    delay(1000);
  }

  // Verbinde WiFi
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, passwd);
}


Setze Deinen Code bitte direkt ins Forum, bei Fremdservern sind sie nicht lange vorhanden und dann fehlt hier der Zusammenhang. Benutze dazu Codetags. Wie das geht, steht hier.

Gruß Tommy

1 Like

(post deleted by author)

void loop() {

  // Warte bis die Verbidnung hergestellt wurde
  if ((WiFiMulti.run() == WL_CONNECTED)) {
    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);

    // Setze Fingerabdruck
    client->setFingerprint(fingerprint);
    HTTPClient https;

    Serial.print("\n\nVerbindung wird aufgebaut...\n");
    if (https.begin(*client, "https://newsapi.org/v2/top-headlines?sortBy=popularity&country=de&pageSize=5&apiKey=XY") {
      Serial.print("Sende HTTPS GET request..\n");
 // verbinde und sende header 
      int httpCode = https.GET();

      if (httpCode > 0) {
        // header erfolgreich verschickt und eine Antwort erhalten 
        Serial.printf("Antwort vom Server (responseCode): %d\n", httpCode);

        // Bei erfolgreicher Verbindung speichere die Antwort als Payload
        if (httpCode == HTTP_CODE_OK || httpCode == 200) {

          String payload = https.getString();
//Serial.println(payload);

        // JSON bearbeitung
        DynamicJsonDocument doc(6144);
        DeserializationError error = deserializeJson(doc, payload);

        if (error) {
          Serial.print(F("deserializeJson() failed: "));
          Serial.println(error.f_str());
          return;
        }

        const char* status = doc["status"]; // "ok"
        int totalResults = doc["totalResults"]; // 34

        // Headlines
        const char* title1 = doc["articles"][0]["title"];
        const char* title2 = doc["articles"][1]["title"];
        const char* title3 = doc["articles"][2]["title"];

        // Beschreibung
        const char* desc1 = doc["articles"][0]["description"];
        const char* desc2 = doc["articles"][1]["description"];
        const char* desc3 = doc["articles"][2]["description"];

        // Json object in array ??
        for (JsonObject article : doc["articles"].as<JsonArray>()) {
          const char* article_source_id = article["source"]["id"]; // nullptr, nullptr, "bild", nullptr, ...
          const char* article_source_name = article["source"]["name"]; // "DIE WELT", "Promiflash.de", "Bild", ...
          const char* article_author = article["author"]; // "WELT", "Antonija R.", "BILD", nullptr, "DER SPIEGEL"
          const char* article_title = article["title"]; // "Ukraine-News ++ Ukraines Verteidigungsminister kündigt ...
          const char* article_description = article["description"]; // "Laut dem ukrainischen ...
          const char* article_url = article["url"];
          const char* article_urlToImage = article["urlToImage"];
          const char* article_publishedAt = article["publishedAt"]; // "2022-12-11T21:47:52Z", ...
          const char* article_content = article["content"]; // "Die ukrainischen Streitkräfte werden nach den ...        

        }

        // Ausgabe Konsole 
        Serial.print("\n\n\nNachricht 1 \n\n");
        Serial.printf(title1);
        Serial.printf("\n\nBeschreibung:\n");
        Serial.printf(desc1);
        Serial.printf("\n\n\nNachricht 2\n\n");
        Serial.printf(title2);
        Serial.printf("\n\nBeschreibung:\n");
        Serial.printf(desc2);
        Serial.printf("\n\n\nNachricht 3\n\n");
        Serial.printf(title3);
        Serial.printf("\n\nBeschreibung:\n");
        Serial.printf(desc3);
// Ausgabe Display Max7219
        if(P.displayAnimate()) {
          P.displayScroll(title1, PA_CENTER, PA_SCROLL_LEFT, 100);
          delay(5000);
          P.displayReset();
        }
       }

       // request fehlgeschlagen.. Zeige den Fehlercode          
        } else {
        Serial.printf("Verbindung konnte nicht hergestellt werden, errorCode: %s\n", https.errorToString(httpCode).c_str());
      }
      https.end();
    } else {
      Serial.printf("Verbindung fehlgeschlagen");
    }

  Serial.println("\n\n\nNeue Meldungen in 15min... (API Call limit 100/Tag)");
  delay(900000);
 }
}

Wow und der Compiler schaft C# übersetzen?
Die Sprache im deinem Sketsch ist C++, seltener C

Wenn Du noch die ganzen unnötigen Leerzeilen entfernst, dann ist der Code besser zu lesen.

Gruß Tommy

Ok, danke für den hinweis. :slight_smile:

Das mit den Leerzeichen ist mir auch aufgefallen, sorry werde ich gleich Zuhause tun.
Ist mit dem aktuellen Mobiltelefon etwas schwierig. Ich hoffe der code ist wenigstens etwas leserlich. Mfg

Hi :slight_smile:
Kann es möglich sein, dass der code funktioniert aber nur extrem kurz ausgeführt wird. Sprich, nur zu dem Zeitpunkt in dem auch der api call ausgeführt wird ?
Somit sollte doch die if Abfrage am Anfang oder ende des Loops funktionieren.. (bitte korrigiert mich wenn ich falsch liege).

Wenn ich nämlich am ende der if Abfrage ein delay einbaue, wird der Text dargestellt und beginnt zu scrollen, aber leider schrittweise.
ZB bei einem delay von 3sek, beginnt der Text mit der Scroll-animation.. bewegt sich dann aber nur alle 3sek (je nach angabe im delay) eine Spalte nach links.

// Ausgabe Display Max7219
if(P.displayAnimate()) { 
P.displayScroll(title1, PA_CENTER, PA_SCROLL_LEFT, 100); delay(5000); P.displayReset();} delay(3000);

Dein Programm kann man schlecht nachvollziehen, da wir keinen Zugriff auf die Schlagzeilen des Servers haben. Außerdem habe ich keinen ESP8266, nur einen ESP32.

Wenn ich Dich richtig verstehe, geht es darum, mehrere Textzeilen nacheinender als Laufschrift anzuzeigen. Das habe ich mal ohne WiFi und JSON umgesetzt:

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// Connections for ESP32 hardware SPI are:
// Vcc       3v3    LED matrices seem to work at 3.3V
// GND       GND
#define DIN_PIN   23  // GPIO23 (VSPI MOSI)
#define CS_PIN     5  // GPIO5  (VSPI CS0)
#define CLK_PIN   18  // GPIO18 (VSPI CLK)

// Define the number of devices we have in the chain and the hardware interface
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

#define BUF_SIZE  100
char    curMessage[BUF_SIZE];   // message for this display

uint8_t frameDelay = 50;  // default frame delay value
textEffect_t  scrollEffect = PA_SCROLL_LEFT;

void setup()
{
  P.begin();
  P.displayClear();
  P.displaySuspend(false);
  P.displayScroll(curMessage, PA_LEFT, scrollEffect, frameDelay);

  strcpy(curMessage, "Hallo!");
}

void loop()
{
  char newMessage[][BUF_SIZE] = 
  {
    {"Durchbruch bei Kernfusion"},
    {"Sie gilt als potenzielle Energiequelle der Zukunft."},
    {"Dem US-Energieministerium zufolge gelang einem Forscherteam nun ein Durchbruch."},
  };
  const uint8_t zeilenzahl = 3;
  static uint8_t zeile = 0;
  
  if (P.displayAnimate())
  {
    strcpy(curMessage, newMessage[zeile]);
    zeile = ++zeile < zeilenzahl ? zeile : 0;
    P.displayReset();
  }
}

Ist es das, worum es Dir geht?

Hallo :slight_smile:
vielen Dank für den bsp Sketch.
Wenn ich ehrlich bin kann ich dir noch nicht genau sagen ob er mir weiter helfen kann.

Ich bekomme von der news API die Top 5 Schlagzeilen als Json. Welches ich dann mit dem ArduinoJson assistant bearbeitet und in meinen Sketch eingebaut habe.
Von diesen 5 Schlagzeilen/Nachrichten, sollten die ersten drei auf einem Max7219 angezeigt werden. Da ich nur ein kleines Matrix Display habe sollte der Text nach links scrollen.

Deshalb hatte ich die variable "titel1" (Nachrichtentitel/) und "desc1" (beschreibung/Nachrichtentext) erstellt und versucht diese auf dem Matrix Display durchlaufen zu lassen.

hier die response vom server:

{
  "status": "ok",
  "totalResults": 34,
  "articles": [
    {
      "source": {
        "id": null,
        "name": "watson"
      },
      "author": "Lukas Grybowski",
      "title": "Formel 1: Chancen von Mick Schumacher steigen wieder – Onkel befeuert Gerüchte - watson",
      "description": "Sein Onkel Ralf Schumacher befeuerte mögliche Gerüchte sogar noch ein wenig.",
      "url": "https://www.watson.de/sport/formel 1/242565839-formel-1-chancen-von-mick-schumacher-steigen-wieder-onkel-befeuert-geruechte",
      "urlToImage": "https://www.watson.de/imgdb/3bee/Qx,A,0,84,1999,1125,647,362,333,222/7280693032238477",
      "publishedAt": "2022-12-13T18:07:00Z",
      "content": "Eigentlich startet die kommende Formel-1-Saison erst wieder in vier Monaten, wenn am 5. März in Bahrain um die ersten WM-Punkte gefahren wird. Doch kurz vor Jahresende gab es nochmal einen großen Kna… [+2927 chars]"
    },
    {
      "source": {
        "id": null,
        "name": "Tvmovie.de"
      },
      "author": "Matthias Holm",
      "title": "„Forspoken“: Das PS5-Spiel in der Preview - TVMovie.de",
      "description": "Wir konnten bereits einige Stunden mit dem kommenden PS5-Spiel „Forspoken“ verbringen und verraten, was euch genau bei dem Open",
      "url": "https://www.tvmovie.de/news/forspoken-das-ps5-spiel-in-der-preview-129491",
      "urlToImage": "https://www.tvmovie.de/assets/2022/12/13/92361-forspoken-drache.jpg",
      "publishedAt": "2022-12-13T17:56:40Z",
      "content": "Im Manga- und Anime-Bereich gibt es ein Genre, welches seit einiger Zeit einen absoluten Hype erfährt: Isekai. Hierbei wird eine Person aus der Realität in eine Fantasywelt gezogen, um dort meist als… [+7131 chars]"
    },
    {
      "source": {
        "id": "bild",
        "name": "Bild"
      },
      "author": "BILD",
      "title": "Lena Gercke verkündet Baby-News: Töchterchen Lia ist da! - BILD",
      "description": "Zum Dahinschmelzen … Mit zauberhaften Baby-News meldete sich jetzt Model Lena Gercke (34) auf Instagram bei ihren Fans!",
      "url": "https://www.bild.de/unterhaltung/leute/leute/lena-gercke-verkuendet-baby-news-toechterchen-lia-ist-da-82245616.bild.html",
      "urlToImage": "https://images.bild.de/6398b3190139fb22eb2fcb5f/73a99ed3db5c29eb55f5a1d248242bbb,f07f2737?w=1280",
      "publishedAt": "2022-12-13T17:50:38Z",
      "content": "Zum Dahinschmelzen \r\nMit zauberhaften Baby-News meldete sich Lena Gercke (34) auf Instagram bei ihren Fans: Hier ist sie, schreibt die Gewinnerin der ersten Germanys Next Topmodel-Staffel zu einem Sc… [+1052 chars]"
    },
    {
      "source": {
        "id": null,
        "name": "tagesschau.de"
      },
      "author": "tagesschau",
      "title": "Lkw-Anschlag in Nizza: Hohe Haftstrafen im Terrorprozess - tagesschau.de",
      "description": "2016 tötete ein Mann in Nizza 86 Menschen - kurz nach dem Anschlag wurde er erschossen. Zwei Helfer des Täters wurden nun wegen Beteiligung an einer terroristischen Vereinigung zu jeweils 18 Jahren Haft verurteilt.",
      "url": "https://www.tagesschau.de/ausland/europa/frankreich-nizza-anschlag-urteile-101.html",
      "urlToImage": "https://www.tagesschau.de/multimedia/bilder/gendarmen-gericht-paris-101~_v-original.jpg",
      "publishedAt": "2022-12-13T17:22:00Z",
      "content": "2016 tötete ein Mann in Nizza 86 Menschen - kurz nach dem Anschlag wurde er erschossen. Zwei Helfer des Täters wurden nun wegen Beteiligung an einer terroristischen Vereinigung zu jeweils 18 Jahren H… [+1803 chars]"
    },
    {
      "source": {
        "id": "bild",
        "name": "Bild"
      },
      "author": "John Puthenpurackal",
      "title": "Georgina Fleur: Geheimes Treffen mit Prügel-Ex Kubi! - BILD",
      "description": "Mit diesem Treffen hätte niemand gerechnet! TV-Star Georgina Fleur (31) und ihr Prügel-Ex Kubi. Die Fotos, die exklusiven Statements.",
      "url": "https://www.bild.de/bild-plus/unterhaltung/leute/leute/georgina-fleur-geheimes-treffen-mit-pruegel-ex-kubi-82237858.bild.html",
      "urlToImage": "https://images.bild.de/63984291ee08de2b93f5d202/9e4eec8d44a2c1cc63ab016aefe1e85d,d7e361de?w=1280",
      "publishedAt": "2022-12-13T16:52:45Z",
      "content": "Damit hätte wohl niemand gerechnet: Georgina und Kubi sie treffen sich wieder. Das beweisen Fotos, die BILD vorliegen.\r\nDie große Frage: Haben sie sich wieder vertragen? Zur Erinnerung: Im März wurde… [+321 chars]"
    }
  ]
}

...hab meinen Sketch versucht mit deiner Hilfe anzupassen. Leider ohne Erfolg, kein Text keine aktivität auf dem Display.

Wenn ich jedoch in meinem Sketch, den if teil durch den Befehl

P.print(title1);

ersetze, erscheint auch der Richtige Text auf dem Display. Aber er scrollt dann halt nicht nach links :confused:

Bsp:

// Ausgabe Display Max7219 
//        if(P.displayAnimate()) {
//          P.displayScroll(title1, PA_CENTER, PA_SCROLL_LEFT, 100);
//          delay(5000);
//          P.displayReset();
//        }
P.print(title1);
       }

       // request fehlgeschlagen.. Zeige den Fehlercode          
        } else {
        Serial.printf("Verbindung konnte nicht hergestellt werden, errorCode: %s\n", https.errorToString(httpCode).c_str());
      }
      https.end();
    } else {
      Serial.printf("Verbindung fehlgeschlagen");
    }

  Serial.println("\n\n\nNeue Meldungen in 15min... (API Call limit 100/Tag)");
  delay(900000);
 }
}

...ich werde das Gefühl nicht los, dass es nicht am "code" liegt. Sondern eher die Stelle an der die Anweisung erfolgt.
Habe es jetzt nochmal mit deiner Hilfe(sketch) versucht, evtl mach ich da schon einen Fehler ?
Gleiches Problem wie bei meinem Original Sketch, erst nach ca15min erscheint eine Ausgabe auf dem Display. Die dann auch in der Geschwindigkeit Scrollt ..also alle 15min eine Spalte einrückt.

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <MD_MAX72xx.h>
#include <MD_Parola.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   D5 // or SCK
#define DATA_PIN  D7 // or MOSI
#define CS_PIN    D8 // or SS

// Define the number of devices we have in the chain and the hardware interface
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

#define BUF_SIZE  100
char    curMessage[BUF_SIZE];   // message for this display

uint8_t frameDelay = 50;  // default frame delay value
textEffect_t  scrollEffect = PA_SCROLL_LEFT;

// Wlan Zugangsdaten
const char* ssid = ":)";
const char* passwd = ":)";

// Fingerprint 
const char* fingerprint = "XX";
ESP8266WiFiMulti WiFiMulti;

void setup() {
  
  P.begin();
  P.displayClear();
  P.displaySuspend(false);
  P.displayScroll(curMessage, PA_LEFT, scrollEffect, frameDelay);

  strcpy(curMessage, "Hallo!");
  
// starte die Konsole mit einer Baudrate von 115200
  Serial.begin(115200);
  //Serial.setDebugOutput(true);

// Countdown
  for (uint8_t t = 6; t > 0; t--) {
    Serial.printf("...%d\n", t);
    Serial.flush();
    delay(1000);
  }
  // Verbinde WiFi
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, passwd);
}

void loop() {
  
  // Warte bis die Verbidnung hergestellt wurde
  if ((WiFiMulti.run() == WL_CONNECTED)) {
    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);  
    client->setFingerprint(fingerprint); // Setze Fingerabdruck
    
    HTTPClient https;
     Serial.print("\n\nVerbindung wird aufgebaut...\n");
    if (https.begin(*client, "https://newsapi.org/v2/top-headlines?sortBy=popularity&country=de&pageSize=5&apiKey=:)")) {  // HTTPS
      Serial.print("Sende HTTPS GET request..\n");
      
      // verbinde und sende header 
      int httpCode = https.GET();
      if (httpCode > 0) {
        // header erfolgreich verschickt und eine Antwort erhalten 
        Serial.printf("Antwort vom Server (responseCode): %d\n", httpCode);

        // Bei erfolgreicher Verbindung speichere die Antwort als Payload
        if (httpCode == HTTP_CODE_OK || httpCode == 200) {
          String payload = https.getString();
          //Serial.println(payload);

        // JSON bearbeitung
        DynamicJsonDocument doc(6144);
        DeserializationError error = deserializeJson(doc, payload);
        
        if (error) {
          Serial.print(F("deserializeJson() failed: "));
          Serial.println(error.f_str());
          return;
        }
        
        const char* status = doc["status"]; // "ok"
        int totalResults = doc["totalResults"]; // 34

        // Headlines
        char title1 = doc["articles"][0]["title"];
        //const char* title2 = doc["articles"][1]["title"]; usw..
        
        // Beschreibung
        const char* desc1 = doc["articles"][0]["description"];
        //const char* desc2 = doc["articles"][1]["description"]; usw..

        // Nachricht auf MX7219 anzeigen
        char newMessage[][BUF_SIZE] = 
        {
          {title1},
          {"Sie gilt als potenzielle Energiequelle der Zukunft."},
          {"Dem US-Energieministerium zufolge gelang einem Forscherteam nun ein Durchbruch."},
        };
        const uint8_t zeilenzahl = 3;
        static uint8_t zeile = 0;
        
        if (P.displayAnimate())
          strcpy(curMessage, newMessage[zeile]);
          zeile = ++zeile < zeilenzahl ? zeile : 0;
          P.displayReset();
          }        
        } else {
        // request fehlgeschlagen.. Zeige den Fehlercode
        Serial.printf("Verbindung konnte nicht hergestellt werden, errorCode: %s\n", https.errorToString(httpCode).c_str());
      }
      https.end();
    } else {
      Serial.printf("Verbindung fehlgeschlagen");
      }
  Serial.println("\n\n\nNeue Meldungen in 15min... (API Call limit 100/Tag)");
  delay(900000);
 }
}

Ich habe mal die Antwort aus #12 mit eingebunden, dann sehe ich abwechselnde Texte:

#include <ArduinoJson.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// Connections for ESP32 hardware SPI are:
// Vcc       3v3    LED matrices seem to work at 3.3V
// GND       GND
#define DIN_PIN   23  // GPIO23 (VSPI MOSI)
#define CS_PIN     5  // GPIO5  (VSPI CS0)
#define CLK_PIN   18  // GPIO18 (VSPI CLK)

// Define the number of devices we have in the chain and the hardware interface
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

String payload = R"rawliteral(
{
  "status": "ok",
  "totalResults": 34,
  "articles": [
    {
      "source": {
        "id": null,
        "name": "watson"
      },
      "author": "Lukas Grybowski",
      "title": "Formel 1: Chancen von Mick Schumacher steigen wieder – Onkel befeuert Gerüchte - watson",
      "description": "Sein Onkel Ralf Schumacher befeuerte mögliche Gerüchte sogar noch ein wenig.",
      "url": "https://www.watson.de/sport/formel 1/242565839-formel-1-chancen-von-mick-schumacher-steigen-wieder-onkel-befeuert-geruechte",
      "urlToImage": "https://www.watson.de/imgdb/3bee/Qx,A,0,84,1999,1125,647,362,333,222/7280693032238477",
      "publishedAt": "2022-12-13T18:07:00Z",
      "content": "Eigentlich startet die kommende Formel-1-Saison erst wieder in vier Monaten, wenn am 5. März in Bahrain um die ersten WM-Punkte gefahren wird. Doch kurz vor Jahresende gab es nochmal einen großen Kna… [+2927 chars]"
    },
    {
      "source": {
        "id": null,
        "name": "Tvmovie.de"
      },
      "author": "Matthias Holm",
      "title": "„Forspoken“: Das PS5-Spiel in der Preview - TVMovie.de",
      "description": "Wir konnten bereits einige Stunden mit dem kommenden PS5-Spiel „Forspoken“ verbringen und verraten, was euch genau bei dem Open",
      "url": "https://www.tvmovie.de/news/forspoken-das-ps5-spiel-in-der-preview-129491",
      "urlToImage": "https://www.tvmovie.de/assets/2022/12/13/92361-forspoken-drache.jpg",
      "publishedAt": "2022-12-13T17:56:40Z",
      "content": "Im Manga- und Anime-Bereich gibt es ein Genre, welches seit einiger Zeit einen absoluten Hype erfährt: Isekai. Hierbei wird eine Person aus der Realität in eine Fantasywelt gezogen, um dort meist als… [+7131 chars]"
    },
    {
      "source": {
        "id": "bild",
        "name": "Bild"
      },
      "author": "BILD",
      "title": "Lena Gercke verkündet Baby-News: Töchterchen Lia ist da! - BILD",
      "description": "Zum Dahinschmelzen … Mit zauberhaften Baby-News meldete sich jetzt Model Lena Gercke (34) auf Instagram bei ihren Fans!",
      "url": "https://www.bild.de/unterhaltung/leute/leute/lena-gercke-verkuendet-baby-news-toechterchen-lia-ist-da-82245616.bild.html",
      "urlToImage": "https://images.bild.de/6398b3190139fb22eb2fcb5f/73a99ed3db5c29eb55f5a1d248242bbb,f07f2737?w=1280",
      "publishedAt": "2022-12-13T17:50:38Z",
      "content": "Zum Dahinschmelzen \r\nMit zauberhaften Baby-News meldete sich Lena Gercke (34) auf Instagram bei ihren Fans: Hier ist sie, schreibt die Gewinnerin der ersten Germanys Next Topmodel-Staffel zu einem Sc… [+1052 chars]"
    },
    {
      "source": {
        "id": null,
        "name": "tagesschau.de"
      },
      "author": "tagesschau",
      "title": "Lkw-Anschlag in Nizza: Hohe Haftstrafen im Terrorprozess - tagesschau.de",
      "description": "2016 tötete ein Mann in Nizza 86 Menschen - kurz nach dem Anschlag wurde er erschossen. Zwei Helfer des Täters wurden nun wegen Beteiligung an einer terroristischen Vereinigung zu jeweils 18 Jahren Haft verurteilt.",
      "url": "https://www.tagesschau.de/ausland/europa/frankreich-nizza-anschlag-urteile-101.html",
      "urlToImage": "https://www.tagesschau.de/multimedia/bilder/gendarmen-gericht-paris-101~_v-original.jpg",
      "publishedAt": "2022-12-13T17:22:00Z",
      "content": "2016 tötete ein Mann in Nizza 86 Menschen - kurz nach dem Anschlag wurde er erschossen. Zwei Helfer des Täters wurden nun wegen Beteiligung an einer terroristischen Vereinigung zu jeweils 18 Jahren H… [+1803 chars]"
    },
    {
      "source": {
        "id": "bild",
        "name": "Bild"
      },
      "author": "John Puthenpurackal",
      "title": "Georgina Fleur: Geheimes Treffen mit Prügel-Ex Kubi! - BILD",
      "description": "Mit diesem Treffen hätte niemand gerechnet! TV-Star Georgina Fleur (31) und ihr Prügel-Ex Kubi. Die Fotos, die exklusiven Statements.",
      "url": "https://www.bild.de/bild-plus/unterhaltung/leute/leute/georgina-fleur-geheimes-treffen-mit-pruegel-ex-kubi-82237858.bild.html",
      "urlToImage": "https://images.bild.de/63984291ee08de2b93f5d202/9e4eec8d44a2c1cc63ab016aefe1e85d,d7e361de?w=1280",
      "publishedAt": "2022-12-13T16:52:45Z",
      "content": "Damit hätte wohl niemand gerechnet: Georgina und Kubi sie treffen sich wieder. Das beweisen Fotos, die BILD vorliegen.\r\nDie große Frage: Haben sie sich wieder vertragen? Zur Erinnerung: Im März wurde… [+321 chars]"
    }
  ]
}
)rawliteral";

#define BUF_SIZE  100
char    curMessage[BUF_SIZE];   // message for this display
const uint8_t zeilenzahl = 4;
char newMessage[zeilenzahl][BUF_SIZE] = { {"1"}, {"2"}, {"3"}, {"4"} };

uint8_t frameDelay = 50;  // default frame delay value
textEffect_t  scrollEffect = PA_SCROLL_LEFT;

void setup()
{
  P.begin();
  P.displayClear();
  P.displaySuspend(false);
  P.displayScroll(curMessage, PA_LEFT, scrollEffect, frameDelay);

  strcpy(curMessage, "Hallo!");
}

void loop()
{
  // JSON bearbeitung
  DynamicJsonDocument doc(6144);
  DeserializationError error = deserializeJson(doc, payload);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  //const char* status = doc["status"]; // "ok"
  //int totalResults = doc["totalResults"]; // 34

  // Headlines
  strcpy(newMessage[0], doc["articles"][0]["title"]);
  newMessage[0][BUF_SIZE-1] = '\0';
  strcpy(newMessage[2], doc["articles"][1]["title"]);
  newMessage[2][BUF_SIZE-1] = '\0';

  // Beschreibung
  strcpy(newMessage[1], doc["articles"][0]["description"]);
  newMessage[1][BUF_SIZE-1] = '\0';
  strcpy(newMessage[3], doc["articles"][1]["description"]);
  newMessage[3][BUF_SIZE-1] = '\0';

  static uint8_t zeile = 0;

  if (P.displayAnimate())
  {
    strcpy(curMessage, newMessage[zeile]);
    zeile = ++zeile < zeilenzahl ? zeile : 0;
    P.displayReset();
  }
}
1 Like

Habe über die Funktion millis( ) gelesen und es damit versucht. Jetzt Scrollt der Text. Habe auch eine (wenns richtig gemacht ist?) Globale Variable erstellt die dann in dem loop zugeteilt wurde und später ausgegeben werden soll..

Jedoch wird so die request erst nach 15min ausgeführt, wie ändere ich das am besten?

aktueller Versuch:

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <MD_MAX72xx.h>
#include <MD_Parola.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   D5 // or SCK
#define DATA_PIN  D7 // or MOSI
#define CS_PIN    D8 // or SS

// Define the number of devices we have in the chain and the hardware interface
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

#define BUF_SIZE  100
char    curMessage[BUF_SIZE];   // message for this display

uint8_t frameDelay = 50;  // default frame delay value
textEffect_t  scrollEffect = PA_SCROLL_LEFT;

static char txt;

// Wlan Zugangsdaten
const char* ssid = ":)";
const char* passwd = ":)";

// Fingerprint 
const char* fingerprint = "XX";
ESP8266WiFiMulti WiFiMulti;

unsigned long timeReset = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 5 seconds (5000)
unsigned long timerDelay = 900000;

void setup() {
  
  P.begin();
  P.displayClear();
  P.displaySuspend(false);
  P.displayScroll(curMessage, PA_LEFT, scrollEffect, frameDelay);

  strcpy(curMessage, "News!");
  
// starte die Konsole mit einer Baudrate von 115200
  Serial.begin(115200);
  //Serial.setDebugOutput(true);

// Countdown
  for (uint8_t t = 6; t > 0; t--) {
    Serial.printf("...%d\n", t);
    Serial.flush();
    delay(1000);
  }
  // Verbinde WiFi
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, passwd);
}

void loop() {

   if((millis() - timeReset) > timerDelay) {
  
  // Warte bis die Verbidnung hergestellt wurde
  if ((WiFiMulti.run() == WL_CONNECTED)) {
    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);  
    client->setFingerprint(fingerprint); // Setze Fingerabdruck
    
    HTTPClient https;
     Serial.print("\n\nVerbindung wird aufgebaut...\n");
    if (https.begin(*client, "https://newsapi.org/v2/top-headlines?sortBy=popularity&country=de&pageSize=5&apiKey=:)")) {  // HTTPS
      Serial.print("Sende HTTPS GET request..\n");
      
      // verbinde und sende header 
      int httpCode = https.GET();
      if (httpCode > 0) {
        // header erfolgreich verschickt und eine Antwort erhalten 
        Serial.printf("Antwort vom Server (responseCode): %d\n", httpCode);

        // Bei erfolgreicher Verbindung speichere die Antwort als Payload
        if (httpCode == HTTP_CODE_OK || httpCode == 200) {
          String payload = https.getString();
          //Serial.println(payload);

        // JSON bearbeitung
        DynamicJsonDocument doc(6144);
        DeserializationError error = deserializeJson(doc, payload);
        
        if (error) {
          Serial.print(F("deserializeJson() failed: "));
          Serial.println(error.f_str());
          return;
        }
        
        const char* status = doc["status"]; // "ok"
        int totalResults = doc["totalResults"]; // 34

        // Headlines
        const char title1 = doc["articles"][0]["title"];
        txt = title1;
        //const char* title2 = doc["articles"][1]["title"]; usw..
        
        // Beschreibung
        const char* desc1 = doc["articles"][0]["description"];
        //const char* desc2 = doc["articles"][1]["description"]; usw..

       } else {
        // request fehlgeschlagen.. Zeige den Fehlercode
        Serial.printf("Verbindung konnte nicht hergestellt werden, errorCode: %s\n", https.errorToString(httpCode).c_str());
      }
      https.end();
    } else {
      Serial.printf("Verbindung fehlgeschlagen");
      }
  Serial.println("\n\n\nNeue Meldungen in 15min... (API Call limit 100/Tag)");
 timerDelay = millis();
 }
       }
      }
      // Nachricht auf MX7219 anzeigen
        char newMessage[][BUF_SIZE] = 
        {
          {txt},
          {"Sie gilt als potenzielle Energiequelle der Zukunft."},
          {"Dem US-Energieministerium zufolge gelang einem Forscherteam nun ein Durchbruch."},
        };
        const uint8_t zeilenzahl = 3;
        static uint8_t zeile = 0;
        
        if (P.displayAnimate()) {
          strcpy(curMessage, newMessage[zeile]);
          zeile = ++zeile < zeilenzahl ? zeile : 0;
          P.displayReset();
          }        
}

..ich vermute weil du den Text schon vor dem Setup und loop festgelegt hast ?
Ich bekomme die Daten ja erst nachdem API call im loop.

Nö, gerade probiert, geht auch innerhalb loop().

Hab mich jetzt nochmal an deinem Sketch (post#16) orientiert und versucht .. leider ohne Erfolg.

Hier die Fehlermeldung (Konsole) und mein Sketch mit der Anpassung

20:57:15.327 -> Verbindung wird aufgebaut...
20:57:15.327 -> Sende HTTPS GET request..
20:57:16.822 -> Antwort vom Server (responseCode): 200
20:57:16.888 -> 
20:57:16.888 -> User exception (panic/abort/assert)
20:57:16.888 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <MD_MAX72xx.h>
#include <MD_Parola.h>
#include <SPI.h>

////////////////////////////////////////// Display Settings
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   D5 // or SCK
#define DATA_PIN  D7 // or MOSI
#define CS_PIN    D8 // or SS

// Define the number of devices we have in the chain and the hardware interface
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

#define BUF_SIZE  100
char    curMessage[BUF_SIZE];   // message for this display

const uint8_t zeilenzahl = 4;
char newMessage[zeilenzahl][BUF_SIZE] = { {"1"}, {"2"}, {"3"}, {"4"} };

uint8_t frameDelay = 50;  // default frame delay value
textEffect_t  scrollEffect = PA_SCROLL_LEFT;

/////////////////////////////// Wlan Zugangsdaten
const char* ssid = "xx";
const char* passwd = "xx";

// Fingerprint 
const char* fingerprint = "XX";

ESP8266WiFiMulti WiFiMulti;

void setup() {
  
// Starte Matrix7219 Display  
  P.begin();
  P.displayClear();
  P.displaySuspend(false);
  P.displayScroll(curMessage, PA_LEFT, scrollEffect, frameDelay);
  
  strcpy(curMessage, "Hallo!");
  
// starte die Konsole mit einer Baudrate von 115200
  Serial.begin(115200);
  //Serial.setDebugOutput(true);

// Leerzeile(n)
  Serial.println();
  Serial.println();
  Serial.println();
  
// Countdown
  for (uint8_t t = 6; t > 0; t--) {
    Serial.printf("...%d\n", t);
    Serial.flush();
    delay(1000);
  }
  
  // Verbinde WiFi
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, passwd);
}

void loop() {
  
  // Warte bis die Verbidnung hergestellt wurde
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
    
    // Setze Fingerabdruck
    client->setFingerprint(fingerprint);
    
    HTTPClient https;

    Serial.print("\n\nVerbindung wird aufgebaut...\n");
    if (https.begin(*client, "https://newsapi.org/v2/top-headlines?sortBy=popularity&country=de&pageSize=5&apiKey=xx")) {  // HTTPS

      Serial.print("Sende HTTPS GET request..\n");
      // verbinde und sende header 
      int httpCode = https.GET();

      if (httpCode > 0) {
        // header erfolgreich verschickt und eine Antwort erhalten 
        Serial.printf("Antwort vom Server (responseCode): %d\n", httpCode);

        // Bei erfolgreicher Verbindung speichere die Antwort als Payload
        if (httpCode == HTTP_CODE_OK || httpCode == 200) {
          String payload = https.getString();
          //Serial.println(payload);

        // JSON bearbeitung

        DynamicJsonDocument doc(6144);

        DeserializationError error = deserializeJson(doc, payload);
        
        if (error) {
          Serial.print(F("deserializeJson() failed: "));
          Serial.println(error.f_str());
          return;
        }
       
          // Headlines
          strcpy(newMessage[0], doc["articles"][0]["title"]);
          newMessage[0][BUF_SIZE-1] = '\0';
          strcpy(newMessage[2], doc["articles"][1]["title"]);
          newMessage[2][BUF_SIZE-1] = '\0';
        
          // Beschreibung
          strcpy(newMessage[1], doc["articles"][0]["description"]);
          newMessage[1][BUF_SIZE-1] = '\0';
          strcpy(newMessage[3], doc["articles"][1]["description"]);
          newMessage[3][BUF_SIZE-1] = '\0';
        
          static uint8_t zeile = 0;
  
          if (P.displayAnimate()) {
            strcpy(curMessage, newMessage[zeile]);
            zeile = ++zeile < zeilenzahl ? zeile : 0;
            P.displayReset();
          }
         }
       // request fehlgeschlagen.. Zeige den Fehlercode          
        } else {
        Serial.printf("Verbindung konnte nicht hergestellt werden, errorCode: %s\n", https.errorToString(httpCode).c_str());
      }
      https.end();
    } else {
      Serial.printf("Verbindung fehlgeschlagen");
    }
   
  Serial.println("\n\n\nNeue Meldungen in 15min... (API Call limit 100/Tag)");
  delay(900000);
 }
}

Möglicherweise sind die Meldungen zu lang und müssen abgeschnitten werden:

  // Headlines
  strncpy(newMessage[0], doc["articles"][0]["title"], BUF_SIZE);
  newMessage[0][BUF_SIZE-1] = '\0';
  strncpy(newMessage[2], doc["articles"][1]["title"], BUF_SIZE);
  newMessage[2][BUF_SIZE-1] = '\0';

  // Beschreibung
  strncpy(newMessage[1], doc["articles"][0]["description"], BUF_SIZE);
  newMessage[1][BUF_SIZE-1] = '\0';
  strncpy(newMessage[3], doc["articles"][1]["description"], BUF_SIZE);
  newMessage[3][BUF_SIZE-1] = '\0';