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é.
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.
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.
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.
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 ?