Pages: 1 [2]   Go Down
Author Topic: dessine moi un m0u10n  (Read 1458 times)
0 Members and 1 Guest are viewing this topic.
France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Voila de quoi te mettre sous la dent smiley-wink
Code:
#define THRESHOLD 100
#define SENSOR A0
byte cmp = 0; // compteur d'index

void setup(){
pinMode(9,INPUT); // bouton poussoir
pinMode(10,OUTPUT); // led 1
pinMode(11,OUTPUT); // led 2
}

void loop(){
if (analogRead(SENSOR) >= THRESHOLD)
switch(cmp){
case 0:
led1();
cmp++;
break;
case 1:
led2();
cmp++;
break;
case 2:
cmp = 0;
break;
}
}
delay(500); // anti rebond
}

void led1(){
  digitalWrite(10, HIGH);  
  delay(50);
  digitalWrite(10, LOW);
  delay(50);
}

void led2(){
  digitalWrite(11, HIGH);  
  delay(50);
  digitalWrite(11, LOW);
  delay(50);
}
« Last Edit: July 23, 2011, 04:15:01 am by skywodd » Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Jr. Member
**
Karma: 0
Posts: 56
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

super, ça fonctionne, mais il y avait 2 3 petites erreurs je rejoins le bazar corrigé



Code:
#define THRESHOLD 100
#define SENSOR A0
byte cmp =0; // compteur d'index

void setup(){
pinMode(0,INPUT); // bouton poussoir
pinMode(10,OUTPUT); // led 1
pinMode(11,OUTPUT); // led 2
pinMode(12,OUTPUT); // led 3
}

void loop(){
if (analogRead(SENSOR) >= THRESHOLD)
switch(cmp){
case 0:
led1();
cmp++;
break;
case 1:
led2();
cmp++;
break;
case 2:


led3();
cmp++;
break;

                case 3:
                        cmp = 0;
break;
}


delay(1); // anti rebond
}



void led1(){
  digitalWrite(10, HIGH); 
  delay(200);
  digitalWrite(10, LOW);
  delay(2);
}

void led2(){
  digitalWrite(11, HIGH); 
  delay(200);
  digitalWrite(11, LOW);
  delay(2);
}


void led3(){
  digitalWrite(12, HIGH); 
  delay(200);
  digitalWrite(12, LOW);
  delay(2);
}
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 56
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voici mon super code qui allume toutes mes leds.

maintenant apres quelques essais je me trouve face à un probleme

admetons que la sequence 1 soit une boucle qui allume/eteint successivement led 12, 11, 10 puis boucle, 12,11,10 puis boucle etc etc...

lors d'un autre appui sur piezzo alors passer à la sequence 2 qui allume/eteint succesivement led 9,8,7,6 puis boucle

etc etc.


je suis face à 2 blemes, comment si ce n'est avec loop, boucler une sequence... destinée à etre switchée et boucler sur une autre.

ici j'ai réussi à faire differentes séquences mais elle ne bouclent pas... et surtout le switch de cas ne peut s'effectuer seulement lorsque la sequence est terminée...


Code:
#define THRESHOLD 100
#define SENSOR A0
byte cmp =0; // compteur d'index

void setup(){
pinMode(0,INPUT); // Piezzo

 pinMode(12,OUTPUT); // led 12
  pinMode(11,OUTPUT); // led 11
   pinMode(10,OUTPUT); // led 10
    pinMode(9,OUTPUT); // led 9
     pinMode(8,OUTPUT); // led 8
      pinMode(7,OUTPUT); // led 7
        pinMode(6,OUTPUT); // led 6
pinMode(5,OUTPUT); // led 5
          pinMode(4,OUTPUT); // led 4
   pinMode(3,OUTPUT); // led 3
            pinMode(2,OUTPUT); // led 2
     pinMode(1,OUTPUT); // led 1

}




void loop(){
if (analogRead(SENSOR) >= THRESHOLD)
switch(cmp){
case 0:
sequence1();
cmp++;
break;
case 1:
sequence2();
cmp++;
break;
case 2:
sequence3();
cmp++;
break;


                case 3:
                      sequence4();
cmp++;
break;


    case 4:
                      sequence5();
cmp++;
break;


  case 5:
                      sequence6();
cmp++;
break;

  case 6:
                      sequence7();
cmp++;
break;

  case 7:
                      sequence8();
cmp++;
break;


  case 8:
                      sequence9();
cmp++;
break;


  case 9:
                      sequence10();
cmp++;
break;

  case 10:
                      sequence11();
cmp++;
break;

  case 11:
                      sequence12();
cmp++;
break;

                case 12:
                        cmp = 0;
break;
}


delay(1); // anti rebond
}



void sequence1(){
  digitalWrite(1, HIGH); 
  delay(200);
  digitalWrite(1, LOW);
  delay(2);
}

void sequence2(){
  digitalWrite(2, HIGH); 
  delay(200);
  digitalWrite(2, LOW);
  delay(2);
}


void sequence3(){
  digitalWrite(3, HIGH); 
  delay(200);
  digitalWrite(3, LOW);
  delay(2);
}
 
  void sequence4(){
  digitalWrite(4, HIGH); 
  delay(200);
  digitalWrite(4, LOW);
  delay(2);
  }
 
 
  void sequence5(){
  digitalWrite(5, HIGH); 
  delay(200);
  digitalWrite(5, LOW);
  delay(2);
}
 
 
 void sequence6(){
  digitalWrite(6, HIGH); 
  delay(200);
  digitalWrite(6, LOW);
  delay(2);
}
 
 
 void sequence7(){
  digitalWrite(7, HIGH); 
  delay(200);
  digitalWrite(7, LOW);
  delay(2);
}
 
 
 void sequence8(){
  digitalWrite(8, HIGH); 
  delay(200);
  digitalWrite(8, LOW);
  delay(2);
}
 
 
 void sequence9(){
  digitalWrite(9, HIGH); 
  delay(200);
  digitalWrite(9, LOW);
  delay(2);
}
 
 
 void sequence10(){
  digitalWrite(10, HIGH); 
  delay(200);
  digitalWrite(10, LOW);
  delay(2);
}


void sequence11(){
  digitalWrite(11, HIGH); 
  delay(200);
  digitalWrite(11, LOW);
  delay(2);
}
 
 
 void sequence12(){
  digitalWrite(12, HIGH); 
  delay(200);
  digitalWrite(12, LOW);
  delay(2);
}
 
 
 
Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3432
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La "méthode Arduino" qui consiste à prendre un morceau de code et à le modifier a ses limites. Il arrive un moment ou il faut poser le clavier et prendre un papier et un crayon.
Il faut décrire dans un langage simple ce que l'on veut faire et ensuite le programme vient de lui même.

Dans ton cas par exemple

début boucle principale
    afficher_séquence(numéro_de_sequence)
    voir_si_il_y_a_une_commande
   si commande
        modifier_le_numero_de_la_sequence
fin_de_la_boucle

Ce genre de description fait apparaitre la structure du programme, le découpage en fonctions et les variables nécessaires.
Ensuite on descend d'un cran on détaille chacune des fonctions jusqu'à arriver à des fonctions de base qui se traduisent directement en C.

Et on évite ainsi des aberrations comme cette répétition des 4 même lignes pour afficher tes séquences.

au lieu d'écrire sequence1, séquence2, séquence3, .... il est plus simple (et plus compacte) d'écrire
Code:
void sequence_n(int numero_de_port){
  digitalWrite(numero_de_port, HIGH);  
  delay(200);
  digitalWrite(numero_de_port, LOW);
  delay(2);
}

ensuite tu l'utilises comme cela
Code:
  sequence_n(11);
   sequence_n(12);
   sequence_n(13);

tu peux même rendre la chose encore plus facile à paramétrer en utilisant des tableaux et ainsi placer au début de ton code la description des séquences
Code:
int seq1[3]={11,12,13};
int index;

   for (index=0;index<3;index++){
     sequence_n(seq1[index]);
  }

ensuite si tu veux pouvoir changer en dynamique la séquence tu fais

Code:
int seq1[3]={11,12,13};
int seq2[3]={8,9,10};
int *seq;
int index;


   seq = seq 1;
   for (index=0;index<3;index++){
     sequence_n(seq[index]);
  }
  seq = seq 2;
   for (index=0;index<3;index++){
     sequence_n(seq[index]);
  }

Ensuite la réception d'une commande peut très conditionner l'affectation d'une table à la variable seq. Et on se dirige vers ce que tu veux faire
« Last Edit: July 26, 2011, 02:58:41 am by fdufnews » Logged

Toulouse, FRANCE
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

fdunews a été plus rapide que moi!
J'ai repris le même principe que lui pour créer ce code : je me suis posé devant une feuille pour faire la structure puis j'ai remplis les fonctions.

Code:
//Constantes pour le parametrage des LEDs (afin d'eviter de fixer la pin dans le code)
#define LED_SEQ1_1 12
#define LED_SEQ1_2 11
#define LED_SEQ1_3 10

#define LED_SEQ2_1  9
#define LED_SEQ2_2  8
#define LED_SEQ2_3  7
#define LED_SEQ2_4  6

#define PIEZZO A0

#define THRESHOLD 100

//Déclaration des variables globales disponibles dans tout le code
int Compteur_Piezzo;
int State_Seq1;
int State_Seq2;

void setup() {
//Declaration des E/S
pinMode(LED_SEQ1_1, OUTPUT);
pinMode(LED_SEQ1_2, OUTPUT);
pinMode(LED_SEQ1_3, OUTPUT);

pinMode(LED_SEQ2_1, OUTPUT);
pinMode(LED_SEQ2_2, OUTPUT);
pinMode(LED_SEQ2_3, OUTPUT);
pinMode(LED_SEQ2_4, OUTPUT);


//Initialisation des E/S
ResetSeq1();
ResetSeq2();


Compteur_Piezzo = 1;
State_Seq1 = 0;
State_Seq2 = 0;

}//setup

void loop() {
//Modification de la sequence sur pression du boutton piezzo
if(analogRead(PIEZZO) >= THRESHOLD) {
Compteur_Piezzo++;
if(Compteur_Piezzo > 2)
Compteur_Piezzo = 1;
}

//Affichage des sequences
if(Compteur_Piezzo == 1) {
ResetSeq2();
IncSeq1();
}
else if(Compteur_Piezzo == 2) {
ResetSeq1();
IncSeq2();
}
else {
SeqErreur();
}

delay(500);
}//loop

void ResetSeq1() {
digitalWrite(LED_SEQ1_1, LOW);
digitalWrite(LED_SEQ1_2, LOW);
digitalWrite(LED_SEQ1_3, LOW);
}

void ResetSeq2() {
digitalWrite(LED_SEQ2_1, LOW);
digitalWrite(LED_SEQ2_2, LOW);
digitalWrite(LED_SEQ2_3, LOW);
digitalWrite(LED_SEQ2_4, LOW);
}

void IncSeq1() {
//En fonction de la variable d'état, on allume et éteint les leds dans l'ordre
if(State_Seq1 == 1) {
digitalWrite(LED_SEQ1_3, LOW);
digitalWrite(LED_SEQ1_1, HIGH);
}
else if(State_Seq1 == 2) {
digitalWrite(LED_SEQ1_1, LOW);
digitalWrite(LED_SEQ1_2, HIGH);
}
else if(State_Seq1 == 3) {
digitalWrite(LED_SEQ1_2, LOW);
digitalWrite(LED_SEQ1_3, HIGH);
}
else {
ResetSeq1();
State_Seq1 = 0;
}
State_Seq1++;
}

void IncSeq2() {
//En fonction de la variable d'état, on allume et éteint les leds dans l'ordre
if(State_Seq2 == 1) {
digitalWrite(LED_SEQ2_4, LOW);
digitalWrite(LED_SEQ2_1, HIGH);
}
else if(State_Seq2 == 2) {
digitalWrite(LED_SEQ2_1, LOW);
digitalWrite(LED_SEQ2_2, HIGH);
}
else if(State_Seq2 == 3) {
digitalWrite(LED_SEQ2_2, LOW);
digitalWrite(LED_SEQ2_3, HIGH);
}
else if(State_Seq2 == 4) {
digitalWrite(LED_SEQ2_3, LOW);
digitalWrite(LED_SEQ2_4, HIGH);
}
else {
ResetSeq2();
State_Seq2 = 0;
}
State_Seq2++;
}

void SeqErreur() {
digitalWrite(LED_SEQ1_1, HIGH);
digitalWrite(LED_SEQ1_2, HIGH);
digitalWrite(LED_SEQ1_3, HIGH);
digitalWrite(LED_SEQ2_1, HIGH);
digitalWrite(LED_SEQ2_2, HIGH);
digitalWrite(LED_SEQ2_3, HIGH);
digitalWrite(LED_SEQ2_4, HIGH);
}

Cet exemple est fonctionnel (je ne souhaitais pas faire compliqué) mais l'utilisation des tableaux est beaucoup plus efficace.

Et je répète ce qui vient d'être écrit : poser ton projet sur un papier (forum) et élabores un code dans son ensemble.
Cela évitera l'assemblage de morceaux qui donne quelque chose d'incompréhensible.

ET SURTOUT : commentez votre code pour les autre et vous plus tard!

En fait vj_muddy tu devrais commencer par lire le très bon tuto du Site du Zero (lien déjà donné par Skywodd : http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html)
Cela t'aiderai beaucoup et comme ça les questions que tu poserai serai vraiment des problèmes. Car là on a un peu l'impression que tu nous demande de faire ton code, ce qui n'est pas exactement l'objectif. smiley-grin
« Last Edit: July 26, 2011, 03:55:39 am by Cired » Logged

Pages: 1 [2]   Go Up
Jump to: