Conflit de librairies Adafruit Neopixel et Wire

Bonjour à tous ,

Je suis un projet d’horloge avec un affichage utilisant un panneau LED RGB flexible de 256 LED (WS2812) .
Je me sers de la librairie d’Adafruit Neopixel.

Le code que je vais vous donner à la fin permet d’afficher des nombres pour un format type HH:mm .
Je simule l’heure pour l’instant via des incrémentations basiques toutes les secondes . Il fonctionne trés bien même s’il mériterait d’être rendu plus propre .

Dans un 2ième programme de test,j’ai un module RTC DS3231 qui fonctionne parfaitement quelque soit la librairie utilisée.A chaque fois il faut ajouter Wire.h pour l’I2C j’imagine.

Là où ça se complique , c’est quand je veux rajouter la partie “RTC” à mon programme de LEDs.

En ajoutant seulement la ligne : #include <Wire.h> et SEULEMENT celle là dans un premier temps cela me bloque mon affichage de LED (soit ça garde la dernière séquence si je ne coupe pas l’alimentation, soit tout est éteint si je coupe l’alimentation ).

Niveau matériel , je suis sur une pro mini 5V 16MHz , j’utilise A4,A5 (SDA et SCL) pour le RTC . Le panneau LED est commandé grâce à une sortie (la 7).
Même si je ne pense pas que ça soit lié au problème, mais le tout est alimenté par une alim 5V 50W .

Si vous avez des pistes …

Le code “prototype” sera finalement dans le message suivant !

Je vais tester avec une Uno pour voir .
Après je peux faire un truc à l’arrache avec 2 cartes communiquant en série : une gérant l’affichage et l’autre le RTC . Mais vu qu’il y a pas mal de projets de ce type , qqun a peut être une idée …

LE code :

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

//#include "Wire.h"  [b] // en enlevant ces commentaires , ça fait bugger l'affichage .[color=red][/color][/b]

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            7

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      256

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 1000; // delay for half a second
int heure_dizaine = 2;
byte heure_unit = 2;
byte minute_dizaine = 3;
byte minute_unit = 4;

//Unité Heures
int unitHeureUN[7]={111,110,109,108,107,106,105};
int unitHeureDEUX[16]={80,95,96,111,110,109,108,99,92,83,84,85,86,89,102,105};
int unitHeureTROIS[16]={80,95,96,111,110,109,108,107,106,105,102,89,86,99,92,83};
int unitHeureQUATRE[13]={80,81,82,83,92,99,108,107,106,105,111,110,109};
int unitHeureCINQ[16]={80,95,96,111,81,82,108,107,106,99,92,83,86,89,102,105};
int unitHeureSIX[15]={80,81,82,83,84,85,86,89,102,105,106,107,108,99,92};
int unitHeureSEPT[10]={80,95,96,111,110,109,108,107,106,105};
int unitHeureHUIT[20]={80,81,82,83,84,85,86,111,110,109,108,107,106,105,92,99,95,96,89,102};
int unitHeureNEUF[15]={80,81,82,83,95,96,92,99,111,110,109,108,107,106,105};
int unitHeureZERO[18]={80,81,82,83,84,85,86,111,110,109,108,107,106,105,95,96,89,102};


// Dizaine Minutes 
int dizaineMinuteZERO[18]={159,158,157,156,155,154,153,166,169,182,181,180,179,178,177,176,175,160};
int dizaineMinuteUN[7]={176,177,178,179,180,181,182};
int dizaineMinuteDEUX[16]={159,160,175,176,177,178,179,172,163,156,155,154,153,169,182,166};
int dizaineMinuteTROIS[16]={159,160,175,176,156,163,172,179,153,166,169,182,177,178,180,181};
int dizaineMinuteQUATRE[13]={159,158,157,156,163,172,179,180,181,182,178,177,176};
int dizaineMinuteCINQ[16]={159,160,175,176,156,172,179,163,153,166,169,182,158,157,180,181};


// Unités Minutes 

int unitMinuteUN[7]={224,225,226,227,228,229,230};
int unitMinuteDEUX[16]={207,208,223,224,204,211,220,227,201,214,217,230,225,226,202,203};
int unitMinuteTROIS[16]={207,208,223,224,204,211,220,227,201,214,217,230,225,226,228,229};
int unitMinuteQUATRE[13]={207,206,205,204,211,220,227,228,229,230,224,225,226};
int unitMinuteCINQ[16]={207,208,223,224,204,211,220,227,201,214,217,230,206,205,228,229};
int unitMinuteSIX[15]={207,206,205,204,203,202,201,227,228,229,230,214,217,211,220};
int unitMinuteSEPT[10]={207,208,223,224,225,226,227,228,229,230};
int unitMinuteHUIT[20]={207,206,205,204,203,202,201,224,225,226,227,228,229,230,214,217,208,223,211,220};
int unitMinuteNEUF[15]={207,206,205,204,224,225,226,227,228,229,230,211,220,208,223};
int unitMinuteZERO[18]={207,206,205,204,203,202,201,224,225,226,227,228,229,230,214,217,208,223};

int red = 10;
int green = 10;
int blue = 10;

int rouge_back = 0;
int vert_back = 0;
int bleu_back= 0;

int i = 0;

La suite à partir du loop :

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
  // End of trinket special code
Serial.begin(9600);
  pixels.begin(); // This initializes the NeoPixel library.
}

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.
//heure_dizaine = 1;



   for(i=0;i<256;i++){ 
 pixels.setPixelColor(i, pixels.Color(rouge_back,vert_back,bleu_back));
  }


pixels.setPixelColor(130, pixels.Color(red,green,blue));
pixels.setPixelColor(132, pixels.Color(red,green,blue));

Serial.println("TEST1");
if(heure_dizaine == 0)
{

  for(i=32;i<39;i++){ 
  pixels.setPixelColor(i, pixels.Color(red,green,blue));
  }

   for(i=57;i<64;i++){ 
 pixels.setPixelColor(i, pixels.Color(red,green,blue));
  }

 
  pixels.setPixelColor(47, pixels.Color(red,green,blue));
  pixels.setPixelColor(48, pixels.Color(red,green,blue));
  pixels.setPixelColor(41, pixels.Color(red,green,blue));
  pixels.setPixelColor(54, pixels.Color(red,green,blue));
// pixels.show();
  }
Serial.println("TEST2");
if(heure_dizaine == 1)
{
   for(i=57;i<64;i++){ 
 pixels.setPixelColor(i, pixels.Color(red,green,blue));
  }
//  pixels.show();
}

Serial.println("TEST3");

if(heure_dizaine == 2)
{

  for(i=35;i<39;i++){ 
  pixels.setPixelColor(i, pixels.Color(red,green,blue));
  }

   for(i=60;i<64;i++){ 
 pixels.setPixelColor(i, pixels.Color(red,green,blue));
  }

  pixels.setPixelColor(44, pixels.Color(red,green,blue));
  pixels.setPixelColor(51, pixels.Color(red,green,blue));

  pixels.setPixelColor(32, pixels.Color(red,green,blue));
  pixels.setPixelColor(47, pixels.Color(red,green,blue));
  pixels.setPixelColor(48, pixels.Color(red,green,blue));

  pixels.setPixelColor(41, pixels.Color(red,green,blue));
  pixels.setPixelColor(54, pixels.Color(red,green,blue));
  pixels.setPixelColor(57, pixels.Color(red,green,blue));
  
}



//Heure unités

if(heure_unit == 1){   for(i=0;i<7;i++){  pixels.setPixelColor(unitHeureUN[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 2){   for(i=0;i<16;i++){  pixels.setPixelColor(unitHeureDEUX[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 3){   for(i=0;i<16;i++){  pixels.setPixelColor(unitHeureTROIS[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 4){   for(i=0;i<13;i++){  pixels.setPixelColor(unitHeureQUATRE[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 5){   for(i=0;i<16;i++){  pixels.setPixelColor(unitHeureCINQ[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 6){   for(i=0;i<15;i++){  pixels.setPixelColor(unitHeureSIX[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 7){   for(i=0;i<10;i++){  pixels.setPixelColor(unitHeureSEPT[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 8){   for(i=0;i<20;i++){  pixels.setPixelColor(unitHeureHUIT[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 9){   for(i=0;i<15;i++){  pixels.setPixelColor(unitHeureNEUF[i], pixels.Color(red,green,blue));  }}
if(heure_unit == 0){   for(i=0;i<18;i++){  pixels.setPixelColor(unitHeureZERO[i], pixels.Color(red,green,blue));  }}


//Minute dizaine 

if(minute_dizaine == 1){   for(i=0;i<7;i++){  pixels.setPixelColor(dizaineMinuteUN[i], pixels.Color(red,green,blue));  }}
if(minute_dizaine == 2){   for(i=0;i<16;i++){  pixels.setPixelColor(dizaineMinuteDEUX[i], pixels.Color(red,green,blue));  }}
if(minute_dizaine == 3){   for(i=0;i<16;i++){  pixels.setPixelColor(dizaineMinuteTROIS[i], pixels.Color(red,green,blue));  }}
if(minute_dizaine == 4){   for(i=0;i<13;i++){  pixels.setPixelColor(dizaineMinuteQUATRE[i], pixels.Color(red,green,blue));  }}
if(minute_dizaine == 5){   for(i=0;i<16;i++){  pixels.setPixelColor(dizaineMinuteCINQ[i], pixels.Color(red,green,blue));  }}
if(minute_dizaine == 0){   for(i=0;i<18;i++){  pixels.setPixelColor(dizaineMinuteZERO[i], pixels.Color(red,green,blue));  }}


//Minute unités

if(minute_unit == 1){     for(i=0;i<7;i++) {  pixels.setPixelColor(unitMinuteUN[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 2){     for(i=0;i<16;i++){  pixels.setPixelColor(unitMinuteDEUX[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 3){     for(i=0;i<16;i++){  pixels.setPixelColor(unitMinuteTROIS[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 4){     for(i=0;i<13;i++){  pixels.setPixelColor(unitMinuteQUATRE[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 5){     for(i=0;i<16;i++){  pixels.setPixelColor(unitMinuteCINQ[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 6){     for(i=0;i<15;i++){  pixels.setPixelColor(unitMinuteSIX[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 7){     for(i=0;i<10;i++){  pixels.setPixelColor(unitMinuteSEPT[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 8){     for(i=0;i<20;i++){  pixels.setPixelColor(unitMinuteHUIT[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 9){     for(i=0;i<15;i++){  pixels.setPixelColor(unitMinuteNEUF[i], pixels.Color(red,green,blue));  }}
if(minute_unit == 0){     for(i=0;i<18;i++){  pixels.setPixelColor(unitMinuteZERO[i], pixels.Color(red,green,blue));  }}

Serial.println("TEST****");
    pixels.show();

    delay(delayval); // Delay for a period of time (in milliseconds).

//DEBUG

heure_dizaine++;if(heure_dizaine>2){heure_dizaine=0;}
heure_unit++;if(heure_unit>9){heure_unit=0;}
minute_dizaine++;if(minute_dizaine>5){minute_dizaine=0;}
minute_unit++;if(minute_unit>9){minute_unit=0;}

Serial.println(heure_dizaine);


}

Tu as publié :

//#include "Wire.h"  [b] // en enlevant ces commentaires , ça fait bugger l'affichage .[color=red][/color[b]

Le compilateur comprend -t-il cette ligne :

//#include "Wire.h"  [b]

Est tu sur que la délimitation de la première marque de formatage "gras" (Bold) (premier Crochet B crochet )est placé du bon coté des marques de début des commentaires ?

Ceci ne fonctionnerait-il pas mieux

//#include "Wire.h" // [b]en enlevant ces commentaires , ça fait bugger l'affichage .[color=red][/color][/b

Et je me pose la question est-ce que ces marques de formatage (gras ou couleur rouge ) font-elle quelques chose ?
Il me semble qu'elle sont complètement inutiles et inopérantes.

En tout cas je te dire qu'elles foutent une vraie me*de dans l'écriture de ma réponse !

La seule chose que fasse la librairie Wire si n'instancie pas d'objet Wire c'est de déclarer des buffer d'émission et de réception.

Donc on pourrait se poser la question de savoir si tu n'utiliserais pas trop de mémoire RAM.
La RAM doit être déjà pas mal utilisée par ton programme qui déclare beaucoup de tableau. Si c'est tableau sont constants, il faudrait peut-être les placer en mémoire programme afin de libérer la RAM en utilisant PROGMEM.
Quelles sont les indications retournées par le compilateur sur l'usage de la mémoire lorsque tu compiles ton programme qui fonctionne?

La seule chose que fasse la librairie Wire si n'instancie pas d'objet Wire c'est de déclarer des buffer d'émission et de réception.

Dans le fichier Wire.h qui est le fichier d'entête de la classe TwoWire il y a une instantiation automatique de l'objet Wire.

extern TwoWire Wire;

68tjs:
Tu as publié :

//#include "Wire.h"  [b] // en enlevant ces commentaires , ça fait bugger l'affichage .[color=red][/color[b]

Le compilateur comprend -t-il cette ligne :

//#include "Wire.h"  [b]

Est tu sur que la délimitation de la première marque de formatage “gras” (Bold) (premier Crochet B crochet )est placé du bon coté des marques de début des commentaires ?

Ceci ne fonctionnerait-il pas mieux

//#include "Wire.h" // [b]en enlevant ces commentaires , ça fait bugger l'affichage .[color=red][/color][/b

Et je me pose la question est-ce que ces marques de formatage (gras ou couleur rouge ) font-elle quelques chose ?
Il me semble qu’elle sont complètement inutiles et inopérantes.

En tout cas je te dire qu’elles foutent une vraie me*de dans l’écriture de ma réponse !

Je n’aurais pas dû les mettre , elles ne font pas partir de mon programme , c’était plus pour vous aider à voir le soucis . Donc dans mon programme , j’ai juste le #include <Wire.h> que je mets en commentaires ou non .

fdufnews:
La seule chose que fasse la librairie Wire si n’instancie pas d’objet Wire c’est de déclarer des buffer d’émission et de réception.

Donc on pourrait se poser la question de savoir si tu n’utiliserais pas trop de mémoire RAM.
La RAM doit être déjà pas mal utilisée par ton programme qui déclare beaucoup de tableau. Si c’est tableau sont constants, il faudrait peut-être les placer en mémoire programme afin de libérer la RAM en utilisant PROGMEM.
Quelles sont les indications retournées par le compilateur sur l’usage de la mémoire lorsque tu compiles ton programme qui fonctionne?

Je vais regarder ça …

68tjs:
Et je me pose la question est-ce que ces marques de formatage (gras ou couleur rouge ) font-elle quelques chose ?
Il me semble qu'elle sont complètement inutiles et inopérantes.

Je pense que les marques ont été ajouté pour mettre les commentaires en évidence sur le forum et non dans le code original. Le problème c'est que les balises de formatage ne fonctionnent pas entre les balises code

Sans #include <Wire.h> :
Donc mon programme utilise 29% de la mémoire
et mes variables globales 50%

Avec : 32% et 60%

A savoir que dans les 2 cas , avec ou sans Wire.h , ca compile sans soucis , c’est plus l’exécution du programme qui m*rde …

68tjs:
Dans le fichier Wire.h qui est le fichier d'entête de la classe TwoWire il y a une instantiation automatique de l'objet Wire.

extern TwoWire Wire;

Est-ce que l'allocation est faite si aucun objet Wire n'est utilisé par ailleurs?

BrUnO14200:
A savoir que dans les 2 cas , avec ou sans Wire.h , ca compile sans soucis , c'est plus l’exécution du programme qui m*rde ..

Cela milite donc pour un problème d'utilisation de la mémoire.

Je viens de faire l'essai. J'ai compilé blink. Si je lui ajoute Wire.h je perds un peu plus de 200 octets de RAM.

Alors effectivement c'était un soucis "mémoire" .

J'ai gagné un peu de place en déclarant mes tableaux en byte et non en int .

Cependant, je ne comprends pourquoi cela bloquait alors que j'utilisais à peine 60% de mémoire dynamique ..
Est ce que c'est la taille de mes variables locales qui posait problème ? Si oui comment connaitre leurs tailles ?

Si qqun peut m'éclairer ..

En tout cas , ça fonctionne !

Merci à tous !