ethernet/neopixel

Bonjour,

je suis bloqué.
je travail sur le Neopixel piloté par un Shield Ethernet.
Mon souci est que quand je veux piloté une animation neopixel celui-ci me pilote la 1ere condition (bouton on) mais aussi la 2 eme condition bouton off comment doit je faire pour les séparées?
A croire que bouton on = bouton off ???

Merci d’avance pour votre aide.

voici mon programme:

#include <Adafruit_NeoPixel.h>

#include <SPI.h>

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <Twitter.h>
#include <util.h>

int PIN = 6;

// Paramètre 1 = Le nombre de NéoPixels chainés
// Paramètre 2 = No de broche de données (Sur votre Arduino, la plupart convient)
// Paramètre 3 = Type de pixel (flags/drapeaux), a combiner ensemble en fonction du besoin:
// NEO_KHZ800 flux de données à 800 KHz (plupart des NéoPixel basé sur les LEDs w/WS2812)
// NEO_KHZ400 flux de données à 400 KHz (Pour les Pixels classiques ‘v1’ FLORA (pas les V2) pilotés par WS2811)
// NEO_GRB Pixels sont raccordés en flux de donnée GRB (GRB=Green,Red,Blue=Vert,Rouge,Bleu - la plupart des produits NéoPixel)
// NEO_RGB Pixels sont raccordés en flux de donnée RGB (RGB=Red,Green,Blue=Rouge,Vert,Bleu - Pixels FLORA v1, pas la v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, 6, NEO_GRB + NEO_KHZ800);

byte mac = { 0x90, 0xA2, 0xDA, 0x0F, 0xFD, 0x76 }; //Adresse MAC
byte ip = { 192, 168, 0, 178 }; // IP
byte gateway = { 192, 168, 0, 1 }; // Adresse routeur
byte subnet = { 255, 255, 255, 0 }; //Masque
EthernetServer server(80); //Port
String readString;

void setup() {

strip.begin();
strip.show(); // Initialise tous les pixels à ‘off’ (éteint)

Serial.begin(9600);
while (!Serial) {
;
}

Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.print("Est au serveur " );
Serial.println(Ethernet.localIP());

}

void loop() {

EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

if (readString.length() < 100)
{
readString += c;
}

Serial.print(c);
if (c == ‘\n’)
{
Serial.println(readString); // Page Web
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();
client.println("");
client.println("");
client.println("");
client.println("");
client.println(“Essai L2”); //Titre de la page
client.println(“PROGRAMME L2”); // Nom de la page net
client.println("");
client.println("");
client.println(“

L2

”);
client.println("
");
client.println("
“);
client.println(“

Arduino et Ethernet Shield L2

”); // sous titre
client.println(”
“);
client.println(”<a href="/?bouton on"">Turn On LED");
client.println("<a href="/?bouton off"">Turn Off LED
“);
client.println(”
“);
client.println(”
“);
client.println(”");
client.println("");
client.println("");

delay(1);
client.stop();

//Controle des Boutons

if (readString.indexOf("?bouton on") > 0 && readString.indexOf("?bouton off") > 0 );
{
delay(20);
colorWipe(strip.Color(255, 0, 0), 10); // rouge de 1 a 24 pas de 10ms intensité max
delay(50);
colorWipe(strip.Color(0, 0, 0), 10); // rouge eteint de 1 à 24 pas de 10ms
delay(50);
}

if (readString.indexOf("?bouton off") > 0 && readString.indexOf("?bouton on") > 0 )
{
delay(20);
colorWipe1(strip.Color(255, 127, 0), 10); // orange de 1 a 24 pas de 10ms intensité max
delay(50);
colorWipe1(strip.Color(0, 0, 0), 10); // orange de 1 a 24 pas de 10ms intensité max
delay(50);
}
}
readString = “”;
}
}
}
}

// sous programme

//allumage de led 1 à 1 et reste allumer aller

void colorWipe(uint32_t c, uint8_t wait)
{
for (uint16_t i = 0; i < strip.numPixels(); i++)
{
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

//sous prog retour
void colorWipe1(uint32_t c, uint8_t wait)
{
for (uint16_t i = strip.numPixels(); i > 0; i–)
{
strip.setPixelColor(i - 1, c);
strip.show();
delay(wait);
}
}
//sous progr nuance ciel
void rainbow(uint8_t wait) {
uint16_t i, j;

for (j = 0; j < 256; j++) {
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
}
strip.show();
delay(wait);
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}
// sous prog multi couleur a pixel
void theaterChaseRainbow(uint8_t wait) {
for (int j = 0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, Wheel( (i + j) % 255)); //turn every third pixel on
}
strip.show();

delay(wait);

for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, 0); //turn every third pixel off
}
}
}
}

void theaterChase(uint32_t c, uint8_t wait) {
for (int j = 0; j < 1; j++) { //do 10 cycles of chasing
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, c); //turn every third pixel on
}
strip.show();

delay(wait);

for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, 0); //turn every third pixel off
}
}
}
}
//sous prog arc en ciel
void rainbowCycle(uint8_t wait) {
uint16_t i, j;

for (j = 0; j < 256 * 1; j++) { // 1 = NOMBRE DE CYCLE
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}

Bonjour
Je n’ai pas lu tout ton code mais plusieurs trucs m’ont sautés aux yeux:

     if (readString.indexOf("?bouton off") > 0 && readString.indexOf("?bouton on") > 0 )

Si tu analyses une ligne que tu as reçu avec le Serial, tu devrais t’apercevoir que dans une URL, il ne peut y avoir d’espace. Ils sont remplacé par “%20”. Ainsi que d’autres caractères spéciaux type accents.

La construction de tes conditions ne sont pas bonne.

indexOf retourne -1 s’il ne trouve rien. Mais il retourne 0 si le string commence au début. Il faut aussi tester ce 0 en utilisant “…>=0”

Le point d’interrogation ne peut être présent qu’une fois dans une URL pour séparer l’adresse de la page et les arguments? le “&” est utiliser pour séparer les arguments.

De plus, es tu sur que ton URL contienne les deux cas “on” et “off” en même temps? parce que si non, la condition sera toujours fausse et donc jamais exécutée (si correction des erreurs précédentes)

Par contre, je ne comprends pas pourquoi ton code valide les conditions! et exécute les codes dans les if.

Teste juste le cas du ON dans le 1er IF puis juste le cas du OFF dans le 2eme

          if (readString.indexOf("bouton%20on") >= 0 );
          {
            delay(20);
            colorWipe(strip.Color(255, 0, 0), 10); // rouge de 1 a 24 pas de 10ms intensité max
            delay(50);
            colorWipe(strip.Color(0, 0, 0), 10); // rouge eteint de 1 à 24 pas de 10ms
            delay(50);
          }

je te laisse faire pour le OFF

        if (readString.length() < 100)

Que se passe-t-il su tu reçois plus 100 octets ? Débordement du STRING et plantage assuré

PS: Mets ton code entre balises CODE, le 1er bouton </>