ESP32 invalid header

Bonjour,
Lorsque je monitor mon ESP32 après lui avoir télécharger le programme suivant je vois ce retour: rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

11:21:51.069 -> invalid header: 0xffffffff

11:21:51.113 -> invalid header: 0xffffffff

11:21:51.146 -> invalid header: 0xffffffff

11:21:51.178 -> invalid header: 0xffffffff

11:21:51.264 -> invalid header: 0xffffffff

11:21:51.310 -> invalid header: 0xffffffff

11:21:51.342 -> invalid header: 0xffffffff

11:21:51.375 -> invalid header: 0xffffffff

11:21:51.414 -> ets Jul 29 2019 12:21:46 Et ainsi de suite. J'ai essayer d'effacer le flash avant d'envoyer mon programme aucun changement.

#include "HX711.h"
#include "SD.h"
#include "SPI.h"
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
#include "DHT.h"
#include"Adafruit_Sensor.h"

#include <pthread.h>
#include <ESPAsyncWebServer.h>
#include <WiFi.h>
#include <SPIFFS.h>

#include <ESP32Time.h>

#include <FS.h>

#include <math.h>


const char* ssid = "Ruche 1";
const char* password = "Motdepasse";


AsyncWebServer serveur(80);


IPAddress IP(1,5,20,21);
IPAddress gateway(1,5,20,21);
IPAddress subnet(255,255,255,0);


int pinButton = 27; // Bouton éteint


LiquidCrystal ecran(12, 13, 14, 17, 16, 15);


#define DHTPIN 25
#define DHTTYPE DHT22
#define calibrationFactor 1800
#define chipSelct 5

float poidRuche = 0;
float temperature = 0;
float humidite = 0;


SemaphoreHandle_t mutex = xSemaphoreCreateMutex();


TaskHandle_t Task1;
TaskHandle_t Task2;



void setup() {
//-----------------------------------------------------SERIAL
    Serial.begin(9600);
    Serial.print('12');
    Serial.println("\n");

//-----------------------------------------------------SPIFFS
    if(!SPIFFS.begin()){
        Serial.println("Erreur SPIFFS...");
        return;
    }
    File root = SPIFFS.open("/");
    File file = root.openNextFile();
    while(file){
        Serial.print("File: ");
        Serial.println(file.name());
        file.close();
        file = root.openNextFile();
    }

//-----------------------------------------------------Button wifi
  pinMode(pinButton, INPUT);

//-----------------------------------------------------THREADS

xTaskCreatePinnedToCore(
                    Task1code,   /* Task function. */
                    "Task1",     /* name of task. */
                    10000,       /* Stack size of task */
                    NULL,        /* parameter of the task */
                    1,           /* priority of the task */
                    &Task1,      /* Task handle to keep track of created task */
                    0);          /* pin task to core 0 */ 



xTaskCreatePinnedToCore(
                    Task2code,   /* Task function. */
                    "Task2",     /* name of task. */
                    10000,       /* Stack size of task */
                    NULL,        /* parameter of the task */
                    1,           /* priority of the task */
                    &Task2,      /* Task handle to keep track of created task */
                    1);          /* pin task to core 1 */

}




//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Peut etre a suprimer---------------------------------------------------------------------------

/// Gestion de la requête de téléchargement de fichier
void handleDownload(AsyncWebServerRequest *request) {
    String fileName = request->arg("file");

    // Vérifier si le fichier existe sur la carte SD
    if (!SD.exists(fileName)) {
        request->send(404, "text/plain", "Fichier non trouvé !");
        return;
    }

    // Ouvrir le fichier pour le téléchargement
    File file = SD.open(fileName);
    if (file) {
        request->send(file, fileName, "application/octet-stream"); // Télécharger le fichier
        file.close();
    } else {
        request->send(500, "text/plain", "Erreur lors de l'ouverture du fichier !");
    }
}

// Gestion de la requête de suppression de fichier
void handleDelete(AsyncWebServerRequest *request) {
    String fileName = request->arg("file");

    // Vérifier si le fichier existe sur la carte SD
    if (!SD.exists(fileName)) {
        request->send(404, "text/plain", "Fichier non trouvé !");
        return;
    }

    // Supprimer le fichier
    if (SD.remove(fileName)) {
        request->send(200, "text/plain", "Fichier supprimé avec succès !");
    } else {
        request->send(500, "text/plain", "Erreur lors de la suppression du fichier !");
    }
}

// Gestion de la requête pour récupérer la liste des fichiers sur la carte SD
void handleFileList(AsyncWebServerRequest *request) {
    String fileList = "";

    File root = SD.open("/");
    while (File file = root.openNextFile()) {
        fileList += file.name();
        fileList += " ";
        fileList += String(file.size());
        fileList += "\n";
        file.close();
    }

    request->send(200, "text/plain", fileList);
}

//Peut etre a supprimer---------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------


// Fonction coeur 0:
void Task1code( void * pvParameters ){
  pinMode(pinButton, INPUT_PULLUP);
  while(true){
    int stateButton = digitalRead(pinButton);
    if (stateButton == LOW && WiFi.status()==WL_DISCONNECTED){
      //-----------------------------------------------------WIFI
      WiFi.softAP(ssid, password);
      delay(500);
      WiFi.softAPConfig(IP, gateway, subnet);
      delay(500);
      Serial.print("Adresse IP: ");
      Serial.println(WiFi.softAPIP());





      //-----------------------------------------------------SERVEUR
      serveur.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
          request->send(SPIFFS, "/index.html", "text/html");
      });

      serveur.on("/w3.css", HTTP_GET, [](AsyncWebServerRequest *request){
          request->send(SPIFFS, "/w3.css", "text/css");
      });

      serveur.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request){
          request->send(SPIFFS, "/script.js", "text/javascript");
      });

      serveur.on("/lirePoids", HTTP_GET, [](AsyncWebServerRequest *request){
          String poidRuch = String(poidRuche);
          request->send(200, "text/plain", poidRuch);
      });

      serveur.on("/lireHumidite", HTTP_GET, [](AsyncWebServerRequest *request){
          String humidit = String(humidite);
          request->send(200, "text/plain", humidit);
      });

      serveur.on("/liretemperature", HTTP_GET, [](AsyncWebServerRequest *request){
          String temperatur = String(temperature);
          request->send(200, "text/plain", temperatur);
      });



//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Peut etre a suprimer---------------------------------------------------------------------------

      serveur.on("/dossierSD.html", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/dossierSD.html");
  });

      serveur.on("/api/download", HTTP_GET, handleDownload);
      serveur.on("/api/delete", HTTP_POST, handleDelete);
      serveur.on("/api/files", HTTP_GET, handleFileList);
//Peut etre a supprimer---------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------

      serveur.begin();
      delay(500);
      Serial.println("Serveur actif");
    }

    if (stateButton !=LOW && WiFi.status()==WL_CONNECTED){
      WiFi.disconnect();
    }
  }
}









// Fonction coeur 1:
void Task2code( void * pvParameters ){
  //-----------------------------------------------------Date et heure
  Serial.begin(9600);
  SD.begin(chipSelct);
  ESP32Time rtc(3600);
  int secondes = 0;
  int minutes = 0;
  int heures = 0;
  int jour = 2;
  int mois = 8;
  int annee = 2023-1;
  rtc.setTime(secondes, minutes, heures, jour, mois, annee);
  
  String dateAndTime;

  int nombreEnregistrementsParJour=8;


  int timeHeure;
  int timeMinute;
  int timeSeconde;

  int dernierEnregistrementH;
  int dernierEnregistrementM;
  int dernierEnregistrementS;

  int tempsEnregistrementH;
  int tempsEnregistrementM;
  int tempsEnregistrementS;

  String nomDossier;
  String nomFichier;
  String cheminAccesFichier;
  String texteData;
  File fichier;
  DHT dht(DHTPIN, DHTTYPE);
  HX711 scale;
  scale.begin(16, 4);
  scale.set_scale(calibrationFactor);
  
  ecran.begin(3, 2);

  int nbSecondeAvantEnregistrement=floor(24*60*60/nombreEnregistrementsParJour);
  
  tempsEnregistrementH= (nbSecondeAvantEnregistrement/3600);
  nbSecondeAvantEnregistrement%3600;
  tempsEnregistrementM= nbSecondeAvantEnregistrement/60;
  tempsEnregistrementS= nbSecondeAvantEnregistrement%60;


  while(true){
    ecran.clear();
    if (xSemaphoreTake(mutex, 200)==1){
      temperature = dht.readTemperature();
      humidite = dht.readHumidity();
      poidRuche = round(scale.get_units()*1000)/1000.0;

      if (isnan(humidite) || isnan(temperature)) {
        humidite=-1;
        temperature=-1;
        Serial.println("Impossible de lire le capteur de temperature et d'humiditée (DHT22)");
      }
      xSemaphoreGive(mutex);
    }
    
    ecran.setCursor(0, 0);
    ecran.print("Poids: ");
    ecran.print(poidRuche, 3);
    ecran.print("Kg");
    ecran.setCursor(0, 1);
    ecran.print("Température: ");
    ecran.print(temperature);
    ecran.print("°C ");
    ecran.print(" Humidité: ");
    ecran.print(humidite, 2);
    ecran.print("%");

    dateAndTime = rtc.getTime("%D, %H:%M:%S");
    timeHeure = rtc.getTime("%H").toInt();
    timeMinute = rtc.getTime("%M").toInt();
    timeSeconde = rtc.getTime("%S").toInt();
    nomDossier = "/" + rtc.getTime("%G");
    nomFichier = "/" + rtc.getTime("%m")+String(".txt");
    cheminAccesFichier = nomDossier + nomFichier;
    texteData = dateAndTime + " Poids:" + String(poidRuche) + " Température:" + String(temperature) + " Humidité:" + String(humidite);
    if (timeHeure - dernierEnregistrementH >= tempsEnregistrementH && timeMinute - dernierEnregistrementM >= tempsEnregistrementM && timeSeconde - dernierEnregistrementS == tempsEnregistrementS){
      if (SD.exists(nomDossier)){
        if (SD.exists(cheminAccesFichier)){
          fichier = SD.open(cheminAccesFichier, FILE_APPEND);
          fichier.println(texteData);
          fichier.close();
        }
        else{
          fichier = SD.open(cheminAccesFichier, FILE_WRITE);
          fichier.close();
          fichier = SD.open(cheminAccesFichier, FILE_APPEND);
          fichier.println(texteData);
          fichier.close();
        }
      }
      else{
        SD.mkdir(nomDossier);
        if (SD.exists(cheminAccesFichier)){
          fichier = SD.open(cheminAccesFichier, FILE_APPEND);
          fichier.println(texteData);
          fichier.close();
        }
        else{
          fichier = SD.open(cheminAccesFichier, FILE_WRITE);
          fichier.close();
          fichier = SD.open(cheminAccesFichier, FILE_APPEND);
          fichier.println(texteData);
          fichier.close();
        }
      }
    }
    delay(2000);
    
  }
}






void loop() {

}

Si vous avez une idée concernant le problème, merci d'avance de m'en faire part.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Comme indiqué dans les bonnes pratiques du forum, merci d'éditer le post et de mettre le code entre balises

Bonjour thomas5976,
Quel message as-tu lors du téléversement de ton programme ?

Bonjour Tropratik,
Il ne s'agit pas d'un problème rencontré lors du téléverserment car tout se passe bien mais d'un problème lorsque lesp32 boot sur mon programme. J'ai par ailleurs vérifier que le problème ne venait pas de mon esp32 en mettant un programme on ne peut plus simple dedans pour afficher en boucle bonjour.

J'ai compilé et transféré le programme dan mon ESP32 Dev, et l'erreur ne se produit pas chez moi.
Il s'agit probablement d'un problème de partitionnement.

Et du coup une idée de comment résoudre ce petit problème? Je débute vraiment en programmation "avancé" en Arduino.

Commencer par un programme simple avec SPIFFS et le partitionnement associé.
Puis ajouter les lignes de code progressivement (morceau par morceau).

Je vais essayer de tester cela dans la soirée. Je reviendrai pour vous dire si cela a marché. Et j'ai une autre question concernant l'enregistrement des données. Lorsque je met un petit programme de test il ne voit pas ma carte sd:

#include <SD.h>
#include <SPI.h>

File myFile;

void setup() {
  // Initialise la communication série à 9600 bauds
  Serial.begin(9600);

  // Initialise la carte SD
  if (!SD.begin(10)) {
    // Si la carte SD n'est pas détectée, affiche un message d'erreur et quitte
    Serial.println("Carte SD non détectée.");
    return;
  }

  // Si la carte SD est détectée, ouvre ou crée un fichier nommé "data.txt"
  myFile = SD.open("data.txt", FILE_WRITE);

  // Si le fichier est correctement ouvert, écris du texte aléatoire à l'intérieur
  if (myFile) {
    Serial.println("Création du fichier...");
    String randomText = generateRandomText();
    myFile.println(randomText);
    myFile.close();
    Serial.println("Fichier créé avec succès !");
  } else {
    // Si le fichier ne peut pas être ouvert, affiche un message d'erreur
    Serial.println("Erreur lors de l'ouverture du fichier.");
  }
}

void loop() {
  // Le programme s'arrête ici après avoir créé le fichier
}

String generateRandomText() {
  // Génère un texte aléatoire de 100 caractères
  String randomText = "";
  for (int i = 0; i < 100; i++) {
    char randomChar = random(33, 127); // Caractères ASCII imprimables
    randomText += randomChar;
  }
  return randomText;
}

Elle est pourtant adapté au module que j'utilise et par moment, il la détecte mais n'arrive pas a ouvrir un fichier.

Je pense que ce lien pourras t'aider lien. Il expliquer l'utilisation d'un module de carte Micro SD avec l'ESP32.

J'ai regarder sur ton site et la carte sd marche bien avec le code que tu donne dessus (cela me rassure un peu, le matériel marche mais pas l'utilisateur). Maintenant, il ne me reste plus qu'à débuguer mon programme pour résoudre mon problème qui est peut être lié a la gestion de mes threads. Car un programme sans threads s’exécute mais pas a partir du moment ou je laisse une de mes deux parties de gestions de threads.
Si tu as une idée pour m'en passer. Sachant qu'une des contraintes est que je doit pouvoir utiliser le serveur web sans pour autant que cela stop l'enregistrement des données qui doit être régulier. Et une autre contrainte est l'économie d'énergie (d’où le bouton de mise en marche du wifi et du serveur).

Avec le multi thread, tu ne peux associer une ressource matérielle qu'à 1 seul thread. Ce qui n'est pas le cas de ton code avec l'écran LCD puisque tu l'initialise dans la tâche mère.
De la même manière je ne pense pas que tu puisse déclarer ton server Web dans la tâche mère et l'utiliser dans une tâche fille.

Bref le multi-thread c'est compliqué je te conseille plutôt du mono-thread avec un appel non bloquant sur la lecture des sondes.

En effet, je vais réécrire mon code en mono thread mais je pense que le problème vient aussi de platformio car meme un code simple rencontre un problème de headers alors que pas sur arduino ide.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.