Bonjour à tous,
je rencontre un bug sur ARDUINO NANO que je n'arrive pas à résoudre.
Le projet est le suivant :
Je pilote des rubans NEOPIXELS, et des éléments DMX à la fois.
Pour ce faire j'invoque DmxSimple et Adafruit_NeoPixel... enfin vous voyez le topo.
Tout fonctionne à merveille tant que je ne déclare pas plus de 309 LED sur les NEOPIXELS.
Si je déclare 310 ou plus (mon besoin est 400), je perds les NEOPIXELS (mais le reste fonctionne très bien).
Quand je dis je perds, c'est que ça va meme plus loin, je n'ai aucun signal (oscilloscope) sur la pin affectée aux LED.
Je redescend le nombre en dessous de 309, et paf ça remarche. Je n'y comprends rien, d'autant plus que j'ai 2 autres projets un peu similaire avec les mêmes librairies où je n'ai pas ce défaut.
Si je supprime la partie DMX, j'arrive à piloter mes 400LED. Je remet le DMX en service, je suis limité à 309 LED.
Si vous avez une super idée, je vous en remercie.
Si tu déclares toutes tes LED que dit la mémoire lors de la compilation?
Exemple:
Sketch uses 4660 bytes (14%) of program storage space. Maximum is 32256 bytes.
Global variables use 41 bytes (2%) of dynamic memory, leaving 2007 bytes for local variables. Maximum is 2048 bytes.
Tu utilises quelle bibliothèque pour les neopixels?
Fastled par exemple fait une allocation dynamique de mémoire. Dans ce cas tu peux avoir un manque de mémoire bien que le montant se mémoire utilisé à la compilation soit loin de la limite.
Si la RAM est en overflow ça ne plante pas le CPU ?
Pour info, quand le défaut se produit (pas de neopixels commandés), le reste des fonctions est opérationnel.
Non, si malloc() échoue, la mémoire n'est pas allouée.
Tu peux savoir si c'est ça le problème en appelant la méthode numPixels() sur l'instance que tu as essayé de créer. Si la mémoire n'a pu être allouée numPixels() retournera 0 sinon elle retournera le nombre de LEDs que tu avais demandées.
Pour info, pour chaque LED, on alloue 3 octets pour une LED RGB et 4 octets pour une LED RGBW.
Comme l'a dit @fdufnews, il faut exécuter le programme pour la connaitre.
Par contre tu peux afficher dynamiquement la mémoire utilisée. Le plus simple est d'utiliser la bibliothèque MemoryFree