A propos de l'espace utilise par les variable !

Bonjour,

Suite a un poste précédent, " DS3231 insertion variable dans commande ", J-M-L m'avais appris a faire attention au type de variable utilisée.
usage ce char a la place de String etc..

Ici je vais employer un byte comme drapeau dans mon programme.
avant le setup je déclare byte messagetype;
dans ma loop la valeur de messagetype passe a 1 2 3 ou 4 en fonction du message qui sera envoyé.

enfin dans un void message() {}

je vérifie messagetype avec de if

if (mesagetype == 1) {
....
}
et ce pour les 4 message possible.

Bon la ou vraiment je me questionne c'est qu'a chaque if l'espace des variables globales augmente de presque 2%

un case ??? consomme moins ???

et pourquoi avec if sa augmente je n'emploie pourtant qu'une même variable ???

si quelqu’un peut éclairer ma lanterne !!

Merci

Bonjour,

Il n'y a pas de raison que les variables globales augmentent. A mon avis le problème est ailleurs. Il faudrait avoir le source complet.

byte messageType = 0;

void setup() {
  if (messageType == 0) {}  
}
void loop() {}
Le croquis utilise 656 octets (0%) de l'espace de stockage de programmes. Le maximum est de 253 952 octets.
[color=red]Les variables globales utilisent 9 octets[/color] (0%) de mémoire dynamique, ce qui laisse 8 183 octets pour les variables locales. Le maximum est de 8 192 octets.

je peux rajouter autant de if que je veux, je reste avec 9 octets de variables globales.

byte messageType = 0;

void setup() {
  if (messageType == 0) {}  
  if (messageType == 1) {}  
}

void loop() {}
Le croquis utilise 656 octets (0%) de l'espace de stockage de programmes. Le maximum est de 253 952 octets.
[color=red]Les variables globales utilisent 9 octets[/color] (0%) de mémoire dynamique, ce qui laisse 8 183 octets pour les variables locales. Le maximum est de 8 192 octets.

--> il doit y avoir autre chose dans votre code

Je pense que ce n'est pas le if qui consomme des variables globales, c'est ce que tu places entre les accolades.

Voila le code tout a la fin dans void Mail() ; j'ai mis un /* au début du second if et */ a la fin du dernier si je le met pas ma différence est celle ci :

Le croquis utilise 15.960 octets (51%) de l'espace de stockage de programmes. Le maximum est de 30.720 octets.
Les variables globales utilisent 1.631 octets (79%) de mémoire dynamique, ce qui laisse 417 octets pour les variables locales. Le maximum est de 2.048 octets.
La mémoire disponible faible, des problèmes de stabilité pourraient survenir.

Le croquis utilise 15.584 octets (50%) de l'espace de stockage de programmes. Le maximum est de 30.720 octets.
Les variables globales utilisent 1.423 octets (69%) de mémoire dynamique, ce qui laisse 625 octets pour les variables locales. Le maximum est de 2.048 octets.

Merci de votre aide !!!

Ps J-M-L ne me tue pas STP :slight_smile:

Restons sur ma question S'il vous plais et une fois cela réglé je prend toutes les critiques volontier sur le code cela me fera évoluer

alarme.ino (23.1 KB)

Ps J-M-L ne me tue pas STP :slight_smile:

jamais of course - mes critiques se veulent toujours constructives (pour ceux qui veulent apprendre)

Si Quelqu'un le désire une fois le système fini dans sa totalité et le code allégé je ferai un poste dans les projet fini.

Il y a beaucoup de matière usage du NEXTION HMI, ESP8266 01, Interface Android, Arduino Nano, Detecteur d'intrusion filaire Envoie de Mail via ESP , reglage de l'heure via Nextion soit un an de travail le weekend et un peu en semaine !!!

:wink:

c'est parce que dans la partie en commentaire vous avez des chaines de caractères, il faut bien qu'il les range quelque part.

{
    ESP8266.println("[color=red]AT+CIPSEND=4,56[/color]");   //  a changer pour text
    delay(2000);
    ESP8266.println("[color=red]Alarme Intrusion VERROUILLER envoie via Alarme ESP8266[/color]");
    delay (4000);
    }
    if (messagetype == 3)
    {
    ESP8266.println([color=red]"AT+CIPSEND=4,58"[/color]);   //  a changer pour text
    delay(2000);
    ESP8266.println([color=red]"Alarme Intrusion DEVERROUILLER envoie via Alarme ESP8266"[/color]);
    delay (4000);
    }
    if (messagetype == 4)
    {
    ESP8266.println([color=red]"AT+CIPSEND=4,49"[/color]);   //  a changer pour text
    delay(2000);
    ESP8266.println([color=red]"Alarme Intrusion TEST envoie via Alarme ESP8266"[/color]);
    delay (4000);
    }

tout ça prend de la mémoire

1.631 octets versus 1.423 octets c'est 208 octets qui est tout à fait compatible avec toutes les chaines de caractères ajoutées

faudrait utiliser la notation F() pour mettre les chaînes en mémoire programme éventuellement (cf PROGMEM)

il y a aussi bcp de parties dupliquées, au lieu d'envoyer toute la phrase d'un coup vous pourriez faire part petit bouts du genre:

ESP8266.print("AT+CIPSEND=4,");
ESP8266.println(longeurDuMessage); // 56,58 ou 49 en fonction du cas

et en stockant une seule fois en mémoire "AT+CIPSEND=4," bien sûr vous allez réduire

idem pour
"Alarme Intrusion"
"envoie via Alarme ESP8266"
vous n'avez que le mot VERROUILLER, DEVERROUILLER ou TEST qui change mais vous avez déclaré 3 buffer mémoires avec bcp de caractères en commun

ESP8266.print("Alarme Intrusion "); 
ESP8266.print(leMotCleDuMessage); //  VERROUILLER, DEVERROUILLER ou TEST
ESP8266.println(" envoie via Alarme ESP8266");

vous ferait gagner de la place mémoire

avec des if bien placés vous pouvez "factoriser" en envoyer ce qui est commun une seule fois et n'envoyer que les différences suivant le cas

Merci Je revoie le code en tenant compte des infos

Remerci :slight_smile: