Aller au contenu


Photo
- - - - -

Problème dans code


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 adri-RX

adri-RX

    Membre occasionnel

  • Membres
  • Pip
  • 132 messages
  • Gender:Male

Posté 01 août 2010 - 06:51

Salut,

j'essaye de réaliser une horloge à LED avec une Arduino Duemilanove (uniquement la trotteuse et avec seulement 8 LED)

Je voulais éviter d'allumer les LEDs "à la main" donc j'ai essayé d'utiliser une variable ("i"). Mais mon programme ne marche pas, les LEDs ne s'allume pas à partir de void loop ().
Voici mon programme:
int LED2 = 2;
int LED3 = 3;
int LED4 = 4;
int LED5 = 5;
int LED6 = 6;
int LED7 = 7;
int LED8 = 8;

int i;


void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
pinMode(LED8, OUTPUT);

digitalWrite(LED1, HIGH); // TOUT ON
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, HIGH);
digitalWrite(LED7, HIGH);
digitalWrite(LED8, HIGH);

delay(1000);

digitalWrite(LED1, LOW); // TOUT OFF
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
digitalWrite(LED7, LOW);
digitalWrite(LED8, LOW);

delay(10);
}

void loop () {

for (i = 0 ; i <= 60 ;i++){

analogWrite(i, HIGH); // génère une impulsion sur la broche i
analogWrite(i --, LOW); // éteinds la LED précédente

delay(75); // Temps avant d'allumer une nouvelle LED

}
}
[/code]

Ou est le problème?

Merci d'avance
Adri

PS: merci Philippe pour cette idée :D

#2 Philippe-RX

Philippe-RX

    Membre

  • Membres
  • 17 messages

Posté 01 août 2010 - 08:09

"analogWrite(i, HIGH);"

Gros problème. Déjà pourquoi analogWrite() ?
pourquoi tu ne fais pas pareil que dans setup : digitalWrite(LED1, LOW);

Ensuite un autre problème c'est que la variable i va de 0 à 60.
c'est un problème car tu n'as pas 60 pins sur ton arduino. Tu as 8 LED.

Pour finir : -- est un raccourci pour "-= 1", en gros tu aurais dû utiliser "-1" et pas --, sinon i n'incrémentera pas. -- décrémente la variable et garde la nouvelle valeur.

Tu as maintenant assez d'info pour corriger le code, dernière recommandation : fais attention à ne pas avoir de i = -1;
donc je pense que avant le for. tu devrais allumer la première led et éteindre la dernière (et attendre les 75ms) avant d'attaquer la boucle for en commençant avec i = 1;

Ha oui aussi : dernier conseil : Change l'endroit où tu déclares i. i est déclaré dans l'espace global et j'ai peur que tu aies des gros problèmes de compilation en utilisant un deuxième i façon c++. C'est à dire for(int i; i < 8; i++)

#3 LeBob

LeBob

    Membre

  • Membres
  • 18 messages

Posté 01 août 2010 - 08:45

Si je peux te donner un conseil, utilise un tableau où tu mettras les entrées de tes Leds :




ensuite pour accéder à ton tableau, tu utilises toujours ta variable i ce qui donne dans une boucle par exemple :


digitalWrite(tLeds[i], HIGH);[/code]



Voilà, je trouve ça plus pratique ;)





Sinon, le analogWrite est utilisé pour générer des impulsions PWM et ne peut donc être utilisé que sur les sorties où il y a écrit PWM (3,5,6,9,10,11 sur la duemilanove)



#4 adri-RX

adri-RX

    Membre occasionnel

  • Membres
  • Pip
  • 132 messages
  • Gender:Male

Posté 02 août 2010 - 01:13

Merci à vous deux :)

J'ai finialement réussi à corriger mon code et il marche assez bien (sauf que le temps d'attente entre le moment ou la led 8 s'éteinds et celui ou la 1ere led s'allume est assez long).




int LED2 = 2;

int LED3 = 3;

int LED4 = 4;

int LED5 = 5;

int LED6 = 6;

int LED7 = 7;

int LED8 = 8;



void setup() {

pinMode(LED1, OUTPUT);

pinMode(LED2, OUTPUT);

pinMode(LED3, OUTPUT);

pinMode(LED4, OUTPUT);

pinMode(LED5, OUTPUT);

pinMode(LED6, OUTPUT);

pinMode(LED7, OUTPUT);

pinMode(LED8, OUTPUT);



digitalWrite(LED1, HIGH); // TOUT ON

digitalWrite(LED2, HIGH);

digitalWrite(LED3, HIGH);

digitalWrite(LED4, HIGH);

digitalWrite(LED5, HIGH);

digitalWrite(LED6, HIGH);

digitalWrite(LED7, HIGH);

digitalWrite(LED8, HIGH);



delay(1000);



digitalWrite(LED1, LOW); // TOUT OFF

digitalWrite(LED2, LOW);

digitalWrite(LED3, LOW);

digitalWrite(LED4, LOW);

digitalWrite(LED5, LOW);

digitalWrite(LED6, LOW);

digitalWrite(LED7, LOW);

digitalWrite(LED8, LOW);



delay(10);

}



void loop () {

digitalWrite(LED1, HIGH);





for (int i = 0 ; i <=8;i++){



digitalWrite(i, HIGH); // génère une impulsion sur la broche i

digitalWrite(i -1, LOW); // éteinds la LED précédente







delay(75);// Temps avant d'allumer une nouvelle LED



digitalWrite(LED8, LOW);

}





} [/code]





Par contre j'ai essayé ta technique Bobby (un peu à tatons) mais la Led 8 reste toujours allumé et les Leds s'allume à peine (elles n'éclairent pas beaucoup).





Ou sont les eurreurs? svp










void setup() {



Serial.begin(115200);



pinMode(tLeds[1,2,3,4,5,6,7,8], OUTPUT);



digitalWrite(tLeds[1,2,3,4,5,6,7,8], HIGH); // TOUT ON





delay(1000);



digitalWrite(tLeds[1,2,3,4,5,6,7,8], LOW); // TOUT OFF





delay(10);

}



void loop () {



digitalWrite(tLeds[1], HIGH);





for(int i=0;i<=8;i++){



digitalWrite(tLeds[i], HIGH); // génère une impulsion sur la broche i

digitalWrite(tLeds[i-1], LOW); // éteinds la LED précédente



delay(75); // Temps avant d'allumer une nouvelle LED



digitalWrite(tLeds[8], LOW);



}

}[/code]

#5 Philippe-RX

Philippe-RX

    Membre

  • Membres
  • 17 messages

Posté 02 août 2010 - 01:28

Tu dois revoir les tableaux pour résoudre ces problèmes :
http://www.siteduzero.com/tutoriel-3-14015-les-tableaux.html

pinMode(tLeds[1,2,3,4,5,6,7,8], OUTPUT); <- ce n'est pas comme ça qu'on parcoure un tableau.
Il faut utiliser un for. et on peut accéder qu'à une seule entrée du tableau à la fois.

digitalWrite(tLeds[1,2,3,4,5,6,7,8], LOW); <- pareil ici

digitalWrite(tLeds[1], HIGH); <- la première led est tLeds[0], cf cours de C

for(int i=0;i<=8;i++){ <- problème i va prendre valeur dans l'intervalle 0-8 compris.
Si tu comptes avec moi : 0 1 2 3 4 5 6 7 8 ça fait 9 chiffres soit 9 leds et tu as 8 LED donc y'a forcément un problème ici.


digitalWrite(tLeds[8], LOW); <- qui est dans la boucle for, à chaque fois que tu vas allumer une led ou en éteindre une, tu vas éteindre la 9ème LED, qui n'existe pas. Tu dois donc revoir l'emplacement de cette instruction.

edit : et tu as pas pris en compte ma recommandation :
"tu devrais allumer la première led et éteindre la dernière (et attendre les 75ms) avant d'attaquer la boucle for en commençant avec i = 1; "



#6 adri-RX

adri-RX

    Membre occasionnel

  • Membres
  • Pip
  • 132 messages
  • Gender:Male

Posté 02 août 2010 - 01:47

Ok merci, je regarderai sa de plus près :D

Et désolé pour ton Edit, je me suis un peu perdu quand j'ai corrigé le code, je vais y remédier dès que j'ai le temps, merci :)




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users