ESP8266 affichage série ne fonctionne pas

Bonjour,

Je suis actuellement en train de créer un afficheur en utilisant un esp8266, et des modules MAX7219, pour l'anniversaire de ma copine.

L'idée étant que l'esp se connecte à son wifi puis affiche des messages que je paramètre sur un site, l'heure, et la météo.

Voici mon code pour le moment :

#include <WifiLocation.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <WiFiManager.h>
#include <Timezone.h>
#include <JSON_Decoder.h>
#include <OpenWeather.h>

TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};     // Central European Summer Time
TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60};       // Central European Standard Time
Timezone CE(CEST, CET);
TimeChangeRule *tcr;

WiFiClient WeatherClient;
unsigned long epochTime;

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");

#define MAX_TOK   100
#define CHAR_SIZE 1024
#define JSON_BUFF_DIMENSION 2500

char* nowT;
char* nowW;
char* tdMinT;
char* tdMaxT;
char* tdW;
char* tmMinT;
char* tmMaxT;
char* tmW;

String text;
int jsonend = 0;
boolean startJson = false;
int currentChar = 0;
static int num;

static char **p;

const char* separator = "§";
int previousTimeShort = millis();
int previousTimeLong = millis();
int updateTimeShort = 60000;
int updateTimeLong = 3600000;
const char server[] = "api.openweathermap.org";
String api_key = "my-key";
const char *cst;

String latitude =  "27.9881"; // 90.0000 to -90.0000 negative for Southern hemisphere
String longitude = "86.9250"; // 180.000 to -180.000 negative for West

String units = "metric";  // or "imperial"
String language = "fr";   // See notes tab






  void initialisation(void){
    timeClient.begin();
    
  }


char **cutString (const char *str,const char *sep ){
    static char *tok [MAX_TOK];
    char  s[800];
    strcpy (s, str);
    tok [0] = strtok (s, sep);
    for (int n = 1; n < MAX_TOK && NULL != (tok [n] = strtok (NULL, sep)); n++)
        ;

    return tok;
}

int count(const char *string, const char *sep){
  int num = 0;
  for(int i =0; i < String(string).length();i++){
    if(string[i]==sep[0]){
    num++;
    }
  }
  return num;
}

char* toChar(String str){
  int size  = str.length()+1;
  static char charList[CHAR_SIZE];
  str.toCharArray(charList,size);
  return charList;

}

const char* httpValue(void){
char * bob = "phrase1§phrase2§phrase3§";
  return bob;
}

void updateDatas(void){
  cst = httpValue();
  num = count(cst,separator);
  p = cutString (cst, separator);
}

char* nextChar(char **p, int num){
  updateP();
  static char ret[512];
  strcpy(ret,p[currentChar]);
  currentChar++;
  if(currentChar >= num){
    currentChar = 0;
  }
  Serial.println(ret);
  return ret;
}

void updateAllShort(void){
  updateDatas();
  timeClient.update();
  epochTime = timeClient.getEpochTime();
  setTimeNow(epochTime);
  Serial.println("UPDATED SHORT");
}

void setTimeNow(unsigned long epoch){
  setTime(epochTime);
  }

char* getTimeNow(void){
  static char buf[20];
  time_t utc = now();
   time_t local = CE.toLocal(utc, &tcr);
   String minutes;
   if(String(minute(local)).length()==1){
    minutes = "0";
    }
    minutes = minutes + String(minute(local));
   
   strcpy (buf,toChar(String(hour(local))+"h"+minutes));
   return buf;
  }


void updateAllLong(void){
    char *pos = updateP();
    parseJson(pos);
    delay(1000);
    Serial.println("UPDATE WEA");
    char *wea = updateW();
    ParseJsonWea(wea);
  Serial.println("UPDATED LONG");
}

void waitForUpdateShort(void){
  if(!(millis() - previousTimeShort < updateTimeShort)){
    previousTimeShort = millis();
    updateAllShort();
  }
}

void waitForUpdateLong(void){
  if(!(millis() - previousTimeLong < updateTimeLong)){
    previousTimeLong = millis();
    updateAllShort();
  }
}


char* updateP(void){
  String positionP;
    HTTPClient http;  //Declare an object of class HTTPClient
    http.begin("http://ipwhois.app/json/");  //Specify request destination
    int httpCode = http.GET();                                  //Send the request
    if (httpCode > 0) { //Check the returning code
      positionP = http.getString();   //Get the request response payload
    }
    http.end();   //Close connection
    int num = positionP.length();
  static char pos[1000];
  positionP.toCharArray(pos,num);
  return pos;
  }

  void parseJson(char* input){
  size_t inputLength= sizeof(input)+1; 

StaticJsonDocument<512> doc;

deserializeJson(doc, input, 512);



const char* city = doc["city"]; // "Sorgues"
latitude = doc["latitude"].as<String>(); // 44.008767
longitude = doc["longitude"].as<String>(); // 4.872757
    }

void setup (){
  Serial.begin (9600);
  WiFiManager wifiManager;
  wifiManager.autoConnect("Afficheur");
  initialisation();
  updateAllShort();
  updateAllLong();      
}

char* updateW(void){
  String weather;
    HTTPClient http;  //Declare an object of class HTTPClient
    http.begin("http://api.openweathermap.org/data/2.5/onecall?lat="+latitude+"&lon="+longitude+"&lang=fr&units=metric&exclude=hourly&appid="+api_key);  //Specify request destination
    int httpCode = http.GET();                                  //Send the request
    if (httpCode > 0) { //Check the returning code
      weather = http.getString();   //Get the request response payload
    }
    http.end();   //Close connection
    int num = weather.length();
    Serial.println(weather);
  static char wea[10000];
  weather.toCharArray(wea,num);
  return wea;
  }

  void ParseJsonWea(char * input){
// size_t inputLength; (optional)

DynamicJsonDocument doc(8192);

DeserializationError error = deserializeJson(doc, input);

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

JsonObject current = doc["current"];
nowT = toChar(current["temp"].as<String>()); // 294.47

JsonObject current_weather_0 = current["weather"][0];
nowW = toChar(current_weather_0["description"].as<String>()); // "few clouds"

JsonArray daily = doc["daily"];

JsonObject daily_0 = daily[0];
JsonObject daily_1 = daily[1];

JsonObject daily_0_temp = daily_0["temp"];
tdMinT = toChar(daily_0_temp["min"].as<String>()); // 11.05
tdMaxT = toChar(daily_0_temp["max"].as<String>()); // 21.39

JsonObject daily_0_weather_0 = daily_0["weather"][0];
tdW = toChar(daily_0_weather_0["description"].as<String>()); // "nuageux"

JsonObject daily_1_temp = daily_1["temp"];
tmMinT = toChar(daily_1_temp["min"].as<String>()); // 11.68
tmMaxT = toChar(daily_1_temp["max"].as<String>()); // 23.74

JsonObject daily_1_weather_0 = daily_1["weather"][0];
tmW = toChar(daily_1_weather_0["description"].as<String>()); // "forte pluie"

}

    


void loop () {
  waitForUpdateShort();
  waitForUpdateLong();
  const char* printe=nextChar(p, num);
  char* timer= getTimeNow();
  //Serial.println(latitude);
  //Serial.println(longitude);
  Serial.println(printe);
  Serial.println(timer);
  Serial.println(nowT);
  delay(1000);
 
}

Actuellement, les messages que je récupère avec httpValue n'affichent que des caractères au hasard. (J'ai ici remplacé la fonction get de mon site par un return tout simple, mais cette partie fonctionne car le print de cette fonction me sort la bonne chaine)
Aussi, le get sur openweather échoue à chaque fois.

Pouvez-vous m'aider à régler ces problèmes s'il vous plait ?
Par la suite, je compte paramétrer l'affichage avec MD Parola, et faire en sorte que tout s'affiche correctement.

Le code final sera en open source et le projet aussi.

Voici mes codes erreur :

21:37:20.929 -> ⸮@⸮8⸮⸮⸮*wm:[1] AutoConnect 
21:37:21.020 -> *wm:[2] Connecting as wifi client... 
21:37:21.067 -> *wm:[2] setSTAConfig static ip not set, skipping 
21:37:21.112 -> *wm:[1] Connecting to SAVED AP: freestano
21:37:21.525 -> *wm:[1] connectTimeout not set, ESP waitForConnectResult... 
21:37:23.207 -> *wm:[2] Connection result: WL_CONNECTED
21:37:23.252 -> *wm:[1] AutoConnect: SUCCESS 
21:37:23.298 -> *wm:[1] STA IP Address: 192.168.0.34
21:37:23.716 -> UPDATED SHORT
21:37:24.881 -> UPDATE WEA
21:37:25.067 -> {"cod":"400","message":"Nothing to geocode"}
21:37:25.114 -> deserializeJson() failed: IncompleteInput
21:37:25.161 -> UPDATED LONG
21:37:25.255 -> 
21:37:25.255 -> 
21:37:25.255 -> 21h37
21:37:26.377 -> 
21:37:26.377 -> 
21:37:26.377 -> 21h37
21:37:27.531 -> =⸮?O@⸮9⸮?"⸮?⸮/⸮?⸮⸮Hf⸮⸮⸮?n
21:37:27.578 -> =⸮?O@⸮9⸮?"⸮?⸮/⸮?⸮⸮Hf⸮⸮⸮?n
21:37:27.578 -> 21h37
21:37:28.680 -> @⸮9⸮?"⸮?⸮/⸮?⸮⸮⸮
21:37:28.680 -> @⸮9⸮?"⸮?⸮/⸮?⸮⸮⸮

Merci d'avance pour l'aide que vous m'apporterez !

Bonjour,

Je ne sais pas si c'est autorisé, mais je me permets un petit up, au moins concernant l'affichage des chaines récupérées par httpValue

Merci beaucoup pour l'aide que vous m'apporterez !

Une première remarque : la fonction retourne l'adresse d'une chaîne sur la pile.
La chaîne devrait être static :
static char * bob = "phrase1§phrase2§phrase3§";

C'est aussi le cas de la chaîne s dans la fonction cutString.