Bonjour,
J'ai un soucis de communication serie entre mon arduino et mon pc . Je m'explique:
L'arduino recoit parfaitement ce que je lui envoi si je commente la ligne //affichage_emplacement(); dans la void loop()
En revanche si je l'a decommente, la reception devient aleatoire. Si par exemple, je lui en envoi <1,Rouge,2> , elle va parfois recevoir correctement le message, mais la plupart du temps elle recevra seulement des morceaux du messsage (<1,Rou,2> ou <1Rouge,>)
Auriez-vous une idée de la cause de ce peobleme ?
Remarque: J'utilise le "serial monitor" de l'IDE Arduino pour envoyer des messages à la carte configuré avec l'option "No line ending"
Merci par avance pour votre aide,
#include <FastLED.h>
#define NB_EMPLACEMENT 2
#define NB_LED_PAR_EMPLACEMENT 66
// How many leds in your strip?
#define NUM_LEDS NB_EMPLACEMENT* NB_LED_PAR_EMPLACEMENT
#define VITESSE_CLIGNOTEMENT 1000 //tps en ms utilisé pour l'animation de clignotement
#define VITESSE_ROTATION_CHENILLARD 10 //tps en ms utilisé pour l'animation de la rotation du chenillard
#define POURCENTAGE_CHENILLARD 30 //section allumé du chenillard representant un pourcentage du cercle
#define NB_LED_CHENILLARD floor(NB_LED_PAR_EMPLACEMENT* POURCENTAGE_CHENILLARD / 100)
#define FREQUENCE_RAFRAICHISSEMENT 15
// For led chips like WS2812, which have a data line, ground, and power, you just
// need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
// Clock pin only needed for SPI based chipsets when not using hardware SPI
#define DATA_PIN 5
struct emplacement {
CRGB couleur;
//Explication concernant le type de l'animation
//0 -> éteint
//1 -> allumé fixe
//0 -> allumé clignotant
//0 -> chenillard
int type_anim;
int led_start;
int led_curseur;
int led_end;
unsigned long last_updated_time_clignotement = 0;
unsigned long last_updated_time_chenillard = 0;
};
// Define the array of leds
CRGB leds[NUM_LEDS];
struct emplacement empl_pf[NB_EMPLACEMENT]; //tableau de 0 à NB_EMPLACEMENT - 1
unsigned long current_time = 0;
unsigned long current_time_rafraichissement = 0;
static boolean recvInProgress = false;
int led_restante_chenillard = 0;
const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars]; // temporary array for use when parsing
int consigne_emplacement = 0;
char consigne_couleur[numChars] = { 0 };
int consigne_anim = 0;
boolean newData = false;
void description_emplacements(emplacement* emplx) {
Serial.println("");
Serial.println("------------------------ETAT-----------------------------");
Serial.print("EMPLACEMENT \t");
for (int i = 1; i <= NB_EMPLACEMENT; ++i) {
Serial.print(i);
Serial.print("\t\t");
}
Serial.println("");
Serial.print("COULEUR \t");
for (int i = 0; i < NB_EMPLACEMENT; ++i) {
Serial.print(emplx[i].couleur.red);
Serial.print(";");
Serial.print(emplx[i].couleur.green);
Serial.print(";");
Serial.print(emplx[i].couleur.blue);
Serial.print(";");
Serial.print("\t\t");
}
Serial.println("");
Serial.print("TYPE ANIM \t");
for (int i = 0; i < NB_EMPLACEMENT; ++i) {
Serial.print(emplx[i].type_anim);
Serial.print("\t\t");
}
Serial.println("");
Serial.print("LED START \t");
for (int i = 0; i < NB_EMPLACEMENT; ++i) {
Serial.print(emplx[i].led_start);
Serial.print("\t\t");
}
Serial.println("");
Serial.print("LED END \t");
for (int i = 0; i < NB_EMPLACEMENT; ++i) {
Serial.print(emplx[i].led_end);
Serial.print("\t\t");
}
Serial.print("\n");
}
void affichage_emplacement() {
current_time = millis();
for (int i = 0; i < NB_EMPLACEMENT; i++) {
//Cas 1 --> on allume fixement toutes les leds de l'emplacement i dans la couleur i
if (empl_pf[i].type_anim == 1) {
for (int j = empl_pf[i].led_start; j <= empl_pf[i].led_end; j++) {
leds[j] = empl_pf[i].couleur;
}
}
//Cas 2 --> on allume fixement toutes les leds de l'emplacement i dans la couleur i
else if (empl_pf[i].type_anim == 2) {
if (current_time - empl_pf[i].last_updated_time_clignotement > VITESSE_CLIGNOTEMENT) {
empl_pf[i].last_updated_time_clignotement = current_time;
if (leds[empl_pf[i].led_start] == CRGB::Black) {
for (int j = empl_pf[i].led_start; j <= empl_pf[i].led_end; j++) {
leds[j] = empl_pf[i].couleur;
}
} else {
for (int j = empl_pf[i].led_start; j <= empl_pf[i].led_end; j++) {
leds[j] = CRGB::Black;
}
}
}
}
//Cas 3 --> animation du chenillard de l'emplacement i dans la couleur i
else if (empl_pf[i].type_anim == 3) {
if (current_time - empl_pf[i].last_updated_time_chenillard > VITESSE_ROTATION_CHENILLARD) {
empl_pf[i].last_updated_time_chenillard = current_time;
if (empl_pf[i].led_curseur + NB_LED_CHENILLARD - 1 <= empl_pf[i].led_end) {
for (int j = empl_pf[i].led_start; j <= empl_pf[i].led_end; j++) {
if (j < empl_pf[i].led_curseur) {
leds[j] = CRGB::Black;
} else if (j >= empl_pf[i].led_curseur && j <= empl_pf[i].led_curseur + NB_LED_CHENILLARD - 1) {
leds[j] = empl_pf[i].couleur;
} else {
leds[j] = CRGB::Black;
}
}
} else {
led_restante_chenillard = empl_pf[i].led_curseur + NB_LED_CHENILLARD - empl_pf[i].led_end - 1;
for (int j = empl_pf[i].led_start; j <= empl_pf[i].led_end; j++) {
if (j < empl_pf[i].led_start + led_restante_chenillard) {
leds[j] = empl_pf[i].couleur;
} else if (j >= empl_pf[i].led_curseur) {
leds[j] = empl_pf[i].couleur;
} else {
leds[j] = CRGB::Black;
}
}
}
if (empl_pf[i].led_curseur < empl_pf[i].led_end) {
empl_pf[i].led_curseur++;
} else {
empl_pf[i].led_curseur = empl_pf[i].led_start;
}
}
}
//Cas 0 --> on éteint les leds de l'emplacement i
else {
for (int j = empl_pf[i].led_start; j <= empl_pf[i].led_end; j++) {
leds[j] = CRGB::Black;
}
}
}
FastLED.show();
}
void setup() {
Serial.begin(115200);
FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical
for (int i = 0; i < NB_EMPLACEMENT; i++) {
empl_pf[i].couleur = CRGB::Black;
empl_pf[i].type_anim = 0;
empl_pf[i].led_start = NB_LED_PAR_EMPLACEMENT * i;
empl_pf[i].led_curseur = empl_pf[i].led_start;
empl_pf[i].led_end = empl_pf[i].led_start + NB_LED_PAR_EMPLACEMENT - 1;
empl_pf[i].last_updated_time_clignotement = 0;
empl_pf[i].last_updated_time_chenillard = 0;
}
description_emplacements(empl_pf);
}
//============
void loop() {
recvWithStartEndMarkers();
if (newData == true) {
strcpy(tempChars, receivedChars);
// this temporary copy is necessary to protect the original data
// because strtok() used in parseData() replaces the commas with \0
parseData();
newData = false;
}
/*
if(millis() - current_time_rafraichissement > FREQUENCE_RAFRAICHISSEMENT){
current_time_rafraichissement = millis();
affichage_emplacement();
}
if(recvInProgress == false){
affichage_emplacement();
}
*/
affichage_emplacement();
}
//============
void recvWithStartEndMarkers() {
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
} else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
//============
void parseData() { // split the data into its parts --> format <11,Rouge,2>
char* strtokIndx; // this is used by strtok() as an index
Serial.println(tempChars);
strtokIndx = strtok(tempChars, ",");
consigne_emplacement = atoi(strtokIndx) - 1; // l'indice de l'emplacement reçu est compris entre 1 et NB_EMPLACEMENT
strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
strcpy(consigne_couleur, strtokIndx); // consigne de couleur "Rouge", "Vert", "Bleu", "Orange" ou "Noir"
strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
consigne_anim = atoi(strtokIndx); // consigne anim 0 -> eteindre l'emplacement i | 1 -> allumer l'emplacement i | 2 -> clignoter l'emplacement i | 3 -> chenillard l'emplacement i
// Vérification des valeurs extraites
if (consigne_emplacement >= 0 && consigne_emplacement < NB_EMPLACEMENT && consigne_anim >= 0 && consigne_anim <= 3) {
if (strncmp("Rouge", consigne_couleur, strlen("Rouge")) == 0) {
empl_pf[consigne_emplacement].type_anim = consigne_anim;
empl_pf[consigne_emplacement].couleur = CRGB::Red;
} else if (strncmp("Vert", consigne_couleur, strlen("Vert")) == 0) {
empl_pf[consigne_emplacement].type_anim = consigne_anim;
empl_pf[consigne_emplacement].couleur = CRGB::Green;
} else if (strncmp("Bleu", consigne_couleur, strlen("Bleu")) == 0) {
empl_pf[consigne_emplacement].type_anim = consigne_anim;
empl_pf[consigne_emplacement].couleur = CRGB::Blue;
} else if (strncmp("Orange", consigne_couleur, strlen("Orange")) == 0) {
empl_pf[consigne_emplacement].type_anim = consigne_anim;
empl_pf[consigne_emplacement].couleur = CRGB::Orange;
} else if (strncmp("Noir", consigne_couleur, strlen("Noir")) == 0) {
empl_pf[consigne_emplacement].type_anim = consigne_anim;
empl_pf[consigne_emplacement].couleur = CRGB::Black;
} else {
Serial.println("Erreur : Valeurs extraites invalides.");
}
description_emplacements(empl_pf);
}
}