Problème de débutant arduino + WS2812

Bonjour,

je débutes totalement sur la plateforme Arduino UNO…
J’ai suivis un tuto pour mettre en place de l’Ambilight avec mon RPI2 et Libreelec.

Je penses avoir suivis les étapes correctement mais j’obtiens une erreur dans mon code…

Quelqu’un pourrait relire mon code et m’aider?

#include "Adafruit_NeoPixel.h"

// DEFINITIONS

#define STARTCOLOR 0xFFFFFF  // LED colors at start
#define BLACK      0x000000  // LED color BLACK

#define DATAPIN    13        // Datapin
#define LEDCOUNT   221       // Number of LEDs used for boblight
#define SHOWDELAY  200       // Delay in micro seconds before showing
#define BAUDRATE   500000    // Serial port speed, 460800 tested with Arduino Uno R3
#define BRIGHTNESS 80        // Max. brightness in %

const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0xDD, 0x88};  // Start prefix
char buffer[sizeof(prefix)]; // Temp buffer for receiving prefix data 

// Init LED strand, WS2811/WS2912 specific

// These might work for other configurations:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCOUNT, DATAPIN, NEO_GRB + NEO_KHZ800);

int state;                   // Define current state
#define STATE_WAITING   1    // - Waiting for prefix
#define STATE_DO_PREFIX 2    // - Processing prefix
#define STATE_DO_DATA   3    // - Receiving LED colors

int readSerial;           // Read Serial data (1)
int currentLED;           // Needed for assigning the color to the right LED

void setup()
{
 strip.begin();            // Init LED strand, set all black, then all to startcolor

 strip.setBrightness( (255 / 100) * BRIGHTNESS );

 setAllLEDs(BLACK, 0);
 setAllLEDs(STARTCOLOR, 5);

 Serial.begin(BAUDRATE);   // Init serial speed

 state = STATE_WAITING;    // Initial state: Waiting for prefix
}

void loop()
{
 switch(state)
 {
   case STATE_WAITING:                  // *** Waiting for prefix ***
     if( Serial.available()>0 )
     {
       readSerial = Serial.read();      // Read one character

       if ( readSerial == prefix[0] )   // if this character is 1st prefix char
         { state = STATE_DO_PREFIX; }   // then set state to handle prefix
     }
     break;

   case STATE_DO_PREFIX:                // *** Processing Prefix ***
     if( Serial.available() > sizeof(prefix) - 2 ) 
     {
         Serial.readBytes(buffer, sizeof(prefix) - 1);

         for( int Counter = 0; Counter < sizeof(prefix) - 1; Counter++) 
         {
           if( buffer[Counter] == prefix[Counter+1] ) 
           {
             state = STATE_DO_DATA;     // Received character is in prefix, continue
             currentLED = 0;            // Set current LED to the first one
           }
           else 
           {
             state = STATE_WAITING;     // Crap, one of the received chars is NOT in the prefix
             break;                     // Exit, to go back to waiting for the prefix
           } // end if buffer
         } // end for Counter
     } // end if Serial
     break;

   case STATE_DO_DATA:                  // *** Process incoming color data ***
     if( Serial.available() > 2 )       // if we receive more than 2 chars
     {
       Serial.readBytes( buffer, 3 );   // Abuse buffer to temp store 3 charaters
       strip.setPixelColor( currentLED++, buffer[0], buffer[1], buffer[2]);  // and assing to LEDs
     }

     if( currentLED > LEDCOUNT )        // Reached the last LED? Display it!
     {
         strip.show();                  // Make colors visible
         delayMicroseconds(SHOWDELAY);  // Wait a few micro seconds

         state = STATE_WAITING;         // Reset to waiting ...
         currentLED = 0;                // and go to LED one

         break;                         // and exit ... and do it all over again
     }
     break; 
 } // switch(state)

} // loop

// Sets the color of all LEDs in the strand to 'color'
// If 'wait'>0 then it will show a swipe from start to end
void setAllLEDs(uint32_t color, int wait)
{
 for ( int Counter=0; Counter < LEDCOUNT; Counter++ )      // For each LED
 {
   strip.setPixelColor( Counter, color );      // .. set the color

   if( wait > 0 )                        // if a wait time was set then
   {
     strip.show();                     // Show the LED color
     delay(wait);                      // and wait before we do the next LED
   } // if wait

 } // for Counter

 strip.show();                         // Show all LEDs
} // setAllLEDs

Et j’obtiens l’erreur suivantes:

Les options de compilation ont été modifiées, tout sera recompilé
sketch_apr01a:23:58: error: narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0xDD, 0x88};  // Start prefix

                                                         ^

sketch_apr01a:23:58: error: narrowing conversion of '136' from 'int' to 'char' inside { } [-Wnarrowing]

exit status 1
narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

Je suis un peu perdu là…

Merci à ceux qui m’aideront :grin:

Essayechar readSerial;           // Read Serial data (1)à la place deint readSerial;           // Read Serial data (1)

Astina: Je penses avoir suivis les étapes correctement ...

Bonsoir ... pour bien poster ici ? , je ne pense pas tu a bien évidemment préalablement lu çà ? Tu n'est peut être pas un "boutonneux à baK de l'année" :grin:

Mais çà ne te dispense pas des "petites règles"

Une des plus importantes : mettre le code entre balises

Je suis d'ailleurs étonné, que tu ai reçu une première réponse , ne te rappelant pas immédiatement çà ;)

TIC TAC enclenché

Bonjour Artouste,

j’espère que l'édition de mon premier message te convient! Je te présente mes plus humbles excuses pour l'omission de la lecture agréable de ton lien.

Bonjour lesept,

pour en revenir au sujet de ce topic, j'ai appliqué ton changement mais j'obtiens ceci:

sketch_apr01a:23:58: error: narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

 const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0xDD, 0x88};  // Start prefix

                                                          ^

sketch_apr01a:23:58: error: narrowing conversion of '136' from 'int' to 'char' inside { } [-Wnarrowing]

exit status 1
narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

Mais je te remercie pour ton essai et ton accueil sur ce forum!

Je suis surpris, chez moi ce code compile sans erreur. Il y a seulement un warning

C:\Users\F212007\Documents\Arduino\sketch_apr02a\sketch_apr02a.ino:14:58: warning: narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0xDD, 0x88}; // Start prefix

^

C:\Users\F212007\Documents\Arduino\sketch_apr02a\sketch_apr02a.ino:14:58: warning: narrowing conversion of '136' from 'int' to 'char' inside { } [-Wnarrowing]

.....

Le croquis utilise 4286 octets (13%) de l'espace de stockage de programmes. Le maximum est de 30720 octets. Les variables globales utilisent 231 octets (11%) de mémoire dynamique, ce qui laisse 1817 octets pour les variables locales. Le maximum est de 2048 octets.

On peut supprimer ce warning en changeant le type du tableau

const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0xDD, 0x88};  // Start prefix

par

const unsigned char prefix[] = {0x41, 0x64, 0x61, 0x00, 0xDD, 0x88};  // Start prefix

Les options de compilation ont été modifiées, tout sera recompilé

Il y a ce message au début de ton compte-rendu de compilation. Quelles options de compilation as-tu changées? Pour quelle plateforme compiles-tu ?

Alors fdufnews, MERCI!

En modifiant la ligne que tu cites, je n'ai plus de Warning!

Concernant les options de compilation, je ne penses avoir rien changé??

Concernant la plateforme, j'ai choisi le type: "Arduino/Genuino Uno" vu que ma carte est une UNO.

Et comme logiciel, je suis sur l'application Arduino IDE installée à partir du store de Microsoft (je tournes sur un WIN10)

Si je peux encore te mettre à contribution, quel changement apporte la modification apportée à mon code? (juste pour avancer et mieux comprendre..)

J'ai toujours cru qu'un char prenait des valeurs entre 0 et 255, non ? Donc ce serait entre -128 et +127. Et il faut utiliser unsigned char pour rester entre 0 et 255.

Le compilateur te disait:

sketch_apr01a:23:58: error: narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

erreur ligne 58 : if ( readSerial == prefix[0] )

readSerial était défini en int et prefix en char : il avait du mal à faire la conversion et la comparaison entre un int sur 2 octets et un char sur un octet.

Mais je ne vois pas pourquoi mettre le "unsigned"... Pour éviter l’ambiguïté due au bit de signe ?

L'erreur était ligne 23 position 58 (la fin du tableau de char). Je pense que la mise en page était différente dans le code qui a été compilé et a généré l'erreur. J'ai fait un copié collé de code joint au post #1 et le warning apparait ligne 14. D'ailleurs le message montre bien la ligne source de l'erreur.

sketch_apr01a:23:58: error: narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0xDD, 0x88};  // Start prefix

                                                         ^

sketch_apr01a:23:58: error: narrowing conversion of '136' from 'int' to 'char' inside { } [-Wnarrowing]

exit status 1
narrowing conversion of '221' from 'int' to 'char' inside { } [-Wnarrowing]

Les erreurs sont sur 0xDD (221 décimal) et 0x88 (136 décimal). Je pense que ces 2 valeurs sont considérées sortir de la fourchette -128, +127 par ce que le compilateur les voit comme des int. Normalement cela ne génère pas une erreur mais seulement un warning d'où ma question concernant les options de compilation.