Jeu de loterie à 4 résultats possibles sur LED RGB

Bonjour à tous.
Je débute dans le monde de l'Arduino.

Je voudrais faire une jeu de loterie avec résultats possibles Bleu, Vert, Rouge et Jaune.
Pour ce projet, j'utilise un Arduino uno, un bouton poussoir, et une LED RGB cathode commune.
.
J'aimerais que lorsqu'on appuie sur le bouton, la LED passe plusieurs fois par toutes les couleurs définies plus haut, d'abord rapidement, puis ralentisse avant de s'arrêter sur une couleur au hasard. s'éteigne au bout de 10 secondes.
On doit pouvoir, alors relancer un cycle en appuyant à nouveau sur le bouton.
Pour l'instant, je n'ai réussi qu'à faire passer la LED, en boucle, par toutes les couleurs, mais je compte bien pouvoir finaliser le projet rapidement, avec votre aide précieux.

const byte PIN_BUTTON = 8;
const byte PIN_LED_R = 9;
const byte PIN_LED_G = 10;
const byte PIN_LED_B = 11;

void setup() {

  pinMode(PIN_BUTTON, INPUT);
  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_B, OUTPUT);
  displayColor(0, 0, 0);
}


void loop() {
  
  /* Code de démonstration */
  displayColor(255, 0, 0); // Bleu
  delay(1000);
  
  displayColor(0, 255, 0); // Vert
  delay(1000);
  
  displayColor(0, 0, 255); // Rouge
  delay(1000);
 
  displayColor(0, 255, 255);  // Jaune
  delay(1000);
  
}

/** Affiche une couleur */
void displayColor(byte r, byte g, byte b) {

  // Assigne l'état des broches
  // Version cathode commune
  analogWrite(PIN_LED_R, r);
  analogWrite(PIN_LED_G, g);
  analogWrite(PIN_LED_B, b);

}

Bonjour et bienvenue sur le forum.

Merci de prendre quelques minutes pour lire les bonnes pratiques du forum francophone et de les appliquer.

quel arduino?
quel bouton ?
quelle LED ?

... on est un peu dans le flou...


Merci d'éditer votre post pour rajouter les balises de de code, c'est illisible tel quel:

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône </> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Tu peux commencer par mettre le code suivant dans une boucle "for" et utiliser une variable pour le délais entre chaque mise à jour de la LED utilisée.
Et faire décroitre cette variable à la fin de chaque itération de ta boucle "for"

/* Code de démonstration */
displayColor(255, 0, 0); // Bleu
delay(1000);

displayColor(0, 255, 0); // Vert
delay(1000);

displayColor(0, 0, 255); // Rouge
delay(1000);

displayColor(0, 255, 255); // Jaune
delay(1000);

Bonjour, et merci pour votre réponse.
Je tatonne un peu, c'est mon premier post.

Pour ce projet, j'utilise un Arduino uno, un bouton poussoir, et une LED RGB cathode commune.

Ok, et le circuit ressemble à quoi ?
(Je vois que le bouton est en INPUT, vous avez une résistance externe ?)

J'ai mis des résistances de 220 ohms sur chaque anodes et sur le bouton poussoir

bravo pour l'utilisation de câble de bonnes couleur pour le montage et pour les résistances. Pour le bouton vous pourriez utiliser le mode INPUT_PULLUP de votre pin qui utilise une résistance interne au micro-contrôleur. ça simplifie les montages

Et pour simplifier votre gestion des boutons, éventuellement utilisez la bibliothèque Button dans easyRun de @bricoleau ou OneButton de Matthias Hertel ou encore Toggle de @dlloyd.

de quelle aide avez vous besoin ?

Merci pour vos conseils.
Après quelques recherches, j'ai bien avancé dans mon programme, mais il ne réagit toujours pas comme souhaité.
Actuellement, mon bouton semble ne servir à rien.
Voici mon codage actuel.

const byte BUTTON = 2;
const byte LED_R = 9;
const byte LED_G = 10;
const byte LED_B = 11;
const int allumageTemps = 30000;     // Temps d'allumage en millisecondes
unsigned long allumageTimer = 0;     // Chrono d'allumage
int choixCouleur;


void setup() {

  pinMode(BUTTON, INPUT_PULLUP);       // Définition de bouton en entree, AVEC activation de la resistance de pull up interne
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  displayColor(0, 0, 0);
}


void loop() {
  
 
if (digitalRead(BUTTON) == LOW && allumageTimer == 0)  // Si le bouton est pressé et l'allumage n'est pas en fonction
{
	  choixCouleur = random(1,4);    // Choix de la couleur
	  allumageTimer = millis();     // Démarrage du chrono

    // 1ere boucle
	  displayColor(255, 0, 0);          // allumer en Bleu
  	delay(250);                       // pendant 0,25 sec
	  displayColor(0, 255, 0);          // allumer en Vert
  	delay(250);                       // pendant 0,25 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(250);                       // pendant 0,25 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(250);                       // pendant 0,25 sec

    // 2ème boucle
  	displayColor(255, 0, 0);          // allumer en Bleu
  	delay(250);                       // pendant 0,25 sec
  	displayColor(0, 255, 0);          // allumer en Vert
  	delay(250);                       // pendant 0,25 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(250);                       // pendant 0,25 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(250);                       // pendant 0,25 sec

    // 3ème boucle
  	displayColor(255, 0, 0);          // allumer en Bleu
  	delay(500);                       // pendant 0,5 sec
	  displayColor(0, 255, 0);          // allumer en Vert
  	delay(500);                       // pendant 0,5 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(500);                       // pendant 0,5 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(500);                       // pendant 0,5 sec

    //4ème boucle
  	displayColor(255, 0, 0);          // allumer en Bleu
  	delay(1000);                      // pendant 1 sec
  	displayColor(0, 255, 0);          // allumer en Vert
  	delay(1000);                      // pendant 1 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(1000);                      // pendant 1 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(1000);                      // pendant 1 sec

    // boucle avec choix aléatoire de la couleur
  	displayColor(255, 0, 0);          // allumer en Bleu
  	-- choixCouleur;                  // décréménter choixCouleur
    	if (choixCouleur == 0) {        // si la condition est vraie, attente de la fin des 30sec
        
   	 }
    	else {                          // si la condition est fausse
          delay(1500);                // pendant 1,5 sec
	        displayColor(0, 255, 0);    // allumer en Vert
	        -- choixCouleur;            // décréménter choixCouleur
   	 }
    	if (choixCouleur == 0) {        // si la condition est vraie, attente de la fin des 30sec
      
   	 }
    	else {                          // si la condition est fausse
          delay(1500);                // pendant 1,5 sec
  	      displayColor(0, 0, 255);    // allumer en Rouge
  	      -- choixCouleur;            // décréménter choixCouleur
   	 }
    	if (choixCouleur == 0) {        // si la condition est vraie, attente de la fin des 30sec
        
   	 }
    	else {                          // si la condition est fausse
    	    delay(1500);                // pendant 1,5 sec
  	      displayColor(0, 255, 255);  // allumer en Jaune
   	 }
} 
if (allumageTimer != 0 && (millis()-allumageTimer >= allumageTemps)) // Si allumage en fonction et allumageTemps fini
    displayColor(0, 0, 0);     // Eteindre la LED
	  allumageTimer = 0;         // Arrêt du chrono
  }
			

/** Affiche une couleur */
void displayColor(byte r, byte g, byte b) {

  // Assigne l'état des broches
  // Version cathode commune
  analogWrite(LED_R, r);
  analogWrite(LED_G, g);
  analogWrite(LED_B, b);
  
}

Je sais que je me suis trompé quelque part, mais où?...

Pourquoi pensez vous que ce test attend 30s ?

Je pensais faire un programme pour lequel, lorsqu'on appuie, puis relâche le bouton, tout le cycle des LED fonctionnait pendant 30secs, puis s'éteignait pour attendre l'appui suivant.
Malheureusement, il semble que je n'aie pas encore compris toute les subtilités de la programmation.
Mon programme était sensé se réalisé comme suit:
On appuie et relâche le bouton.
Un chrono de 30secs se lance.
Les boucles 1, 2, 3 et 4 s'enchainent. Les deux premières sont rapides. Les suivantes ralentissent.
Puis vient la boucle qui permet de choisir aléatoirement sur quelle couleur ça s'arrête.
La LED reste figée sur cette couleur aléatoire, jusqu'à ce que les 30secs se soient écoulées.
Ensuite la LED s'éteint, dans l'attente d'un nouvel appui.
...
Visiblement, j'ai encore du chemin à faire.

J'ai repris le code, pour l’instant, sans bouton, que je verrai plus tard pour inclure.
Malheureusement, sur les 4 couleurs qui sont sensées arriver de façon aléatoire, en fin de loop, seuls les résultats vert et rouge ont pris en compte. Le bleu et le jaune semblent ne jamais être la solution. alors que les 4 couleurs s'affichent lors de la phase de démarrage.

const byte LED_R = 9;
const byte LED_G = 10;
const byte LED_B = 11;
int choixCouleur;


void setup() {

  
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  displayColor(0, 0, 0);
}


void loop() {

	  choixCouleur = random(1,4);       // Choix aléatoire de la couleur

    // 1ere boucle
	  displayColor(255, 0, 0);          // allumer en Bleu
  	delay(200);                       // pendant 0,20 sec
	  displayColor(0, 255, 0);          // allumer en Vert
  	delay(200);                       // pendant 0,20 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(200);                       // pendant 0,20 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(200);                       // pendant 0,20 sec

    // 2ème boucle
  	displayColor(255, 0, 0);          // allumer en Bleu
  	delay(200);                       // pendant 0,20 sec
  	displayColor(0, 255, 0);          // allumer en Vert
  	delay(200);                       // pendant 0,20 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(200);                       // pendant 0,20 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(200);                       // pendant 0,20 sec

    // 3ème boucle
    displayColor(255, 0, 0);          // allumer en Bleu
    delay(200);                       // pendant 0,20 sec
    displayColor(0, 255, 0);          // allumer en Vert
    delay(200);                       // pendant 0,20 sec
    displayColor(0, 0, 255);          // allumer en Rouge
    delay(200);                       // pendant 0,20 sec
    displayColor(0, 255, 255);        // allumer en Jaune
    delay(200);                       // pendant 0,20 sec

    // 4ème boucle
  	displayColor(255, 0, 0);          // allumer en Bleu
  	delay(300);                       // pendant 0,3 sec
	  displayColor(0, 255, 0);          // allumer en Vert
  	delay(300);                       // pendant 0,3 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(300);                       // pendant 0,3 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(300);                       // pendant 0,3 sec

    //5ème boucle
  	displayColor(255, 0, 0);          // allumer en Bleu
  	delay(500);                       // pendant 0,5 sec
  	displayColor(0, 255, 0);          // allumer en Vert
  	delay(500);                       // pendant 0,5 sec
  	displayColor(0, 0, 255);          // allumer en Rouge
  	delay(500);                       // pendant 0,5 sec
  	displayColor(0, 255, 255);        // allumer en Jaune
  	delay(500);                       // pendant 0,5 sec

    // boucle avec choix aléatoire de la couleur
  	displayColor(255, 0, 0);          // allumer en Bleu
  	-- choixCouleur;                  // décréménter choixCouleur
    	if (choixCouleur == 0) {        // si la condition est vraie, aller à la fin
   	 }
    	else {                          // si la condition est fausse
          delay(1000);                // pendant 1 sec
	        displayColor(0, 255, 0);    // allumer en Vert
	        -- choixCouleur;            // décréménter choixCouleur
   	 }
    	if (choixCouleur == 0) {        // si la condition est vraie, aller à la fin
   	 }
    	else {                          // si la condition est fausse
          delay(1000);                // pendant 1 sec
  	      displayColor(0, 0, 255);    // allumer en Rouge
  	      -- choixCouleur;            // décréménter choixCouleur
   	 }
    	if (choixCouleur == 0) {        // si la condition est vraie, aller à la fin
   	 }
    	else {                          // si la condition est fausse
    	    delay(1000);                // pendant 10 sec
  	      displayColor(0, 255, 255);  // allumer en Jaune
   	 }
    delay(10000);                 // pendant 10 sec
    displayColor(0, 0, 0);        // Eteindre la LED
    delay(5000);                  // pendant 5 sec
  }
			

/** Affiche une couleur */
void displayColor(byte r, byte g, byte b) {

  // Assigne l'état des broches
  // Version cathode commune
  analogWrite(LED_R, r);
  analogWrite(LED_G, g);
  analogWrite(LED_B, b);
  

Où me suis-je trompé?
Comment amélioré mon code?

vous tirez un nombre choixCouleur au hasard entre 1 et 3 avec cette ligne, pas 1 et 4

  choixCouleur = random(1, 4);      // Choix aléatoire de la couleur

à la fin du code vous affichez dans l'ordre

  • rouge (retenu si choixCouleur était 1) (➜ votre commentaire dit bleu mais pas le code)
  • vert (retenu si choixCouleur était 2)
  • bleu (retenu si choixCouleur était 3 ) (➜ votre commentaire dit rouge mais pas le code)
  • jaune (retenu si choixCouleur était 4 ce qui n'est pas possible)

J'ai testé:
_En triant un nombre choixCouleur au hasard entre 1 et 4 , j'arrive à sortir des couleurs vertes ou rouges.
_En triant un nombre choixCouleur au hasard entre 1 et 3 , j'arrive à sortir des couleurs bleues ou vertes.
Mais dans tous les cas, il manque deux couleurs.

en utilisant des fonctions et des tableaux pour être générique

un exemple

si vous voulez conserver votre structure faites

// boucle avec choix aléatoire de la couleur
choixCouleur = random(1, 5);      // Choix aléatoire de la couleur entre 1 et 4

displayColor(255, 0, 0);          // allumer en rouge
--choixCouleur;

if (choixCouleur != 0) {
  delay(1000);                    // pendant 1 sec
  displayColor(0, 255, 0);        // allumer en Vert
  --choixCouleur;
}

if (choixCouleur != 0) {
  delay(1000);                    // pendant 1 sec
  displayColor(0, 0, 255);        // allumer en Bleu
  --choixCouleur;
}

if (choixCouleur != 0) {
  delay(1000);                    // pendant 10 sec
  displayColor(0, 255, 255);      // allumer en Jaune
  --choixCouleur;
}

delay(10000);                     // pendant 10 sec
displayColor(0, 0, 0);            // Eteindre la LED
delay(5000);                      // pendant 5 sec

ensuite les nombre aléatoires étant ce qu'ils sont, il se peut qu'il y ait des répétitions. Faut être patient pour voir toutes les possibilités sortir. (ou réduisez les délais)

1 Like

Je ne connaissais pas ces fonctions, je vais regarder de plus près

En effet, c'est très intéressant, et ça marche mieux.
Maintenant, les résultats Bleus, Verts et Rouges fonctionnent. Mais toujours pas le Jaune.
Je vais essayé de comprendre comment arranger ça, et ajouter un bouton poussoir de déclenchement de la "loterie".

Vous avez quoi dans random? Avec mon code d’exemple toutes les valeurs sortent

La LED faisait un genre de blanc, à la place du jaune. Après investigation, je me suis aperçu que les pin rouge et bleue, étaient inversées.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.