[Conseil] Neopixel avec autre methodes

Bonjour à tous,
Je m’appelle Guillaume et pour mon premier post (pas mon premier projet arduino) j’ai un problème de cohabitation entre des méthode avec Neopixel

Je m’explique :

  • j’ai mis en place un chenillard sur base de Neopixel, avec une couleur initiale (la ca fonctionne)
  • puis j’ai ajouté un poussoir, qui lorsqu’il est appuyé me permet de changer la couleur des leds

lorsque j’appuis sur le bouton poussoir, le chenillard doit etre revenu dans sa position initial (du programme, soit les premières leds allumées fixes) pour pouvoir executer la methode de changement de couleur

1ere question, pourquoi ce comportement ?
2eme question, Comment pourrais-je faire pour que le changement de couleurs n’interrompe pas le chenillard ?

Merci de vos lumières :slight_smile:

final.ino (1.6 KB)

Bonjour
A l'occasion de tes premiers messages sur ce forum il est important de prendre connaissance de son 'mode d'emploi' (messages épinglés en tête du Forum Françaois Général)
Tu constateras alors que le sous forum "Réalisations et Projets Finis" est , comme l'indique son titre le lieu où sont présentés les travaux achevés , le sous titre pécisant qu'il s'agit des projets complets.
Pour avoir des réponses il faut utiliser le Forum Français Général et non un sous-forum dédié.
Utilises le lien 'Report do Moderator' en bas de ton message initial pour demander le déplacement de ton message vers le bon endroit.
To message auras alors une bien meilleure visibilité , n'encombreras pas ce sous-forum et auras des réponses.

Bonjour,

Ton entrée est initialisée avec INPUT_PULLUP, ce qui veut dire que ton bouton est connecté entre la pin et le GND, donc actif à l'état LOW.
Or dans ton programme il semble actif à l'état HIGH.
Comment est connecté ton bouton?

hello,
j'ai mis une resistance de tirage reliée a la masse, mon bouton au push passe à l'état haut, c'est pourquoi dans mon loop() j'ai mis while(digitalRead(PIN_COLOR) == HIGH)

Dans ce cas il faut supprimer le INPUT_PULLUP pour ne pas valider le pullup interne

Pour répondre à ta question, il faut remplacer le while par un if de façon à ne pas bloquer ton programme
Et il faudrait faire une fonction qui avance d'une case plutôt que la fonction chase qui fait un tour complet

Kamill, il peut y avoir interference entre un pullup interne et externe ?
Si je retire mon while, et que je gere autrment mon chase, je devrait pouvoir gerer les 2 en parallele ?

Ce que tu as mis n'est pas un pullup externe, mais un 'pulldown' externe. Avec le pullup interne ça constitue un diviseur de tension qui empêche la tension de descendre à 0.
Ca fonctionne car le pulldown externe que tu as mis doit être beaucoup plus faible que le pullup interne

Oui tu peux gérer les deux en parallèle (vu par l'opérateur).

Bon je revise un peu mon code et cablage et te remercie pour ton aide
Si besoin, je reviens :wink:

Tu n'as pas besoin de revoir ton cablage, simplement tu enlèves l'instruction

pinMode(buttonPin, INPUT_PULLUP);

Re,
Pas que je soit un boulet, mais le fade ne s'incremente que lorsqu'un tour est fait, ce qui ne fait que deplacer le probleme :frowning:
J'ai essayé avec les interruption ... même combat :frowning:

Re,

Essaies ça. J’ai aussi modifié l’incrément car un incrément de 1 en 1 ça risque d’être long

#include <Adafruit_NeoPixel.h>

#define PIN 6
#define N_LEDS 60
#define wait 25 //ms
#define largeur 6


int buttonPin;
int r, v, b;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
 strip.begin();
 strip.setBrightness(255);
 buttonPin = 2; //whatever pin your button is plugged into
 r = 255;
 v = b = 0;
 Serial.begin(9600);
}

const int INC=5; // incrément/décrément des couleurs

void loop()
{
 if (digitalRead(buttonPin) == HIGH) {
   if (r == 255 && v != 255 && b == 0) {
     v+=INC;
     if (v>255) v=255;
   } else if (r != 0 && v == 255 && b == 0) {
     r-=INC;
     if (r<0) r=0;
   } else if (r == 0 && v == 255 && b != 255) {
     b+=INC;
     if (b>255) b=255;
   } else if (r == 0 && v != 0 && b == 255) {
     v-=INC;
     if (v<0) v=0;
   } else if (r != 255 && v == 0 && b == 255 ) {
     r+=INC;
     if (r>255) r=255;
   } else if (r == 255 & v == 0 && b != 0) {
     b-=INC;
     if (b<0) b=0;
   }
   // Serial.print(r); Serial.print(','); Serial.print(v); Serial.print(','); Serial.println(b);
 }
 // on avance le chenillard
 avance(strip.Color(r,v,b));
}

// avance d'une case
void avance(uint32_t c)
{
 static int index=0; // premier pixel allumé
 for (int i=0; i<strip.numPixels(); i++)
 {
   int j=(i+index)%strip.numPixels(); // recadre sur les numéros de pixels réels
   strip.setPixelColor(j, i<largeur ? c : 0);
 }
 strip.show();
 index++;
 if (index>=strip.numPixels())
   index=0;
 delay(wait);
}

je viens de compiler et ca marche merci
je met le nez dans le code pour le comprendre :slight_smile:
merci