Go Down

Topic: Aide sur programmation!! (Read 1 time) previous topic - next topic

snoom82

BOnjour à tous,

je viens solliciter votre aide car je bloque sur un programme que je viens de faire!
En effet, j'ai fait un programme pour que, à chaque impulsion électrique, une led s'allume. Il y à 16 LEDS et l'idée est que chacune s'allume à son tour en incrémentant.
Mon soucis est que je voudrais bloquer chaque sortie une fois que la led s'est allumée! Et là je bloque!

La fonction qui régit cet allumage en incrémentation est la suivante :

Code: [Select]

void pasapas(){
  //Handle input
if(actualPreset == 8){ //si le preset est le numéro 8, alors...
  if(digitalRead(buttonTir) == LOW){ //c'est la lecture de la pin d'entrée pour l'impulsion électrique
  delay(attenteCapteurs); //attente pour relecture de la pin
   if(digitalRead(buttonTir) == LOW) counter++; //re lecture de la pin pour revérifier que il y a bien une impulsion électrique et incrémentation d'un counter

{
    if(counter > maxsorties) //si le counter est egal à maxsorties (16)
    {
      counter = maxsorties; //alors on tire continuellement la sortie 16
    }
    Serial.println(sorties[counter]);
      //TIR
  digitalWrite(sorties[counter], HIGH); //allumage de la sortie correspondant au counter
  delay(tpsTir); //durant un temps donné (20ms)
  //
  digitalWrite(sorties[counter], LOW); //puis extinction de la sortie correspondant au counter
 
  }
}
}
}


Si vous avez une idée...
Merci bcppp d'avance!!

Heloderma-kris

je n'ait pas tout compris de ce que tu chercher a faire ,mais il me semble qu'il te manque des acollade dans ton code

Code: [Select]
if(digitalRead(buttonTir) == LOW) counter++; //re lecture de la pin pour revérifier que il y a bien une impulsion électrique et incrémentation d'un counter


essaye
Code: [Select]
if(digitalRead(buttonTir) == LOW){ counter++; };//re lecture de la pin pour revérifier que il y a bien une impulsion électrique et incrémentation d'un counter

SesechXP

Salut,

Dans ce cas précis, les accolades sont facultatives. C'est juste que si on n'en met pas, seule la première ligne suivant le if sera exécutée si la condition est remplie.
Par contre s'il y avait eu plusieurs instructions soumises à la condition, les accolades auraient été nécessaires.

++

snoom82

Ben en fait, le code tel qu'il est marche, à chaque impulsion électrique les LEDS s'allument chacune leur tour, mais ce que je voudrais faire, c'est que si je laisse cette impulsion électrique continue, que l'incrémentation des LEDS s'arrête...

cyberfred91

Et si tu adaptais ce genre de technique :

If (entree==1)
{
  allumage de tes diodes en incrementant;
  while (entree=1)
  {
     delay(50); // pour eviter a ton arduino de retester a chaque instant.
  }
}

Comme ca tant que tu n'as pas relaché ton bouton, ca ne se reincremente pas. Par contre, a la compilation, ca peut eventuellement te dire une boucle sans fin :)

C'était une idée comme ca, en passant ( je débute ), mais j'aurais fait un truc du genre en Delphi.

Je vais essayer de faire un petit truc du genre ce soir en TP perso :p

snoom82

Merci pour ta réponse et ta proposition!
Vais voir aussi de mon coté en testant directement sur mon montage!! :)

cyberfred91

Regarde ceci  :

Code: [Select]
void setup()
{               
  pinMode(0, INPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

byte Nb = 0;

void loop()
  { 
  if (digitalRead(0)==HIGH){Nb = Nb++;};
  if (Nb >= 7) {Nb = 0;};
  AllumeDiode(Nb);
  delay(500);
//  while (digitalRead(0)==HIGH) {delay(1);};  // bug ou cablage mal fait.
  }

void AllumeDiode(byte ZZ)
{
  if (ZZ >=1) {digitalWrite(1,HIGH);} else {digitalWrite(1,LOW);};
  if (ZZ >=2) {digitalWrite(2,HIGH);} else {digitalWrite(2,LOW);};
  if (ZZ >=3) {digitalWrite(3,HIGH);} else {digitalWrite(3,LOW);};
  if (ZZ >=4) {digitalWrite(4,HIGH);} else {digitalWrite(4,LOW);};
  if (ZZ >=5) {digitalWrite(5,HIGH);} else {digitalWrite(5,LOW);};
  if (ZZ >=6) {digitalWrite(6,HIGH);} else {digitalWrite(6,LOW);};
}


J'ai cablé l'arduino de la façon suivante :

6 diodes aux sorties 1 a 6 DIGITAL
6 diodes sur le GRUND

1 fil entre le GROUND et le 0 DIGITAL ( switch )

Quand le GROUND est  0v, la séquence s'arrête. Des que tu appuis sur le bouton, tu mets l'entrée A 1, et toute les 500ms, le nombre de diode allumées augmente.

Je pense etre parvenu a peu pres a ce que tu voulais au départ. :) Mais d'une manière complétement différente.

Teste et dis moi si tu le modifies, que je ne meurt pas bête :p

barbudor


J'ai cablé l'arduino de la façon suivante :

6 diodes aux sorties 1 a 6 DIGITAL
6 diodes sur le GRUND


Hum!
Et les résistances de limitation de courant elle sont où ?

pushhhfffff fait l'Arduino qui brule tard le soir :D
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

cyberfred91

Erf, je n'en ai pas mises, en effet. C'est vrai qu'une diode a tendance a absorber tout ce qu'elle recoit :/

J'ai fait ca vite fait, j'avoue. Ca craint si ca peut detruire mon arduino :/ Surtout que je l'aime bien ma petite UNO.

Merci du conseil barbudor.
* cyberfred91 qui allait faire une version a 12 LEDs sur mon breadboard, je le ferais demain :p

snoom82

Cool merci Cyberfred!
Bon, les résistances sont à pas oublier en effet!
Je testerai le montage en l'adaptant demain car pas trop le temps aujourd'hui (malheureusement.... me tarde de trouver la soluce :p)

Je tiendrais au courant!

snoom82

Bon, après essai, j'ai réussi à faire ce que je voulais, mais différemment des propositions...
Si cela peut aider, voici le code!
Code: [Select]

void pasapas(){
  //Handle input
if(actualPreset == 8){
  if(digitalRead(buttonTir) == LOW && etatTir == false){
  delay(attenteCapteurs);
  if(digitalRead(buttonTir) == LOW){
     counter++;
 
    if(counter > maxsorties)
    {
      counter = maxsorties;
    }
    Serial.println(sorties[counter]);
    etatTir = true; // on mémorise qu'on entre dans une phase de Tir
      //TIR
  digitalWrite(sorties[counter], HIGH);
  delay(tpsTir);
  digitalWrite(sorties[counter], LOW);
  delay(200);
        }
      }
    else if(digitalRead(buttonTir) == HIGH && etatTir == true){
  etatTir = false;
    }
  }
}



En fait, j'ai rajouté une variable etatTir pour rajouter une condition au tir.
J'ai déclaré cette variable en début de code
boolean etatTir = false;
et la condition pour que cela tire est donc qu'il y ait une impulsion électrique sur l'entrée digitale, et que l'on soit en "etatTir == false". Etattir passe alors en true et j'allume la led (ou sortie) correspondante.

Go Up