Problème d'espace Arduino

Bonjour à vous tous.
Je fais appel à vous pour me conseiller face à un problème de taille.
J’arrive à environ 80% de l’écriture de mon programme mais voilà, je manque sérieusement de place avec mon Arduino MEGA. Voir ci-dessous
//********************************************************************
Compiling ‘Nextion_essai_6’ for ‘ATmega2560 (Mega 2560) (Arduino Mega)’
Program size: 87 834 bytes (used 35% of a 253 952 byte maximum) (26,63 secs)
Minimum Memory Usage: 8457 bytes (103% of a 8192 byte maximum)

Uploading ‘Nextion_essai_6’ to ‘ATmega2560 (Mega 2560) (Arduino Mega)’ using ‘COM3’
The upload process has finished.
//********************************************************************
Pour vous donner une idée, mon programme comporte pour le moment de 5947 lignes.
J’ai optimisé au mieux mon code et je dois maintenant trouver une autre solution.

L’arduino communique avec un afficheur Nextion 7";
commandera 17 sorties;
J’ai besoin d’un grand espace de mémoire EEPROM pour enregistrer les mesures des sondes
(je pense donc ajouter une EEPROM externe pour celà).

Dois-je penser à changer de carte Arduino et si oui, quel carte dois-je prendre?
J’ai pensé à l’Arduino M0 mais pourrais-je la programmer avec mon petit STK500 et ATMEL Studio 7 ?
Il y a aussi l’Arduino DUE, mais je n’ai aucune expérience dans l’utilisation d’une EEPROM externe.

J’attends votre aide et vos lumières sur mon problème bloquant. Toutes aides seront les biens venu.

Nextion_essai_6.ino (202 KB)

STK500.png

"grand espace de mémoire EEPROM"

c'est quoi grand ? et est-ce obligatoirement de l'EEPROM ? pourquoi pas une carte SD ?
faut nous en dire plus...

(et si vous pouvez poster le code on pourra vous dire s'il y a moyen de gagner un peu de place - par exemple en virant les String ou les chaînes qui ne sont pas en mémoire flash - F("....") ou s'il y en a trop :slight_smile: )

Oui, j'avais effectivement l'idée d'une carte SD qui semble plus pratique d'utilisation.
J'ai effectivement des prints mis pour ceux qui peuvent l'être en Mémoire Flash. Vous verrez qu'il y a déjà beaucoup d'espace utilisé pour déclarer les commandes NEXTION.
Merci déjà pour votre retour rapide. Comment vous transmettre le fichier ino?

vous l'attachez en PJ à votre post

éditez votre premier post ci dessus en cliquant sur 'Modify' en bas à droite du post sous 'More'

mod.png

vous devriez vous l'option pour les pièces jointes

mod.png

Fichier ajouté à mon post. Qu'en dite vous? Quoi faire? Quelle carte choisir ou quelle solution?

Personnellement je trouve que la µSD sur ARDUINO souffre de pas mal de défauts de fiabilité. Cela demande pas mal de tests pour trouver la SD qui donne un bon résultat.

Il y a aussi la FLASH SPI.
Une petite W25Q16 à 8 pattes possède un espace de stockage de 16Mbits (2 Mbytes).

Et concernant mon problème d’espace sur la carte Arduino, qu’en pensez-vous?

Le choix est vaste.
Tout dépend du nombre d’entrées / sorties nécessaires.

Puisque tu parles de M0 Je suppose que tu utilises peu de GPIOs et qu’un format UNO sera suffisant.
Attention une M0 s’alimente en 3.3V. Est-ce gênant ?

Il y a aussi les cartes STM32 du style BLUEPILL.

Il faut faire un état des lieux des besoins, des contraintes.

wow ça fait bcp d'includes et vous avez aussi sans doute 200 noms d'élément d'interface dont le nom (genre "btj19") vont manger pas mal d'octets chacun => Réduisez les noms à 2 octets max

Vous avez des tas de fonctions callback dont le code est très similaire. Il doit y avoir moyen de factoriser tout cela.

Vous êtes sur Mega, pourquoi utiliser SoftwareSerial (qui plus est à 115200 bauds) pour le nextion ? ça charge une librairie peu performante alors que vous avec 4 ports séries matériels

A quoi sert String tempString = ""; ?

tous les print de debug devraient être facilement dégagés --> utiliser une macro du genre

#define DEBUG

#ifdef DEBUG
#define D_write(...)    Serial.write(__VA_ARGS__)
#define D_print(...)    Serial.print(__VA_ARGS__)
#define D_println(...)  Serial.println(__VA_ARGS__)
#else
#define D_write(...)
#define D_print(...)
#define D_println(...)
#endif

-->vous pouvez sans doute gratter encore un peu pour que ça continue à rentrer

Je n'ai pas regardé le programme (annoncé comme gros), mais je propose une solution autre, à tout hasard.

Utiliser deux machines.

  • Une Arduino, Méga sans doute si tu as beaucoup d'E/S. Elle sera esclave de l'autre machine. Elle fait le miminum, c-à-d c'est un périphérique d'entrée/sortie.
  • une ESP (je ne connais que l'ESP8266-01, mais on peut monter en gamme) qui contient le coeur du programme, "l'intelligence" du système. C'est le maître. Il a plus de mémoire que l'Arduino.
  • Ils communiquent par ligne série. Le maître envoie des requetes (mesurer entrée ou positionner sortie), l'esclave fait le job et répond.

C'est compiqué en ce sens que ça te fait diviser ton programme en 2, et mettre au point un protocole de comm entre les 2 machines. Mais, c'est évolutif (tu peux remplacer l'ESP par un PC gamer :slight_smile: ). Et, en cas de besoin, ça ajoute le WiFi à ton système.

Bonjour et merci pour toutes vos réponses.
Je vais comme proposé par J-M-L, optimiser encore mon programme en modifiant les noms des éléments et voir comment factoriser les Callback.
Le choix de deux carte me semble aussi intéressante comme proposé par biggil.

Mon choix pencherait plutôt pour le Arduino M0 mais pouvez-vous me dire s’il est pris en charge par le STK500 ? (Voir image ajouté à mon premier Post).

Je pourrais ainsi, laisser l’Arduino MEGA pour les contrôles et les commandes des périphériques et le Arduino M0 pour la gestion de l’afficheur Nextion et les échanges des ordres entre les deux (Nextion et MEGA).

Vous validez ????

Pour répondre à hbachetti, le 3.3V n’est pas gênant pour moi et j’ai besoin de 17 sorties. OUI, ça fait beaucoup mais c’est nécessaire pour mon projet domotique autour d’un aquarium volumineux (minimum 1000 litres)

Pour répondre à hbachetti, le 3.3V n’est pas gênant pour moi et j’ai besoin de 17 sorties. OUI, ça fait beaucoup mais c’est nécessaire pour mon projet domotique autour d’un aquarium volumineux (minimum 1000 litres)

Sans cette précision tu avoueras que c’est difficile de répondre.

Concernant ma M0 il y a bien 20 GPIOs mais cela comprend RX et TX, donc il en reste 18.
D’autre part dans ces 18 GPIOs 6 sont les entrées A0 à A5.
Il faudrait préciser si tes 17 sorties incluent les entrées ADC ou pas.

M0 + STK500 : je ne pense pas, STK500 est destiné aux AVR.
Il faut probablement passer par JLINK ou un autre moyen.

voir comment factoriser les Callback

Une factorisation fera gagner de l'espace en FLASH mais pas en RAM.
Or le problème de dépassement se situe sur la RAM.

Merci pour l'info, je ne connaissait pas le JLINK. J'ai vue qu'il en existe plusieurs à des prix différents (très pour certain) lequel avez-vous? si vous avez un lien.
Concernant les sortie, j'utilise juste des sorties logiques simple et des broches OneWire pour les sondes et les Sonars (Trois sondes de températures et trois Sonars).

J'ai déjà travaillé avec le JLINK Segger mais je n'en possède pas.

Je ne travaille pas avec des ATMEL SAMD21 ou autres, je travaille avec des STM32 donc j'ai un STLINK :

Ces boîtiers se trouvent pour quelques € sur AliExpress.

Mais je ne pense pas qu'Atmel Studio supporte le STLINK.

Il est un peu dommage de travailler avec Atmel Studio, dédié Atmel, cela limite les possibilités.
D'autres IDE sont plus universels comme PlatformIO ou KEIL.

Merci pour tous ces conseils, je viens d'installer PlatformIO et me lance dans les tests pour me familiariser avec ce nouvel éditeur.

Je vous sollicite encore concernant PlatformIO. A la compilation, il ne trouve pas les différentes bibliothèques utilisées dans le programme.

"message": "Erreurs #include détectées. Mettez à jour includePath. Les tildes sont désactivés pour cette unité de traduction (C:\Users\Tophe\Documents\PlatformIO\Projects\Projet_1\src\main.cpp).",

"message": "impossible d'ouvrir le fichier source "NexPage.h"",
et 19 autres (toutes)

Il faut utiliser le gestionnaire de bibliothèques de PaltformIO, l'icône libraries entre le volet de gauche et l'éditeur.

https://docs.platformio.org/en/latest/librarymanager/

Il y a probablement moyen de partager ces librairies entre PaltformIO et autres IDE. Je n'ai pas encore cherché.

Je viens d’essayer de partager une librairie située dans l’IDE ARDUINO en créant un lien symbolique dans le répertoire lib de PlatformIO. Ça marche.

Sous Linux le dossier PlatformIO s’appelle .platformio dans le dossier personnel.
Sous Windows je ne sais pas.

En fait il y a plus simple :

Dans le fichier platformio.ini du projet j'ai ajouté :

[platformio]
lib_dir = /home/username/arduino-1.8.11/libraries

Cela devrait marcher avec un répertoire Atmel Studio ou autre où les librairies sont regroupées.

Très pratique si l'on veut basculer entre IDE ARDUINO et PlatformIO.