string dans une autre boucle

bonjour à tous,

dans mon effort de simplifier mon code,
j'aimerais pouvoir utiliser un string dans une autre boucle
exemple:

/*
 * teste dialogue ESP32 ecran Nextion
 * TX pin nextion => pin D4 esp32
 * RX pin nextion => pin D2 esp32
 * GND relié
 * 
 * 
 * voir pout utiliser librairies de base (itead nextion)
 * 
 * 
 */


// déclaration librairies
#include <Nextion.h>


// déclaration liaison série avec Nestion

Nextion myNextion(Serial1, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps

// déclaration bouton

byte bt0 =0; // bouton on off freecooling

// déclaration zone texte

int temp1 = 20;
int temp2 = 20;
int temp3 = 20;
int temp4 = 20;
byte con1 = 20;
byte con2 = 20;
byte con3 = 20;
byte con4 = 20;
String message; //déclaration variable message

/* fin des déclaration */



void setup() {
  Serial.begin(9600);
  myNextion.init();
  }

void loop() {
  String message = myNextion.listen(); //ecoute le port série depuis nextion
  
   if (message != ""){ // if a message is received...
    Serial.println(message); //...print it out
        }

if (message == "65 1 3 1 ff ff ff") { // bouton plus 1
con1++;
myNextion.setComponentText("con1", String(con1));
}
if (message == "65 1 4 1 ff ff ff") { // bouton moins 1
con1--; 
myNextion.setComponentText("con1", String(con1));
}
if (message == "65 1 8 1 ff ff ff") { // bouton plus 2
con2++;
myNextion.setComponentText("con2", String(con2));
}
if (message == "65 1 9 1 ff ff ff") { // bouton moins 2
con2--;
myNextion.setComponentText("con2", String(con2));
}
if (message == "65 1 a 1 ff ff ff") { // bouton plus 3
con3++; 
myNextion.setComponentText("con3", String(con3));
}
if (message == "65 1 b 1 ff ff ff") { // bouton moins 3
con3--; 
myNextion.setComponentText("con3", String(con3));
}
if (message == "65 1 c 1 ff ff ff") { // bouton plus 4
con4++; 
myNextion.setComponentText("con4", String(con4));
}
if (message == "65 1 d 1 ff ff ff") { // bouton moins 4
con4--;
myNextion.setComponentText("con4", String(con4));
}
if (message == "65 0 a 1 ff ff ff") { // bouton on off freecooling
++bt0; } // bouton etat on off


Serial.println(con1);
  
}

j'aimerais pouvoir déplacer toute la partie

if (message == "65 1 3 1 ff ff ff") { // bouton plus 1
con1++;
myNextion.setComponentText("con1", String(con1));
}
if (message == "65 1 4 1 ff ff ff") { // bouton moins 1
con1--; 
myNextion.setComponentText("con1", String(con1));
}
if (message == "65 1 8 1 ff ff ff") { // bouton plus 2
con2++;
myNextion.setComponentText("con2", String(con2));
}
if (message == "65 1 9 1 ff ff ff") { // bouton moins 2
con2--;
myNextion.setComponentText("con2", String(con2));
}
if (message == "65 1 a 1 ff ff ff") { // bouton plus 3
con3++; 
myNextion.setComponentText("con3", String(con3));
}
if (message == "65 1 b 1 ff ff ff") { // bouton moins 3
con3--; 
myNextion.setComponentText("con3", String(con3));
}
if (message == "65 1 c 1 ff ff ff") { // bouton plus 4
con4++; 
myNextion.setComponentText("con4", String(con4));
}
if (message == "65 1 d 1 ff ff ff") { // bouton moins 4
con4--;
myNextion.setComponentText("con4", String(con4));
}
if (message == "65 0 a 1 ff ff ff") { // bouton on off freecooling
++bt0; } // bouton etat on off

}

dans une autre boucle est l'appeler quand j'ai envie.
du style void getinfo():

pas de soucis pour créé l'autre boucle et l'appeler mais impossible de récupéré la variable message.
il me semble que c'est lié au fait que ce soit un String mais je n'est pas trouvé par quoi la remplacé.

merci a vous

Bonjour,

Il suffit de passer la variable par référence

void getinfo(String &message)

Deux remarques:

  • Il vaut mieux éviter l'utilisation de String qui fragmente la mémoire
  • comment se fait-il que malgré tes 379 messages au compteur tu ne saches toujours pas qu'il faut mettre le code entre balises de code?

merci de l'info pour la variable par référence, j'essaye ça

quel autre solution existe pour remplacer un string ?

je me suis planter j'ai mit des quotes au lieu du code ^^ (c'est modifier, merci)

anthology:
quel autre solution existe pour remplacer un string ?

Utiliser des strings C/C++ qui sont des tableaux de caractères terminés par le caractère \0.
La manipulation est un peu moins simple que l'utilisation des String (voir string.h), mais bien mieux adaptée a la faible ressource mémoire des petits microcontroleurs.

merci pour l'infos je vais voir de ce pas.

pour infos, ce n'est pas sur un arduino mais sur un ESP32
même si ça va quand même fragmenter la mémoire

Salut

Tu devrais être un peu plus serein effectivement avec un ESP32. Tout dépend de la qualité de la gestion du tas.
Mais cela peut se tenter.
Un test de longue durée pourra te rassurer sur ce point.
Je ne pense pas qu'il faille niveler par le bas et se priver d'allocation dynamique si la quantité de mémoire le permet.

Je suis un adepte de PYTHON, y compris sur cible embarquée, et je sais que MICRO-PYTON existe sur ESP32.
D'un point de vue allocation dynamique, ce que tu es en train de faire est une rigolade par rapport à ce qui se passerait en PYTHON. Tu chatouilles à peine la mémoire.

Autant ne pas se priver et se simplifier la vie.

@+

merci de me rassuré,
pour mon infos perso,

peux tu m'expliquer le principe de fragmentation de la mémoire ?

merci

aprés de multiples essais, il y a quelque chose que j'ai pas du comprendre
ci joint mon code suite a tes remarques.

/*
 * teste dialogue ESP32 ecran Nextion
 * TX pin nextion => pin D4 esp32
 * RX pin nextion => pin D2 esp32
 * GND relié
 * 
 * 
 * voir pout utiliser librairies de base (itead nextion)
 * 
 * 
 */


// déclaration librairies
#include <Nextion.h>


// déclaration liaison série avec Nestion

Nextion myNextion(Serial1, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps

// déclaration bouton

byte bt0 =0; // bouton on off freecooling

// déclaration zone texte

int temp1 = 20;
int temp2 = 20;
int temp3 = 20;
int temp4 = 20;
byte con1 = 20;
byte con2 = 20;
byte con3 = 20;
byte con4 = 20;
String message; //déclaration variable message

/* fin des déclaration */



void setup() {
  Serial.begin(9600);
  myNextion.init();
  }

void loop() {
  String message = myNextion.listen(); //ecoute le port série depuis nextion
  
   if (message != ""){ // if a message is received...
    Serial.println(message); //...print it out
    }


void getinfo (String &message);

Serial.println(con1);
  
}

void getinfo()
{

if (message == "65 1 3 1 ff ff ff") { // bouton plus 1
con1++;
myNextion.setComponentText("con1", String(con1));
}
if (message == "65 1 4 1 ff ff ff") { // bouton moins 1
con1--; 
myNextion.setComponentText("con1", String(con1));
}
if (message == "65 1 8 1 ff ff ff") { // bouton plus 2
con2++;
myNextion.setComponentText("con2", String(con2));
}
if (message == "65 1 9 1 ff ff ff") { // bouton moins 2
con2--;
myNextion.setComponentText("con2", String(con2));
}
if (message == "65 1 a 1 ff ff ff") { // bouton plus 3
con3++; 
myNextion.setComponentText("con3", String(con3));
}
if (message == "65 1 b 1 ff ff ff") { // bouton moins 3
con3--; 
myNextion.setComponentText("con3", String(con3));
}
if (message == "65 1 c 1 ff ff ff") { // bouton plus 4
con4++; 
myNextion.setComponentText("con4", String(con4));
}
if (message == "65 1 d 1 ff ff ff") { // bouton moins 4
con4--;
myNextion.setComponentText("con4", String(con4));
}
if (message == "65 0 a 1 ff ff ff") { // bouton on off freecooling
++bt0; } // bouton etat on off


}

du coup si je passe mon String dans un sens,
il faut peut être que je passe mes variables dans l'autre sens non ? (con1, con2 etc)

merci

peux tu m'expliquer le principe de fragmentation de la mémoire ?

C'est comme celle d'un disque dur.
Quand tu changes la valeur d'un String la classe String désalloue l'espace occupé précédemment, réalloue un nouvel espace pour la nouvelle chaîne.
Quand l'allocateur libère l'espace occupé, cela crée un trou.
Si l'application demande une quantité de mémoire différente, si la taille demandée est plus importante que la précédente, il alloue ailleurs.
Si la taille demandée est moins importante que la précédente, il réalloue une partie de ce qu'il a libéré précédemment, donc réduit la taille du trou. Certains allocateurs fonctionnent autrement, ils réallouent systématiquement ailleurs.
Donc au final, lorsque ton application a alloué et libéré quelques milliers de blocs, ton espace mémoire est plein de trous, il est fragmenté.
L'allocateur ARDUINO est certainement moins évolué que celui d'un système LINUX, et comme la quantité de mémoire est très faible, cela crée des problèmes à court terme.

@+

il faut peut être que je passe mes variables dans l'autre sens non ? (con1, con2 etc)

Ces variables sont globales, tu n'as donc pas besoin de les passer en paramètre.

Je remarque dans ton code cette ligne :

  void getinfo (String & message);

C'est un prototype, pas un appel de fonction

Ensuite ta fonction getinfo ne prend pas de paramètre.

void getinfo()

Donc la fonction getinfo n'est pas exécutée car tu ne l'appelles pas.

@+

euh, j'ai pas tout comprit

as tu un exemple pour passer mon message dans la fonction getinfo ?

merci

void loop()
{
void loop() {
  String message = myNextion.listen(); //ecoute le port série depuis nextion
  if (message != "") { // if a message is received...
    Serial.println(message); //...print it out
  }
  // cette ligne est un prototype
  // void getinfo (String &message);
  // cette ligne est un appel de fonction
  getinfo (message);
  Serial.println(con1);
}

void getinfo(String & message)
{

  if (message == "65 1 3 1 ff ff ff") { // bouton plus 1
    con1++;
  // ....

Je remarque également une déclaration globale ligne 36 :

String message; //déclaration variable message

Si tu passes message en paramètre à getinfo tu peux virer cette déclaration.
Elle n'est pas dérangeante mais inutile , ce n'est qu'un tout petit détail.

Question :

Nextion myNextion(Serial1, 9600); //create a Nextion object named myNextion using the nextion serial port @9600bps

Cela veut-il dire que cet écran accepte des baudrates supérieurs ?

merci a toi pour les explications,

le code fonctionne parfaitement maintenant,

pour la déclaration globale, c'était un essaie pour la passer sur mon void getinfo

oui l'écran accepte beaucoup plus mais il est de base a ce baudrate et ça me convient

tu pense que j'ai une utilité a le passer a plus rapide ?

merci

Je me demandais simplement si cela fonctionnait.