Delay quel problème

Bonjour, je ne pense pas que ce soit une question de retard, vous aviez des clés égarées. Voici le code tel que j'ai compris ce que vous vouliez faire. Vous avez eu des mauvaises lignes dans la configuration, voyez comment elles devraient être et comment utiliser le for pour ne pas écrire autant.

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel pixels10 = Adafruit_NeoPixel(28, 10, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(106, 4, NEO_GRB + NEO_KHZ800);

void setup() {
  pinMode(10, OUTPUT);
  pixels10.begin();
  pinMode(4, OUTPUT);
  pixels4.begin();

  pinMode(2, INPUT_PULLUP);
  pixels10.begin(); // Initialize NeoPixel strip object (REQUIRED)
  //  pixels10.show(); // Initialize all pixels to 'off'
  pixels10.clear(); // Initialize all pixels to 'off'
  pixels4.begin(); // Initialize NeoPixel strip object (REQUIRED)
  //  pixels4.show(); // Initialize all pixels to 'off'
  pixels4.clear(); // Initialize all pixels to 'off'
}

void loop() {
  if (digitalRead(2) == LOW) {
    robinetOuvert();
  }
  if (digitalRead(2) == LOW) {
    for (int x = 0; x <= 9; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 10; x <= 19; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 20; x <= 29; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 30; x <= 39; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 40; x <= 49; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 50; x <= 59; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    for (int x = 60; x <= 69; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 70; x <= 79; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 80; x <= 89; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 90; x <= 99; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    delay(1000);
    for (int x = 100; x <= 105; x++) {
      pixels4.setPixelColor(x, pixels4.Color(255, 255, 0));
      pixels4.show();
    }
    if (digitalRead(2) == HIGH) {
     robinetCourt ();
    }
    if (digitalRead(2) == HIGH) {
      delay(3000);
      for (int x = 105; x >= 100; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 99; x >= 90; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 89; x >= 80; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 79; x >= 70; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 69; x >= 60; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 59; x >= 50; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 49; x >= 40; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 39; x >= 30; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 29; x >= 20; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 19; x >= 10; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
      delay(3000);
      for (int x = 9; x >= 0; x--) {
        pixels4.setPixelColor(x, pixels4.Color(0, 0, 0));
        pixels4.show();
      }
    }
  }
}
void robinetOuvert() {
  for (int x = 0; x <= 27; x++) {
    pixels10.setPixelColor(x, pixels10.Color(255, 255, 0));
    pixels10.show();
    delay(10);
  }
}
void robinetCourt () {
  for (int x = 0; x <= 27; x++) {
    pixels10.setPixelColor(x, pixels10.Color(0, 0, 0));
    pixels10.show();
    delay(10);
  }
}

Salutations.

:warning: La rédaction de votre message ne répond pas aux critères attendus. Il n'aura sans doute pas ou peu de réponse(s) tant que vous n'aurez pas pris en compte et mis en application les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Bonsoir dabo28

Je ne bois pas de bière mais ton problème m'intéresse.

Tout d'abord, tel qu'il est écrit, ton programme est ingérable, imagines, simplement que tu veuilles changer de couleurs, vois le nombre de lignes à modifier.
Souvent, le changement de couleur se fait sur un groupe suivi de LED, de 0 à 10 par exemple, pour ça, comme dans l'exemple de @gonpezzi, il faut utiliser des boucles.
J'ai poussé un peu plus loin, en créant des fonctions:
pixel10setFromTo
pixel4setFromTo
pixel4setToFrom
qui "centralisent" l'allumage des LED.
Des lignes
//Serial.println("Pixel10+ " + String(l) + "\t\t" + String(ledColor));
sont en remarque, si tu ôtes les // avec la console à 115200 tu peux voire ce qui se passe.
Je n'ai pas essayé avec des LED mais uniquement avec la console.
Je n'ai rien changé, du moins je l'espère, à la structure de ton programme, mais uniquement ce qui concerne l'allumage des LED.
Tom programme a passé de 644 à 115 lignes.

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel pixels10 = Adafruit_NeoPixel(28, 10, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(106, 4, NEO_GRB + NEO_KHZ800);

long couleurBiere = 0;
long couleurVide = 0;

void setup() {
	Serial.begin(115200);
	pinMode(10, OUTPUT);
	pixels10.begin();
	pinMode(4, OUTPUT);
	pixels4.begin();

	couleurBiere = pixels4.Color(255, 255, 0);
	couleurVide = pixels4.Color(0, 0, 0);
	
	pinMode(2, INPUT_PULLUP);
	pixels10.begin(); // Initialize NeoPixel strip object (REQUIRED)
	pixels10.show(); // Initialize all pixels to 'off'
	pixels4.begin(); // Initialize NeoPixel strip object (REQUIRED)
	pixels4.show(); // Initialize all pixels to 'off'
}

void loop() {
	if (digitalRead(2) == LOW) {
		pixel10setFromTo(0, 27, couleurBiere, 10);
	}

if (digitalRead(2) == LOW) {
	pixel4setFromTo(0, 9, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(10, 19, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(20, 29, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(30, 39, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(40, 49, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(50, 59, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(60, 69, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(70, 79, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(80, 89, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(90, 99, couleurBiere, 0);
	delay(1000);
	pixel4setFromTo(100, 105, couleurBiere, 0);
	delay(1000);
}
if (digitalRead(2) == HIGH) {

	delay(3000);
	pixel4setToFrom(105, 100, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(99, 90, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(89, 80, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(79, 70, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(69, 60, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(59, 50, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(49, 40, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(39, 30, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(29, 20, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(19, 10, couleurVide, 0);
	delay(3000);
	pixel4setToFrom(9, 0, couleurVide, 0);
	delay(3000);
	}
}

void pixel10setFromTo(int ledFrom, int ledTo, long ledColor, int tempo)
{
	for (int l = ledFrom; l <= ledTo; l++)
	{
		//Serial.println("Pixel10+ " + String(l) + "\t\t" + String(ledColor));
		pixels10.setPixelColor(l, ledColor);
		pixels10.show();
		delay(tempo);
	}
}

void pixel4setFromTo(int ledFrom, int ledTo, long ledColor, int tempo)
{
	for (int l = ledFrom; l <= ledTo; l++)
	{
		//Serial.println("Pixel4+ " + String(l) + "\t\t" + String(ledColor));
		pixels4.setPixelColor(l, ledColor);
		pixels4.show();
		delay(tempo);
	}
}

void pixel4setToFrom(int ledTo, int ledFrom, long ledColor, int tempo)
{
	for (int l = ledTo; l >= ledFrom; l--)
	{
		//Serial.println("Pixel4- " + String(l) + "\t\t" + String(ledColor));
		pixels4.setPixelColor(l, ledColor);
		pixels4.show();
		delay(tempo);
	}
}

A ta disposition pour de plus amples renseignements.

Cordialement
jpbbricole

Il serait dans notre intérêt à tous, quand un membre a exprimé sa réprobation quant au contenu d'une demande, de respecter cette réprobation, et de ne pas répondre impulsivement, ou compulsivement, à une demande qui ne respecte pas les règles.
Je ne suis pas modo, mais j'assume ma position, et j'exprime également ma réprobation, pas à l'encontre du demandeur, mais à l'encontre des répondeurs trop empressés.

1 Like

Pour faire plus court, les nouveaux venus "répondeurs" seraient bien inspirés de lire ces règles :

Bonsoir Choix de l'alimentation - #21 by jpbbricole

Le texte dit:

donc n'interdit pas une réponse, surtout si comme la mienne elle est mûrement réfléchie.

Cordialement
jpbbricole

Bonsoir à tous

Je partage ce point de vue même si parfois (rarement !) il m'arrive aussi de répondre de manière impulsive sans attendre que le demandeur ait effectué les modifications qui s'imposent et qui ne nécesstent pas pas de gros efforts mais un un peu de bonne volonté.

S'il s'agit d'un code de vingt lignes, je ne dis pas le contraire, mais ici, il y pas loin de 650 lignes.
Il faut vraiment du courage, de l'obstination ou du jemenfoutisme pour le copier et le corriger, ou n'avoir rien à foutre de ses journées.
Je suis pour le respect des règles. Sinon, on peut mettre les règles à la poubelle et laisser les outlaws prendre le pouvoir sur le forum.

1 Like

Les nouveaux dans cet univers arduino ont un nombre limité de publications quotidiennes, c'est sûr.
N'y a-t-il pas aussi des limitations sur la longueur du code ?
Je ne sais pas.
Est-ce que quelqu'un sait?
La vérité est qu'une partie de ce code est bien publiée, peut-être qu'il avait ces limitations, je l'ai supposé et c'est pourquoi j'ai répondu.
Salutations.

OK pour la première phrase, par contre pour la seconde je pense que la poubelle est pour les messages que leurs auteurs refusent obstinément de mettre en conformité avec les règles élémentaires.

1 Like

Si on ne met pas les règles à la poubelle, autant les faire respecter.

Bonjour gonpezzi

C'est ce que je m'étais dit, un partie du code est bien entre balises, donc @dabo28 a fait l'effort, donc méritait une réponse. Ce n'est pas évident, surtout pour un premier post.

Une belle journée à toi.
Cordialement
jpbbricole

On peut remarquer que le code est mis entre balises après deux instructions if().
Pour ma part je suppose que le logiciel du forum a de lui-même placé ces balises. C'est pratiquement évident, mais pas pour tout le monde apparemment.

Bonjour dabo28

Suite à la "simplification" de ton programme, il est ressorti un problème, la condition
if (digitalRead(2) == HIGH)
n'est pas assortie d'une condition, est-ce-que le verre n'est pas déjà vide, auquel cas cette opération est inutile. Ainsi, sans cette condition, à chaque loop() on vide le verre donc on attend
12 x delay(3000);
pendant ce temps, une action sur le levier ne peut être détectée. C'est pour ça que je t'ai ajouté une variable
boolean verreVide = true;
Si tu mets la console à 115200 tu verras le déroulement du programme.
Si ces indications ne te sont pas nécessaires, tu peux virer tout les Serial.print...
Je n'ai pas essayé avec des LED, uniquement avec les indications dans le moniteur.

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel pixels10 = Adafruit_NeoPixel(28, 10, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(106, 4, NEO_GRB + NEO_KHZ800);

long couleurBiere = 0;
long couleurVide = 0;
boolean verreVide = true;

void setup() {
	Serial.begin(115200);
	pinMode(10, OUTPUT);
	pixels10.begin();
	pinMode(4, OUTPUT);
	pixels4.begin();

	couleurBiere = pixels4.Color(255, 255, 0);
	couleurVide = pixels4.Color(0, 0, 0);
	
	pinMode(2, INPUT_PULLUP);
	pixels10.begin(); // Initialize NeoPixel strip object (REQUIRED)
	pixels10.show(); // Initialize all pixels to 'off'
	pixels4.begin(); // Initialize NeoPixel strip object (REQUIRED)
	pixels4.show(); // Initialize all pixels to 'off'
}

void loop() {
	if (digitalRead(2) == LOW  && verreVide == true) {
		// Ecoulement remplissage
		Serial.println(F("\nEcoulement remplissage"));
		pixel10setFromTo(0, 27, couleurBiere, 10);
		
		// Remplissage
		Serial.println(F("\nVerre remplissage"));
		pixel4setFromTo(0, 9, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(10, 19, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(20, 29, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(30, 39, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(40, 49, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(50, 59, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(60, 69, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(70, 79, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(80, 89, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(90, 99, couleurBiere, 0);
		delay(1000);
		pixel4setFromTo(100, 105, couleurBiere, 0);
		delay(1000);
		
		// Ecoulement vider
		Serial.println(F("\nEcoulement vider"));
		pixel10setFromTo(0, 27, couleurVide, 30);

		Serial.println(F("\nVerre plein"));
		verreVide = false;
	}
	// Si poignée relachée et verre plein
	if (digitalRead(2) == HIGH && verreVide == false) {

		Serial.println(F("\nVider le verre"));

		delay(3000);
		pixel4setToFrom(105, 100, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(99, 90, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(89, 80, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(79, 70, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(69, 60, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(59, 50, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(49, 40, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(39, 30, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(29, 20, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(19, 10, couleurVide, 0);
		delay(3000);
		pixel4setToFrom(9, 0, couleurVide, 0);
		delay(3000);
		
		Serial.println(F("\nVerre vide"));
		verreVide = true;
	}
}

void pixel10setFromTo(int ledFrom, int ledTo, long ledColor, int tempo)
{
	Serial.print("*");
	for (int l = ledFrom; l <= ledTo; l++)
	{
		//Serial.println("Pixel10+ " + String(l) + "\t\t" + String(ledColor));
		pixels10.setPixelColor(l, ledColor);
		pixels10.show();
		delay(tempo);
	}
}

void pixel4setFromTo(int ledFrom, int ledTo, long ledColor, int tempo)
{
	Serial.print("*");
	for (int l = ledFrom; l <= ledTo; l++)
	{
		//Serial.println("Pixel4+ " + String(l) + "\t\t" + String(ledColor));
		pixels4.setPixelColor(l, ledColor);
		pixels4.show();
		delay(tempo);
	}
}

void pixel4setToFrom(int ledTo, int ledFrom, long ledColor, int tempo)
{
	Serial.print("*");
	for (int l = ledTo; l >= ledFrom; l--)
	{
		//Serial.println("Pixel4- " + String(l) + "\t\t" + String(ledColor));
		pixels4.setPixelColor(l, ledColor);
		pixels4.show();
		delay(tempo);
	}
}

Bonne lecture et à ta disposition pour de plus amples renseignaments.

Cordialement
jpbbricole

Je ne suis pas modo donc je n’interdis rien. Cependant ce genre de post Ça met le bazar dans la lecture du forum. Par le passé notre modo mettait à la poubelle les posts ou l’OP ne faisait pas d’efforts.

Quant au mûrement réfléchi, vu que ça ne répond pas à la question de l’OP sur la gestion des délais, je ne suis pas sûr qu’elle soit pertinente.

Enfin les conseils comme effectuer des print à rallonge

//Serial.println("Pixel10+ " + String(l) + "\t\t" + String(ledColor));

En concaténation de String c’est une des plus mauvaise habitude que vous pouvez donner à un néophyte. 4 prints séparés seraient beaucoup plus appropriés.

Je propose de clore ici toute contribution tant que l’OP n’est pas revenu faire le ménage.

(Je passe le fil en slow mode)

Bonjour J-M-L,

Oui, pleinement, si tu lis le programme posté et la remarque de dabo28

tu verrai que l'usage de 12x delay(3000) quasiment en permanence du fait que la condition était
if (digitalRead(2) == HIGH)
donc condition permanente tant que le levier était relâché. Pour que la condition if (digitalRead(2) == LOW) soit vraie, il fallait attendre jusqu'à 12x3 secondes. Donc je pense que c'est mûrement réfléchi.
Quand au reste des modifications, c'eut été un peu gros de ne pas faire remarquer qu'un programme ainsi libellé avec des dizaines de lignes presque identiques était ingérable. D'où la présence de fonctions.

Ah! un petit "incident" comme ça peut mettre le bazard dans la lecture du forum, que penser de ce genre de diatribe

qui est carrément une attaque personnelle voire d'insulte, que devrait en faire un modérateur?

Pour le reste, attendons l'avis de @dabo28 Cordialement
jpbbricole

Oui parce que c'est le signal que l'on peut poster n'importe comment sans mettre en forme son code et que l'on trouvera toujours une personne en mal de reconnaissance qui résoudra le problème.

Et en plus, la bonne solution serait d'expliquer à la personne ce qui ne va pas dans la structure même du programme et de lui expliquer comment il pourrait le corriger pour le rendre plus lisible et plus facile à maintenir. Mais certainement pas de lui livrer un code tout fait. Mais ça, c'est un sujet que l'on a déjà évoqué avec toi mais auquel tu est totalement hermétique.

je n'ai pas vu de commentaires dans votre réponse sur les délais, d'où mon commentaire.

je ne parlais pas de votre réponse, mais du post original. +1 avec @fdufnews sur son explication.

Oui, et il est aux abonnés absents. Ce post sera remisé dans le bar d'ici quelques jours sans intervention de l'OP.

Bonjour

Je parlais du même post et comme petit "incident" le programme, en partie hors des balises.
Si ça peut mettre le bazard, que dire de ça?

C'est expliqué ici et

Je ne suis pas hermétique, j'ai simplement une autre façon faire, par l'exemple. Quand à définir la meilleure façon, comme on est pas dans un pays à pensée unique...
.
Cordialement
jpbbricole

Vous semblez prendre tout commentaire comme une attaque personnelle...

Unknown