Go Down

Topic: Tirage au sort sur 25 ou 30 led Possible? (Read 907 times) previous topic - next topic

bricofoy

tu veux faire quoi exactement avec le bouton ?
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Leeleen

En me relisant, je trouve aussi ne pas avoir été clair  :smiley-mr-green:

J'alimente l'arduino, les led clignotent aléatoirement pour donner un effet de mélange, le random fonctionne et allume 4-5 led par seconde en boucle sans arrêt. Cela permet de voir que, à un moment ou à un autre, chaque led peut s'allumer.

Je voudrais qu'en poussant sur ce bouton, le RANDOM se termine et laisse la dernière led allumée.

Je pense que je vais rester sur un IF (bouton enfoncé) WAIT (10-15 sec) comme ça la boucle repart après avoir affiché le tirage au sort.

Code: [Select]
pinMode(10,INPUT)
if (digitalread 10 == High) wait 10000
ce serait bon?

bricofoy

peux-tu poster ton code actuel complet ?

-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Leeleen

#18
Sep 23, 2017, 06:32 pm Last Edit: Sep 23, 2017, 07:05 pm by Leeleen Reason: ajout résistances
Voici mon code
Soyez indulgents sur l'organisation, je ne maîtrise pas encore toutes les ficelles...
Code: [Select]
void setup() {
  // put your setup code here, to run once:
const byte pinsLeds[] = {2, 3, 4, 5, 6, 7};
Serial.begin(9600);
  pinMode(10,INPUT_PULLUP); // pour l'interrupteur
  
}

void loop(){
    pinMode(2, INPUT);
    digitalWrite(2, LOW);
    pinMode(3, INPUT);
    digitalWrite(3, LOW);
    pinMode(4, INPUT);
    digitalWrite(4, LOW);
    pinMode(5, INPUT);
    digitalWrite(5, LOW);
    pinMode(6, INPUT);
    digitalWrite(6, LOW);
    pinMode(7, INPUT);
    digitalWrite(7, LOW);  
    
  

;int nbAlea;
  randomSeed(analogRead(0));
  nbAlea=random(1, 5);
  Serial.println(nbAlea);
 if (nbAlea == 1)  // j'ai mis les adressages led au pif pour 4 LEDS
{
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  }
if (nbAlea == 2)
{
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  }
if (nbAlea == 3)
{
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
  }
if (nbAlea == 4)
{
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  }
  // etc etc

delay(100); // juste assez de temps pour que l'allumage soit visible

  int etat = digitalRead(10); // a sera HIGH ou LOW selon bouton
  
  if(etat == LOW)
{
  delay(10000);  // une pause avec dernière LED allumée
}
  }
  



EDIT j'ai des résistances 120ohms  ça semble nickel : la led est lumineuse et cycle sur ses couleurs

bricofoy

#19
Sep 24, 2017, 09:58 am Last Edit: Sep 24, 2017, 09:59 am by bricofoy
essayes avec ceci, normalement le fonctionnement devrait être : allumage, les leds clignotent, appui = ça fige, nouvel appui = ça repart

n'ayant pas ton matériel je ne l'ai pas testé, mais à priori ça doit aller

Code: [Select]
void setup()
{
  // put your setup code here, to run once:
  const byte pinsLeds[] = {2, 3, 4, 5, 6, 7};
  Serial.begin(9600);
  pinMode(10, INPUT_PULLUP); // pour l'interrupteur

}

void loop()
{
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  pinMode(5, INPUT);
  digitalWrite(5, LOW);
  pinMode(6, INPUT);
  digitalWrite(6, LOW);
  pinMode(7, INPUT);
  digitalWrite(7, LOW);



  int nbAlea;
  randomSeed(analogRead(0));
  nbAlea = random(1, 5);
  Serial.println(nbAlea);
  if (nbAlea == 1)  // j'ai mis les adressages led au pif pour 4 LEDS
  {
    pinMode(2, OUTPUT);
    digitalWrite(2, HIGH);
    pinMode(6, OUTPUT);
    digitalWrite(6, LOW);
  }
  if (nbAlea == 2)
  {
    pinMode(5, OUTPUT);
    digitalWrite(5, HIGH);
    pinMode(3, OUTPUT);
    digitalWrite(3, LOW);
  }
  if (nbAlea == 3)
  {
    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);
    pinMode(5, OUTPUT);
    digitalWrite(5, LOW);
  }
  if (nbAlea == 4)
  {
    pinMode(6, OUTPUT);
    digitalWrite(6, HIGH);
    pinMode(2, OUTPUT);
    digitalWrite(2, LOW);
  }
  // etc etc

  delay(100); // juste assez de temps pour que l'allumage soit visible

  if(digitalRead(10) == LOW); // LOW si bouton appuyé
  {
    delay(10); //un délai pour éviter de prendre en compte les rebonds du contact
    
    while(digitalRead(10) == LOW)//on attends tant que le bouton n'a pas été relaché
    { }//on ne ne fait rien, on attends

    //ici le bouton a été relaché
    
    while(digitalRead(10) == HIGH)//maintenant le bouton à été relaché, on va attendre tant qu'il reste relaché
    { }//on ne ne fait rien, on attends

    //ici il a été à nouveau appuyé
    
    while(digitalRead(10) == LOW)//on attends tant que le bouton n'a pas été relaché
    { }//on ne ne fait rien, on attends
    
    delay(10); //un délai pour éviter de prendre en compte les rebonds du contact lors de l'appel suivant de loop()
  }
    

}
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Leeleen

#20
Sep 24, 2017, 04:50 pm Last Edit: Sep 24, 2017, 06:15 pm by Leeleen
Merci mais ça va pas...

J'allume et il me sort 1 allumage aléatoire et s'arrête.
A chaque appui et relâchement  du bouton il me ressort 1 seul allumage, il ne boucle pas, il attend un appui/relâchement pour changer d'allumage.
Il ne change qu'au relâchement -> HIGH

J'ai même testé avec une résistance de pull-up , même résultat 1 appui/relâchement = 1 changement

Étrange...

Dans la boucle WHILE il faudrait pas relire la valeur de digitalRead(10) ?


kamill

#21
Sep 24, 2017, 08:13 pm Last Edit: Sep 24, 2017, 08:14 pm by kamill
Bonjour,

Tu as un défini tableau de leds pinsLeds[]. Il faut utiliser ce tableau.
Ca donne un programme comme ça.

Code: [Select]
const byte pinsLeds[] = {2, 3, 4, 5, 6, 7};
const int NBLEDS=sizeof pinsLeds;
const byte pinButton=10;

void setup()
{
 Serial.begin(9600);
 // put your setup code here, to run once:
 pinMode(pinButton, INPUT_PULLUP); // pour l'interrupteur
}

void loop()
{
 static int nled=0;
 static bool etatButtonPrec=false;
 
 bool etatButton=digitalRead(pinButton)==LOW;
 
 if (etatButton)
 {
   digitalWrite(pinsLeds[nled],LOW);
   nled++;
   if (nled>=NBLEDS)
     nled=0;
   digitalWrite(pinsLeds[nled],HIGH);
   delay(100);
 }
 
 if (etatButton!=etatButtonPrec && !etatButton)
 {
   // on vient de relacher le bouton
   int nrand=(micros()/4)%NBLEDS+1; // on utilise le nombre de micros au moment ou on relache comme nombre aléatoire
   for (int i=0; i<nrand; i++)
   {
     digitalWrite(pinsLeds[nled],LOW);
     nled++;
     if (nled>=NBLEDS)
       nled=0;
     digitalWrite(pinsLeds[nled],HIGH);
     delay(200);
   }
 }
 etatButtonPrec=etatButton;
}

Leeleen

#22
Sep 24, 2017, 09:51 pm Last Edit: Sep 24, 2017, 10:23 pm by Leeleen
 :o  Impressionnant ! Kamill,  c'est du code de pro là !
Mais j'ai rien compris ! (int nrand=(micros()/4)%NBLE... etc)  :smiley-eek-blue:  :smiley-eek-blue:
Merci pour ta participation. Mais, un peu d'indulgence, je débute  :-[  Je suis LOIN de ton niveau.
Je l'ai chargé pour tester et rien ne démarre, aucune trace sur le moniteur série.   :smiley-cry:


Mon code fonctionnait bien jusque là.  
Malfoutu, mal organisé, avec plein de trucs inutiles ou trop lourds (je sais) mais c'était ma petite création.
Il ne me manque que ce  :-X  de bouton pour le finaliser. Si j'y arrive pas ce sera avec le DELAY activé par bouton et hop bon pour le service.

L'effet bouton arrêt / redémarrage m'aurait bien plu pourtant.


Edit solution à la Mac Gyver : un bouton avec un delay énoooorme et un second bouton RESET. Je sais je suis un barbare... :smiley-lol:

bricofoy

#23
Sep 24, 2017, 10:41 pm Last Edit: Sep 24, 2017, 10:46 pm by bricofoy
Merci mais ça va pas...

J'allume et il me sort 1 allumage aléatoire et s'arrête.
A chaque appui et relâchement  du bouton il me ressort 1 seul allumage, il ne boucle pas, il attend un appui/relâchement pour changer d'allumage.
Il ne change qu'au relâchement -> HIGH

J'ai même testé avec une résistance de pull-up , même résultat 1 appui/relâchement = 1 changement

Étrange...

Dans la boucle WHILE il faudrait pas relire la valeur de digitalRead(10) ?

justement, l'intéret de while c'est que ça relis constamment l'entrée : il lit la valeur et tant que la condition est vraie, il execute ce qui est entre les { }, soit ici rien, mais comme ça on a une attente tant que la condition est vraie.

j'ai considéré que ton bouton mettait à la masse la pin d'entrée lorsqu'il est appuyé. est-ce vraiment le cas ?

si au contraire il est entre la pin et le 5V, alors il faut inverser les HIGH et LOW dans le code.

sinon essayes avec le code suivant (juste quelques modifs dans la partie du bouton, pour rajouter des délais et éviter de sauter d'une condition à l'autre avec les rebonds du contact. Si ça ne marche toujours pas tu peux essayer en augmentant les délais entre les étapes, passer de 10 à 50 ou 100) :
Code: [Select]

  if(digitalRead(10) == LOW); // LOW si bouton appuyé
  {
    delay(10); //un délai pour éviter de prendre en compte les rebonds du contact
   
    while(digitalRead(10) == LOW)//on attends tant que le bouton n'a pas été relaché
    { }//on ne ne fait rien, on attends

    delay(10); //un délai pour éviter de prendre en compte les rebonds du contact

    //ici le bouton a été relaché
   
    while(digitalRead(10) == HIGH)//maintenant le bouton à été relaché, on va attendre tant qu'il reste relaché
    { }//on ne ne fait rien, on attends

    //ici il a été à nouveau appuyé
   
    delay(10); //un délai pour éviter de prendre en compte les rebonds du contact
   
    while(digitalRead(10) == LOW)//on attends tant que le bouton n'a pas été relaché
    { }//on ne ne fait rien, on attends
   
    delay(100); //un délai pour éviter de prendre en compte les rebonds du contact lors de l'appel suivant de loop()
  }


et sinon la version simplifiée, c'est juste appui sur le bouton = fige l'affichage, relacher = ça repart

dans ce cas tu utilises juste
Code: [Select]
    while(digitalRead(10) == LOW)//si bouton activé on rentre dans la boucle
    { delay(10); }//on ne ne fait rien, on attends

Avec possibilité d'allonger le delay si tu veux que ça fasse une pause même en lâchant le bouton

toujours en partant du principe que bouton activé == LOW bien entendu si le bouton est entre la pin et le 5V il faut utiliser HIGH
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Leeleen

 :smiley-mr-green:  Merciiiiiiiiiiiiiiiiii
La version simplifiée est nickel ! 
J'y avais pas pensé

J'appuie et ça mélange, je lâche et hop ça s'arrête. Je peux ainsi conserver le dernier résultat indéfiniment !

Youpeeeeeeeeeeeeeeeeeeeeeee



Je n'ai plus qu'à fixer tout ça !

MERCI !!!!!!!!!!! Et longue vie à ce forum et à ses passionnés  !

La vidéo suivra quand tout sera fini

bricofoy

hu attends, si ça mélange que quand tu appuies, alors c'est que ton bouton est raccordé au 5V et non à la masse. c'est pour ça que mes exemples ne fonctionnent pas !

dans le code que je t'ai donné inverse à chaque fois LOW avec HIGH et inversement, et ça va fonctionner comme prévu
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Leeleen

Oups j'ai oublié de dire que j'avais bien inversé  le HIGH et LOW dans la version simplifiée. 
Code: [Select]
  while(digitalRead(10) == HIGH)//si bouton activé on rentre dans la boucle
    { delay(10); }//on ne ne fait rien, on attend


Encore merci.

bricofoy

ha donc quand c'est inversé ça ne fonctionne pas comme prévu, donc ton bouton est bien cablé entre pin et gnd

...

donc les premiers exemples auraient du fonctionner comme prévu ! il y a un truc qui m'échappe...
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Leeleen

J'avais essayé d'inverser LOW et HIGH et j'avais même tenté avec un INPUT et résitance pullup / pulldown : Pas de changement.

Maintenant, ça fonctionne. C'est le principal !

Leeleen

#29
Oct 05, 2017, 11:15 am Last Edit: Oct 05, 2017, 03:21 pm by Leeleen
J'ai tout percé, fixé, soudé...
30 leds c'est beau !  

Je branche et ... rien ne va :o
Je teste chaque sortie de l'arduino : parfait
Je teste chaque borne de la matrice de led et catastrophe ! Mon alim indique 5v et 1A !!! En effet, les led RGB déraillent complètement en tête-bêche, j'ai des retours de courant sur les autre leds.
J'alimente 2 bornes en + et - , une led s'allume parfaitement et 8 autres s'allument aussi mais faiblement !

Bref, j'arrache et je remplacerai par de la led basique verte et orange.


En achevant le code, je remarque qu'à l'allumage, un nombre aléatoire est déjà choisi. Ne serait-il pas possible de déplacer la commande "bouton" AVANT le random ?

EDIT : ça marche !
Code: [Select]
void setup() {
  // put your setup code here, to run once:
const byte pinsLeds[] = {2, 3, 4, 5, 6, 7};
Serial.begin(9600);
  pinMode(10,INPUT_PULLUP); // pour l'interrupteur
 
}

void loop(){
 delay(40); // juste assez de temps pour que l'allumage soit visible
  int etat = digitalRead(10); // a sera HIGH ou LOW selon bouton
      while(digitalRead(10) == HIGH)//si bouton activé on mélange
    { delay(10); }//on ne ne fait rien, on attends
    pinMode(2, INPUT);
    digitalWrite(2, LOW);
    pinMode(3, INPUT);
    digitalWrite(3, LOW);
    pinMode(4, INPUT);
    digitalWrite(4, LOW);
    pinMode(5, INPUT);
    digitalWrite(5, LOW);
    pinMode(6, INPUT);
    digitalWrite(6, LOW);
    pinMode(7, INPUT);
    digitalWrite(7, LOW); 
     


   



;int nbAlea;
  randomSeed(analogRead(0));
  nbAlea=random(1, 31);
  Serial.println(nbAlea);
 
 if (nbAlea == 1)  //  adressages led au pif
{
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  }
if (nbAlea == 2)
{
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  }
if (nbAlea == 3)
{
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
  }
if (nbAlea == 4)
{
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  }
 if (nbAlea == 5)
{
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
  }
 if (nbAlea == 6)
{
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  }
 if (nbAlea == 7)
{
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  }
 if (nbAlea == 8)
{
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
  }
 if (nbAlea == 9)
{
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  }
 if (nbAlea == 10)
{
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
  }
 if (nbAlea == 11)
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  }
 if (nbAlea == 12)
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  }

  if (nbAlea == 13)
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
  }
  if (nbAlea == 14)
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  }
  if (nbAlea == 15)
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
  }
  if (nbAlea == 16)
{
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  }
  if (nbAlea == 17)
{
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  }
  if (nbAlea == 18)
{
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  }
  if (nbAlea == 19)
{
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  }
  if (nbAlea == 20)
{
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
  }
  if (nbAlea == 21)
{
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  }
   if (nbAlea == 22)
{
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  }
   if (nbAlea == 23)
{
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  }
   if (nbAlea == 24)
{
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
  }
   if (nbAlea == 25)
{
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
  }
   if (nbAlea == 26)
{
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  }
    if (nbAlea == 27)
{
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  }
     if (nbAlea == 28)
{
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  }
     if (nbAlea == 29)
{
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
  }
     if (nbAlea == 30)
{
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  }}
   

Prochaine étape j'ajoute un buzzer quand le bouton est appuyé...

Go Up