[Aide] Feu de voiture RC avec LED WS2812

Bonjour à tous,

Je suis débutant en arduino, j'ai pu réalisé quelques programmes Arduino jusqu’à maintenant sans problème, du moins j'arrivais à trouvé mon erreur tout seul.

Mon projet actuel est de réalisé des feu de voiture RC avec des barrettes de led WS2812, je l'avais déjà fais avec des leds classique, cela marchais fonctionnais sans problème. Et après j'ai découvert ses fameuse WS2812 qui me plaise vraiment bien.

J'ai récupéré un bout de code sur le net pour lire mon récepteur de voiture, que j'ai adapté pour faire le reste de mon programme, le but étant :

  • avoir des feux de position
  • passé en plein phare quand le canal 4 est activé
  • feu arrière allumé en permanence
  • feu stop quand aucune action sur la gâchette d'accélération
  • feu de marche arrière quand on recul
  • et clignotant gauche et droite

J'ai fais mon programme étape par étape cela c'est presque bien passé :slight_smile:
Arrive le moment de mettre les clignotants.... :frowning:

Les clignotant sont de style Audi, c'est à dire la led 0 s'allume, puis la led 1, puis la 2 et enfin la 3 pour finir par tous s'éteindre et reprendre la couleur précédente.

Pour le moment si je désactive le bout de code "feuavantd()" le clignotant gauche fonctionne bien, et inversement si je désactive le code "feuavantg()" celui de droite fonctionne.

Par contre si j'active les 2, aucun ne fonctionne comme il devrais, la led0 s'allume, puis la led 1 s'allume à sont tour mais la 0 reprend sa couleur d'origine et ainsi de suite.

Donc forcément je n'ai encore pas touché à la partie feu arrière vu que l'avant ne fonctionne pas encore correctement.

Et un autre problème que je ne comprend pas non plus est pour la marche arrière, je lui demande de passé les leds de 4 à 11 en blanc et lui me met toutes les leds en blanc (de 0 à 15).

En général j'aime bien trouvé mes erreur tout seul mais je la bloque. Connaissez-vous un moyen d'exécuté un code arduino pas à pas pour justement débugué les programmes ?

En espérant avoir été au plus clair.

:o ATTENTION pour les professionnels de l'arduino étant débutant ce code peut certainement vous piquer fortement les yeux !!!! :o

Code dans le post suivant.

    // Eclairage RC 5ch adapté par Koukin
    // avec 4 WS2812 de 8 LED chacun
    //
    //=== lecture de récepteur de radiomodélisme 2ch
    //  tiptopboards.com C. ROLLAND 26 08 2013
    //
    // source Nick Poole cc. SparkFun Electronics
    //https://www.sparkfun.com/tutorials/348 modifié
    //
    //=========================================================

    //On utilise 5 voies sur le récepteur de radiomodélisme 2.4Ghz
    // Ch1 = STeering (volant) pilotage gauche/droite avec un servomoteur
    // Ch2 = THrottle (gachette de puissance) régler la vitesse de moteur
    // Ch3 ch4 et ch5 en option
    //========================================================
    int ch1; // Les 5 cannaux de RC
    int ch2;
//    int ch3; // 3 et 5 ne sont pas utilisé donc désactivé
    int ch4;
//    int ch5;

    int nav; // variable qui servira dans des boucles for
    int nar;

#include <Adafruit_NeoPixel.h> // Bibliothéque Adafruit pour les WS2812
#ifdef __AVR__
#include <avr/power.h>
#endif
    // Déclaration des PINs utilisé par les WS 2812
#define PAV 2 // Avant
#define PAR 3 // Arrière

Adafruit_NeoPixel AV = Adafruit_NeoPixel(16, PAV, NEO_GRB + NEO_KHZ800); // Déscription des leds, 2 WS2812 à la suite
Adafruit_NeoPixel AR = Adafruit_NeoPixel(16, PAR, NEO_GRB + NEO_KHZ800);
    //Couleur utilisé dans le programme
uint32_t red = AR.Color(255, 0, 0); // Feu stop
uint32_t redl = AR.Color(35, 0, 0); // Feu arrière
uint32_t black = AR.Color(0, 0, 0); // OFF
uint32_t orange = AR.Color(255, 100, 0); // Feu orange (clignotant)
uint32_t white = AR.Color(255, 255, 255); // Feu blanc (plein phare)
uint32_t whitel = AV.Color(40, 40, 40); // Feu blanc (code)

boolean led0g = 0; // Variable utilisé pour les clignotants
boolean led1g = 0;
boolean led2g = 0;
boolean led3g = 0;
boolean led4g = 0;
boolean led0d = 0;
boolean led1d = 0;
boolean led2d = 0;
boolean led3d = 0;
boolean led4d = 0;
boolean clig = 0;
boolean clid = 0;

void setup() {
  pinMode(5, INPUT);  // ch1
  pinMode(6, INPUT);  // ch2
//  pinMode(9, INPUT);  // ch3
  pinMode(10, INPUT);  // ch4
//  pinMode(11, INPUT);  // ch5
      
  AV.begin(); // Init WS2812
  AV.show();
  AR.begin();
  AR.show();
delay(5000); // Délais de 5sec àprès branchement
}
void loop() {
  detect();
  feuavantd();
  feuavantg();
  feustop();
  marcarr();
  cligno();
}
void detect() {
      //Pulsin n'est pas très optimisé mais ça fonctionne
      //Signaux de largeur modulée (1ms à 2ms) sur cycle 20ms
      //Donc 1000 microsec = zéro, 2000 micsec = max et 1500 = neutre
  ch1 = pulseIn(5, HIGH, 25000); // Lire ch1 (25 ms)
  ch2 = pulseIn(6, HIGH, 25000); // Lire ch2
//  ch3 = pulseIn(9, HIGH, 25000); // Lire ch3
  ch4 = pulseIn(10, HIGH, 25000); // Lire ch4
//  ch5 = pulseIn(11, HIGH, 25000); // Lire ch5

// Détecter le clignotant gauche 
if (ch1 <1400){
  clig = 1;
}
else {
  clig = 0;
}

// Détecter le clignotant droite 
if (ch1 >1600){
  clid = 1;
}
else {
  clid = 0;
}

}

void feuavantd() {  // Feu avant en fct du clignotant droite
if (clid == 0) { // Pas de clignotant
    if (ch4 < 1600) { // Plein phare
    for (int nav=0; nav <= 15; nav++){
    AV.setPixelColor(nav,white);
    }
    AV.show();
    }
    else { // Code
    for (int nav=0; nav <= 15; nav++){
    AV.setPixelColor(nav,whitel);
    }
    AV.show();  
    }
}
else { // Avec clignotant
    if (ch4 < 1600) { // Plein phare
    for (int nav=0; nav <= 11; nav++){
    AV.setPixelColor(nav,white);
    }
    AV.show();
    }
    else { // Code
    for (int nav=0; nav <= 11; nav++){
    AV.setPixelColor(nav,whitel);
    }
    AV.show();  
    }
}
}
void feuavantg() { // Feu avant en fct du clignotant gauche
if (clig == 0) { // Pas de clignotant
    if (ch4 < 1600) { // Plein phare
    for (int nav=0; nav <= 15; nav++){
    AV.setPixelColor(nav,white);
    }
    AV.show();
    }
    else { // Code
    for (int nav=0; nav <= 15; nav++){
    AV.setPixelColor(nav,whitel);
    }
    AV.show();  
    }
}
else { // Avec clignotant
    if (ch4 < 1600) { // Plein phare
    for (int nav=4; nav <= 15; nav++){
    AV.setPixelColor(nav,white);
    }
    AV.show();
    }
    else { // Code
    for (int nav=4; nav <= 15; nav++){
    AV.setPixelColor(nav,whitel);
    }
    AV.show();  
    }
}
}
void feustop() { // Gérer le feu stop

    if (ch2 > 1600 or ch2 < 1400){ // Feu arrière
    for (int nav=0; nav <= 15; nav++){
    AR.setPixelColor(nav,redl);
    }
    AR.show();
    }
    else { // Feu stop
    for (int nav=0; nav <= 15; nav++){
    AR.setPixelColor(nav,red);
    }
    AR.show();
    }
}

void marcarr() { // Gérer la marche arrière

    if (ch2 <1400){
      for (int nar=4; nar <= 11; nar++){
      AR.setBrightness(80);
      AR.setPixelColor(nar,white);
      }
      AR.show();
    }
}

La suite dans le prochain dans 5 minute.

Suite et fin.

void cligno() { //Gérer les clignotants

uint32_t colorr = AR.getPixelColor(4); // récupère couleur arriere actuel
uint32_t colorv = AV.getPixelColor(4); // récupère couleur avant actuel

const unsigned long interval1 = 100; // Interval utile pour les cligno style Audi

static unsigned long previousMillisLed0; // Variable de temps
static unsigned long previousMillisLed1;
static unsigned long previousMillisLed2;
static unsigned long previousMillisLed3;
static unsigned long previousMillisLed4;
static unsigned long previousMillisLed5;

unsigned long currentMillis = millis(); 

// Gérer le clignotant gauche

if (led0g == 0) {
    if (clig == 1) { // Demande cligno gauche
      previousMillisLed1 = currentMillis; // Garde en mémoire la valeur actuelle de millis()
    // Allume la led 3
      AR.setPixelColor(3,orange); // Arrière
      AV.setPixelColor(3,orange); // Avant
      AR.show();
      AV.show();
      led0g = 1;
    }
}
if (led0g == 1 && led1g == 0) {
  if(currentMillis - previousMillisLed1 >= interval1) { // Si interval11 ou plus millisecondes se sont écoulés
    previousMillisLed2 = currentMillis; // Garde en mémoire la valeur actuelle de millis()
    AR.setPixelColor(2,orange); // Allume la led 2
    AV.setPixelColor(2,orange);
    AR.show();
    AV.show();
    led1g = 1;
}
}

if (led1g == 1 && led2g == 0) {    
  if(currentMillis - previousMillisLed2 >= interval1) {
    previousMillisLed3 = currentMillis;
    AR.setPixelColor(1,orange);
    AV.setPixelColor(1,orange);
    AR.show();
    AV.show();
    led2g = 1;
}
}

if (led2g == 1 && led3g == 0) {    
  if(currentMillis - previousMillisLed3 >= interval1) {
    previousMillisLed4 = currentMillis;
    AR.setPixelColor(0,orange);
    AV.setPixelColor(0,orange);
    AR.show();
    AV.show();
    led3g = 1;
}
}

if (led3g == 1 && led4g == 0) { // Fin de la séquence normal les 4 leds sont allumées
  if(currentMillis - previousMillisLed4 >= interval1) {
    previousMillisLed5 = currentMillis;
  AR.setPixelColor(3,colorr); // On éteint tous pour revenir à la couleur récupéré précédement
  AR.setPixelColor(2,colorr);
  AR.setPixelColor(1,colorr);
  AR.setPixelColor(0,colorr);
  AV.setPixelColor(3,colorv);
  AV.setPixelColor(2,colorv);
  AV.setPixelColor(1,colorv);
  AV.setPixelColor(0,colorv);
  AR.show();
  AV.show();
  led4g = 1;
  }
}
  if (led4g == 1) { // Remise à zéro de toutes les variables utile pour la séquence cligo
  if(currentMillis - previousMillisLed5 >= interval1) {
  led0g = 0;
  led1g = 0;
  led2g = 0;
  led3g = 0;
  led4g = 0;
  }
  }


if (clig == 0) { // Arret de séquence avant la fin de celle ci
  AR.setPixelColor(3,colorr);
  AR.setPixelColor(2,colorr);
  AR.setPixelColor(1,colorr);
  AR.setPixelColor(0,colorr);
  AV.setPixelColor(3,colorv);
  AV.setPixelColor(2,colorv);
  AV.setPixelColor(1,colorv);
  AV.setPixelColor(0,colorv);
  AR.show();
  AV.show();
  led0g = 0;
  led1g = 0;
  led2g = 0;
  led3g = 0;
  led4g = 0;
}

// Gérer le clignotant droite
// Exactement pareil que le clignotant de gauche seul les n° de led
// change et les noms de variables
if (led0d == 0) {
    if (clid == 1) {
      previousMillisLed1 = currentMillis;
      AR.setPixelColor(12,orange);
      AV.setPixelColor(12,orange);
      AR.show();
      AV.show();
      led0d = 1;
    }
}
if (led0d == 1 && led1d == 0) {    
  if(currentMillis - previousMillisLed1 >= interval1) {
    previousMillisLed2 = currentMillis;
    AR.setPixelColor(13,orange);
    AV.setPixelColor(13,orange);
    AR.show();
    AV.show();
    led1d = 1;
}
}

if (led1d == 1 && led2d == 0) {    
  if(currentMillis - previousMillisLed2 >= interval1) {
    previousMillisLed3 = currentMillis;
    AR.setPixelColor(14,orange);
    AV.setPixelColor(14,orange);
    AR.show();
    AV.show();
    led2d = 1;
}
}

if (led2d == 1 && led3d == 0) {    
  if(currentMillis - previousMillisLed3 >= interval1) {
    previousMillisLed4 = currentMillis;
    AR.setPixelColor(15,orange);
    AV.setPixelColor(15,orange);
    AR.show();
    AV.show();
    led3d = 1;
}
}

if (led3d == 1 && led4d == 0) {    
  if(currentMillis - previousMillisLed4 >= interval1) {
    previousMillisLed5 = currentMillis;
  AR.setPixelColor(12,colorr);
  AR.setPixelColor(13,colorr);
  AR.setPixelColor(14,colorr);
  AR.setPixelColor(15,colorr);
  AV.setPixelColor(12,colorv);
  AV.setPixelColor(13,colorv);
  AV.setPixelColor(14,colorv);
  AV.setPixelColor(15,colorv);
  AR.show();
  AV.show();
  led4d = 1;
  }
}
  if (led4d == 1) {
  if(currentMillis - previousMillisLed5 >= interval1) {
  led0d = 0;
  led1d = 0;
  led2d = 0;
  led3d = 0;
  led4d = 0;
  }
  }


if (clid == 0) {
  AR.setPixelColor(12,colorr);
  AR.setPixelColor(13,colorr);
  AR.setPixelColor(14,colorr);
  AR.setPixelColor(15,colorr);
  AV.setPixelColor(12,colorv);
  AV.setPixelColor(13,colorv);
  AV.setPixelColor(14,colorv);
  AV.setPixelColor(15,colorv);
  AR.show();
  AV.show();
  led0d = 0;
  led1d = 0;
  led2d = 0;
  led3d = 0;
  led4d = 0;
}

}

Résolu, j'ai trouvé en faite mon code se mordait la queue dans tous les sens.

L'erreur humaine .... >:( et surtout du débutant.

Attention le code ci-dessus est bourré d'erreur, si y a des intéresser par le code me prévenir, je remettrais le bon.