Problème code pour LCD

Si c'est le cas, remplacer simplement la partie envoi vers le LCD :

Wire.beginTransmission
// ...
Wire.endTransmission(false);

Par un lcd.print().
Ensuite tester sur la durée.

Bonjour

C'est déjà pas mal ?

Cordialement
jpbbricole

Le principal problème reste la connaissance en matière de programmation.
S'il s'agit d'un projet dans le monde professionnel, une formation en langage C de quelques jours est à prévoir par l'employeur.
Sinon, si c'est un projet personnel, le temps n'a pas d'importance et les tutoriels sont nombreux.

C’est mieux que rien, mais Le besoin semble sur 3 jours ou plus. Le challenge de l’allocation dynamique comme mentionné c’est qu’on ne contrôle pas ce qu’il se passe. Donc peut être que à 21h ça plante ou 75h… ou pas du tout.

Ce que l’on essaye de vous dire c’est que pour un programme un peu sérieux pour lequel il y’a des conséquences (financières, risque, ressources perdues,….) en cas de dysfonctionnement il vaut mieux dès le départ prendre l’habitude d’utiliser des techniques saines de codage pour microcontroller plutôt que d’avoir a tout reprendre ensuite si l’on se rend compte que ça plante au bout de 3 jours à 10 minutes de l’obtention du résultat.
La complexification du code est négligeable une fois qu’on a investi 30 minutes pour comprendre les cStrings et les quelques fonctions associées (et qu’on teste les débordements memoire et cas limites. La gestion des erreurs représente souvent le gros du code pour ce genre de programme)

Pour mes tests je suis parti de ceci :

L'exécution ne semble montrer aucun problème.
Par contre lorsque j'ai modifié la fonction generateRandomString() :

String generateRandomString()
{
  static int counter = 0;
  String result;

  int len = random(SMALLEST_STRING, LARGEST_STRING);
  for (int i = 0 ; i < len ; i++) {
    result += '?';
// AJOUT de la verification de la Ŝtring allouée
    if (result.length() != i+1) {
      Serial.print("count :"); Serial.println(counter);
      Serial.print("wanted :"); Serial.println(len);
      Serial.print("got :"); Serial.println(i);
      Serial.println("TOO BAD");
      while (1);
    }
  }
  counter++;
  return result;
}

Sur une UNO (échec à la 97ème String :

LARGEST_STRING 61
SMALLEST_STRING 12
834 809 3.00
666 542 18.62
612 481 21.41
588 362 38.44
count :97
wanted :52
got :50
TOO BAD

Sur une MEGA c'est un peu plus long (195 String) :

LARGEST_STRING 291
SMALLEST_STRING 58
4043 3963 1.98
3564 3055 14.28
3357 2313 31.10
3085 1777 42.40
2687 1487 44.66
2490 939 62.29
2391 667 72.10
2376 667 71.93
2363 667 71.77
count :195
wanted :286
got :245
TOO BAD

Cela montre bien que String() renvoie une chaîne plus courte que celle espérée si la mémoire manque.

sur UNO et Mega2560, l'allocation de mémoire du tas conserve toujours un __malloc_margin de 128 octets, il y a donc toujours au moins cette quantité d'espace à utiliser pour la pile ce qui permet généralement de garder en vie le programme en cours d'exécution.

Si vous avez beaucoup d'appels de méthodes imbriqués avec beaucoup de variables locales, vous pouvez faire planter le sketch, mais c'est plus rare..

Mais si on ne traite pas les cas de mauvaise allocation (les cas limites) alors on est dans le flou, la string que l’on construit n’est pas celle que l’on pense et le log sera faux par exemple dans le cas de ce programme

Tout à fait.
J'ai rectifié : la UNO s'arrête au bout de 97 String, la MEGA 195.

Comme LCD_string est construite par concaténation, si l'allocateur ne parvient pas à obtenir la mémoire nécessaire (par realloc()), la String restera en l'état.
Donc il n'y aura pas de plantage mais par exemple les infos renvoyées par le serveur WEB risquent d'être tronquées.

https://github.com/arduino/ArduinoCore-API/blob/master/api/String.cpp

Apparemment on a affaire à 3 String :
LCD_string : 4x20 caractères
serial_string : copie de LCD_string + une 40aine de caractères
web_string : copie de LCD_string (on se demande pourquoi)
Le total est de ~ 280 octets.

Dans mon test sur une MEGA j'alloue entre 58 et 291 octets, et le test s'arrête à 195 allocations.
Leur log montre 117 lignes sur 20H.

Effectivement, sur 20H, la limite n'est peut-être pas atteinte, mais sur 40H ?

Bonsoir hbachetti,
es que je remplace la partie cité tout simplement ?:

Je n'ai écrit qu'une partie.
La première ligne du LCD : date et heure
Deuxième ligne du LCD : S0:Ready (ou autre)

A toi de jouer pour le reste.

ok si j'ai bien compris je doit refaire la même chose dans le même style pour la suite

Absolument, en gardant à l'esprit que la variable length doit toujours contenir la longueur courante.
C'est pour cela que 8 est ajouté après avoir écrit ":Ready ".
Lire également la doc de sprintf(), strcat(), strcpy().

merci