Problème tableaux qui s'enregsitrent pas - ESP8266 - Wemos D1

Bonjour,

Je souhaite faire un code avec une carte Wemos D1 qui récupère des données, les enregistre dans 3 tableaux puis sur un site html j'affiche toutes les valeurs de ces 3 tableaux.

Dans le void loop, j'enregistre donc les données dans mon tableau et je serial.print la valeur des tableau pour vérifier que c'est bien enregistré dans le tableau. Et, pas de problème à déclarer.

Ensuite, j'ai deux fonctions dans mon code :
void handlePage1() {
server.send ( 200, "text/html", getPage1());
delay(10);
}

et ensuite j'ai la fonction getPage1() qui contient du code html.
Je demande donc d'afficher sur la page html les valeurs de mes tableaux. Et le problème arrive : il va m'afficher 3 fois de suite la valeur d'un même tableau et non la valeur des 3 tableaux.
Pour vérifier que le problème n'était pas dans le code html, j'ai serial.print les valeurs des tableaux dans la fonction getPage1 et même problème : il print 3 fois la même valeur alors que c'est pas ce que je veux, alors que ma ligne de code Serial.println(trucbidule[i]) est exactement la même que celle dans le void loop().

Pour essayer de résumer plus clairement, dans le void loop j'enregistre des données dans plusieurs tableaux, puis je Serial.print(tableau1[i]) ; Serial.print(tableau2[i]);Serial.print(tableau3[i]); et tout fonctionne bien, j'obtiens par exemple 1 4 8. Quand je remets les ligne Serial.print(tableau1[i]) ; Serial.print(tableau2[i]);Serial.print(tableau3[i]); dans une fonction à côté, alors j'obtiens 3 fois la valeur du premier tableau soit 1 1 1

Comment est-ce possible ? Est-ce que vous avez une idée de pourquoi j'ai cette erreur ? Je bloque depuis un certain temps là-dessus.

Merci beaucoup pour votre temps !

Bonsoir et Bienvenue !!

Il serait préférable de poster ici l'intégralité du code plutôt que de 'résumer' avec des bribes
Pour bien poster le code voir la partie 'Quelques outils' des "Bonnes Pratiques du Forum" (consultation chaudement recommandée aux arrivants !)

Que retourne getPage1() ?

getPage1() retourne un string et ce string correspond à l'ensemble du code html

Ce code est pour un projet d'école, je ne peux donc pas poster l'intégralité de mon code mais je peux répondre à toutes les questions pour essayer de rendre mon problème plus clair

Sur les snippets (Snippets R Us!)

Ou sont définis vos tableaux et comment ? Souci de scope ?

Difficile de jouer au devinettes…

Pourquoi, il y a un NDA?


#include <Ultrasonic.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
Ultrasonic ultrasonic (D7);

//Les tableaux : 
String tab_heure1[]={};
String tab_heure2[]={};
String identifiant[]={};

//Les valeurs :
long longueur;
int numero = 0;

//Les booleens pour le fonctionnement:
boolean hasRun=false;
boolean hasRun2=false;

//Les variables pour l'heure :
const long utcOffsetInSeconds = 3600;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
ESP8266WebServer server (80);

void handleRoot();
String getPage();
void connect_STA(const char *ssid, const char *password );

void setup() {
  connect_STA("blabla", "blabla");
  server.on ( "/", handleRoot );
  server.begin();
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
  }
  timeClient.begin();
}

void loop() {
  server.handleClient();
  timeClient.update();
  delay(10);
  longueur = ultrasonic.MeasureInCentimeters();
  if (longueur<10){
    hasRun2 = false;
    if(hasRun ==false){
      numero = numero+1;
      tab_heure1[numero]=timeClient.getFormattedTime();
      Serial.println(tab_heure1[numero]);
      hasRun = true;
    }
    identifiant[numero] = //valeur qu'on recupe d'un RFID Reader (j'ai pas remis ici le code de comment je recupere cette valeur);
    Serial.println(identifiant[numero]);
  }
  else {
    hasRun = false;
    if(hasRun2 ==false){
      tab_heure2[numero]=timeClient.getFormattedTime();
      Serial.println(tab_heure2[numero]);
      hasRun2 = true;
    }
  }
  delay(200);
}

void handleRoot(){
  server.send ( 200, "text/html", getPage() );
  delay(10);
}

String getPage(){
  String  page = "";
  page += "<!DOCTYPE html>";
  page += "<html>";
  page += "<head><meta http-equiv='Refresh' content='2'; url='/'></head>";
  page += "<body>";
  for (int i = 1; i < numero+1; i++) {
    page += "<tr>";
    page += "<td>" + (String)tab_heure1[i] + "</td>";
    page += "<td>" + (String)tab_heure2[i] + "</td>";
    page += "<td>"+(String)identifiant[i]+"</td></tr> ";
    }
  page += " </tbody>";
  page += " </table> ";
  page += " </body> ";
  page += " </html> ";
  return page;
}
void connect_STA(const char *ssid,const char *password ) {
  //blabla utiluse pour la gestion du mode station
}

J'ai reformé plus ou moins la structure du code pour qu'on puisse mieux voir. J'ai enlevé certaines parties mais elles n'influent pas sur les valeurs des tableaux. Merci beaucoup

Ils ont quelle taille ces tableaux ??

Les indices commencent à 0

Je n'avais pas initialisé de taille car ça dépend de la valeur de ma variable numero.

Mais après ta remarque, j'ai voulu vérifier en précisant une taille et merciiiiii beaucoup, ça a fonctionné ! Je suis pas sure de pourquoi ça fonctionne pas quand on ne précise pas la taille mais je suis contente.
Bonne soirée et encore merci pour votre temps

Parce que lorsque la taille n'est pas connu, il n'y a aucune zone mémoire réservée en mémoire pour y placer les éléments du tableau.

Cette définition crée un simple pointeur pas un tableau

1 Like