Go Down

Topic: besoin d'un guide (Read 17333 times) previous topic - next topic

mirage2000

#45
Dec 19, 2013, 07:04 am Last Edit: Dec 20, 2013, 04:44 pm by mirage2000 Reason: 1
Quote
const int RS=A5 ;//declaration constante de broche
const int E=A4 ; //declaration constante de broche

const int D4=A0; //declaration constante de broche
const int D5=A1; //declaration constante de broche
const int D6=A2 //declaration constante de broche
const int D7=A3; //declaration constante de broche


Bon voici le schemas complet , et la nouvelle affectation des broches, est ca marche !!!! en faite je sais pas pourquoi, mais D2 et D13 ca merde!!!

http://imageshack.us/photo/my-images/849/irfa.jpg/

mirage2000

Je vais vous solliciter encore un peu, ci dessous le code permettant de commander mes leds suivant une table vérité établie:

Quote
//Pilotage de led Version du 11_12_2013//

#define BoutonUP 11
#define BoutonDOWN 12

const byte Fonction[] ={0b11000001,0b00110011,0b00110000,0b00111111,0b00111100}; //table fonctionnement sorties
const byte Pins[] = {3,4,5,6,7,8,9,10}; // à adapter suivant branchement des relais

int i,x;  // permet de demarrer a la plage 0
//int i;   // permet de demarrer à partir d'une plage choisi
//int x=1;

void setup() {

//for(i=0;i<8;i++){          //debute à la plage 0
//pinMode(Pins,OUTPUT);
//}
for(i=0;i<8;i++){            //debute a la plage 1
pinMode(Pins,OUTPUT);
digitalWrite(Pins,(1&Fonction
  • >>i));
    }


    pinMode(BoutonUP,INPUT_PULLUP);
    pinMode(BoutonDOWN,INPUT_PULLUP);

    }

    void loop() {

    if(digitalRead(BoutonUP)==LOW || digitalRead(BoutonDOWN)==LOW) {

    digitalRead(BoutonUP)==LOW?x++:x--;
    if(x>5)x=0;        // dimensionement du tableau
    if(x<0)x=5;

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

    digitalWrite(Pins,(1&Fonction
    • >>i));

      }

      while(digitalRead(BoutonUP)==LOW || digitalRead(BoutonDOWN)==LOW); //tant qu'un bouton est appuyé

      delay(500); // suppression des effets de rebond
      }

      }




comment faire maintenant pour que chaque fois que j'appuie sur le bouton UP /DW, j'affiche sur le LCD le N° de sequence de mes leds ????:
0b11000001  >>> sequence 1
0b00110011  >>> sequence 2
0b00110000 >>> sequence 3
0b00111111  >>> sequence 4
0b00111100   >>> sequence 5

merci





mirage2000

#47
Dec 20, 2013, 09:38 pm Last Edit: Dec 20, 2013, 09:51 pm by mirage2000 Reason: 1
Bonsoir,

J'essaie maintenant de coupler les deux bouts de code, je suis donc arrivé à cela:

Ca demarre, le LCD affiche        " Select UP/DW."  puis passe la main au contrôle des relais avec les BP  (merci encore B@tto), mais là il faudrait que je mette les conditions et passer l'info au LCD, (voir poste ci dessus) mais mon incompétence me bloque, une petite piste ???

Quote
//Pilotage de relay Version du 20_12_2013//

// --- Inclusion des librairies utilisées ---
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD

// --- Déclaration des constantes LCD ---
const int RS=A5; //declaration constante de broche
const int E=A4; //declaration constante de broche

const int D4=A0; //declaration constante de broche
const int D5=A1; //declaration constante de broche
const int D6=A2; //declaration constante de broche
const int D7=A3; //declaration constante de broche

// --- Initialisation des fonctionnalités utilisées ---
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits

// --- Déclaration des constantes relay ---
#define BoutonUP 11
#define BoutonDOWN 12

const byte Fonction[] ={0b11000001,0b00110011,0b00110000,0b00111111,0b00111100}; //table fonctionnement sorties
const byte Pins[] = {3,4,5,6,7,8,9,10}; // à adapter suivant branchement des relais

int i,x;  // permet de demarrer a la plage 0

// debut de la fonction setup()

void setup()  {

//lcd
lcd.begin(20,2); // Initialise le LCD avec 20 colonnes x 2 lignes

delay(10); // pause rapide pour laisser temps initialisation

// Test du LCD

lcd.print("Select UP/DW") ; // affiche la chaîne texte - message de test
//delay(2000); // pause de 2 secondes

//lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran

//relay

for(i=0;i<8;i++)           //debute a la plage 1
pinMode(Pins,OUTPUT);
digitalWrite(Pins,(1&Fonction
  • >>i));

    pinMode(BoutonUP,INPUT_PULLUP);
    pinMode(BoutonDOWN,INPUT_PULLUP);
    }
    // fin de la fonction setup()


    void loop() {

    if(digitalRead(BoutonUP)==LOW || digitalRead(BoutonDOWN)==LOW) {

    digitalRead(BoutonUP)==LOW?x++:x--;
    if(x>5)x=0;        // dimensionement du tableau
    if(x<0)x=5;

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

    digitalWrite(Pins,(1&Fonction
    • >>i));

      }

      while(digitalRead(BoutonUP)==LOW || digitalRead(BoutonDOWN)==LOW); //tant qu'un bouton est appuyé

      delay(500); // suppression des effets de rebond
      }

      }


mirage2000

Je vais surement faire hurler les puristes,  pour renvoyer sur le LCD la position, je pense que switch devrait pouvoir repondre à mon besoin, j'ai donc écrit:

Quote
/ control de la valeur de X et affichage

switch (Fonction
  • )  {
      case 0b11000001:
      lcd.print("Seq1 ")
      break ;
       case 0b00110011:
      lcd.print("Seq2 ")
      break ;
       case 0b00110000:
      lcd.print("Seq3 ")
      break ;
       case 0b00111111:
      lcd.print("Seq4 ")
      break ;
       case 0b00111100:
      lcd.print("Seq5 ")
      break ;
    default:
    lcd.print("je cherche... ")
    }


Qu'en pensez vous? suis je sur la bonne voie ? ou il faut faire autrement ?  j'ai un message d'erreur :  expected ; before break
merci de votre aide.

Carolyne

expected (il manque) ; (point virgule) before (avant (la ligne)) break.
Mais je pense que tu a eu cette erreur à cette ligne because le prog est venu directement sur cette ligne.
Il doit manquer des point virgules à toutes les lignes semblables à celle là.
Si je ne dit pas de c****ies. Lol !

mirage2000

ok Caro, je vais regardé, je suis un ultra debutant.
A tu un avis sur l'utilisation de l'instruction "switch" pour envoyer les infos à l'afficheur sous conditions, est ce la bonne démarche, ou faut il mieux utiliser un IF...ELSE?
@+

fdufnews

#51
Dec 22, 2013, 11:18 am Last Edit: Dec 22, 2013, 01:01 pm by fdufnews Reason: 1
+1 pour le ; à la fin des lignes
Le switch est très bien pour ça. Très bien aussi l'utilisation de default qui permet de détecter les cas non traités.

mirage2000

ok pour le ; , bon ca à l'air de fonctionner,j'ai mis cela:

Quote
switch (Fonction
  • ) {
      case 0b11000001:
      lcd.print("Seq1 ");
      break;
       case 0b00110011:
      lcd.print("Seq2 ");
      break ;
       case 0b00110000:
      lcd.print("Seq3 ");
      break ;
       case 0b00111111:
      lcd.print("Seq4 ");
      break ;
       case 0b00111100:
      lcd.print("Seq5 ");
      break ;
    default:
    lcd.print("je cherche... ");
    break ;
    }
    }


sauf que:
1>  j'ai l'écran qui est en boucle et qui se rempli  sur " je cherche...." quand aucunes conditions est remplies
2> Lorsque j'appuis sur le BP, et que la condition est remplie, ca s'arrete sur la condition (normal  :)) et j'ai l'écran qui est rempli de Seq1 Seq1 Seq1 .............

Je suis pas loin, de la verité, il doit y avoir une histoire de formatage d'affichage ?

B@tto

C'est normal pour deux raisons :

- Je pense que tu as mal placé ton switch, il ne faut pas le mettre directement dans boucle mais uniquement lorsqu'un bouton est appuyé, donc idéalement avant le while(digitalRead(BoutonUP)==LOW || digitalRead(BoutonDOWN)==LOW);

- Ensuite tu lis "Fonction" mais c'est un tableau déjà : ne pas le désigner par un index ici c'est déjà une erreur, en plus ce n'est pas lui "qui dit où qu'on en est", c'est la variable x.

-ensuite tu ne fait pas de lcd.clear() : lcd.print() "écrit" sur l'écran à la suite, c'est normal par exemple tu n'as pas à gérer le retour à la ligne "manuellement". Ici tu t'en fiches mais bon ;)
Donc le "truc" consiste à effacer l'écran avec lcd.clear() et à faire un print ensuite. Donc à supposer que tu as respecté mes précédentes remarques, et en améliorant le code il devient :

Code: [Select]

lcd.clear();
lcd.print("Seq")
lcd.print(x+1);


Ca fait plus court hein ? :D
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

mirage2000

Ha je pensais bien que tu étais dans l'ombre....

Quote
Je pense que tu as mal placé ton switch, il ne faut pas le mettre directement dans boucle mais uniquement lorsqu'un bouton est appuyé, donc idéalement avant le while(digitalRead(BoutonUP)==LOW || digitalRead(BoutonDOWN)==LOW);


Ok , du coup ça a réglé un problème de rafraîchissement désagréable >>> +1 :D

Quote
- Ensuite tu lis "Fonction" mais c'est un tableau déjà : ne pas le désigner par un index ici c'est déjà une erreur, en plus ce n'est pas lui "qui dit où qu'on en est", c'est la variable x.


Alors là,  :smiley-fat:  , comment je dois écrire mon switch,  pour lire X  ??      >>>> switch (x)  ???

J'ai fait cela, mais ca doit pas être tres optimisé? mais sa fonctionne.

Quote
switch (Fonction
  • )
    {
     
      case 0b11000001:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("La sequence est: ");
      lcd.setCursor(0, 1);
      lcd.print("Seq1 ");
      delay(500);
      break;
     
       case 0b00110011:
       lcd.clear();
       lcd.setCursor(0, 0);
      lcd.print("La sequence est: ");
      lcd.setCursor(0, 1);
      lcd.print("Seq2 ");
      delay(500);
      break ;
     
       case 0b00110000:
       lcd.clear();
       lcd.setCursor(0, 0);
      lcd.print("La sequence est: ");
      lcd.setCursor(0, 1);
      lcd.print("Seq3 ");
      delay(500);
      break ;
     
       case 0b00111111:
       lcd.clear();
       lcd.setCursor(0, 0);
      lcd.print("La sequence est: ");
      lcd.setCursor(0, 1);
      lcd.print("Seq4 ");
      delay(500);
      break ;
     
       case 0b00111100:
       lcd.clear();
       lcd.setCursor(0, 0);
      lcd.print("La sequence est: ");
      lcd.setCursor(0, 1);
      lcd.print("Seq5 ");
      delay(500);
      break ;
     
    default:
    lcd.clear();
    lcd.setCursor(0, 0);
      lcd.print("Choisir une sequence");
    lcd.setCursor(0, 1);
    lcd.print("Pressez UP / DW... ");
    delay(500);
    break ;.

B@tto

T'as le choix : soit le code que je viens de te poster, soit le tiens qui peut simplement être raccourci / optimisé :

Code: [Select]
lcd.clear();
lcd.setCursor(0, 0);
  lcd.print("La sequence est: ");

switch (x){
 
  case 0:
  lcd.print("Seq1 ");
  break;
 
   case 1:
  lcd.print("Seq2 ");
  break ;
 
   case 2:
  lcd.print("Seq3 ");
    break ;
 
   case 3:
  lcd.print("Seq4 ");
   break ;
 
   case 4:
  lcd.print("Seq5 ");
  break ;
 
default:

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Choisir une sequence");
lcd.setCursor(0, 1);
lcd.print("Pressez UP / DW... ");

}

delay(500);
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

mirage2000

#56
Dec 23, 2013, 09:22 pm Last Edit: Dec 23, 2013, 09:29 pm by mirage2000 Reason: 1
Oui c'est beaucoup plus clair, et le résultat est le même, je garde le tien qui est plus propre.
J'arrive presque au bout, mais du coup dans mes bricolage, j'ai perdu le démarrage sur la Seq1, je démarre sur toutes les sortie a 0, je suis obligé d'appuyer une fois sur UP pour lancer le truc.
Tu m'avais dis de remplacer:
Quote

int i,x;
par
int i;  
int x=1;



Mais ca fonctionne plus...

Aussi pour pas mourrir idiot, peux tu m'expliquer cette partie du code? stp
Quote
for(i=0;i<8;i++)          
pinMode(Pins,OUTPUT);
digitalWrite(Pins,(1&Fonction
  • >>i));

B@tto

Alors tentative d'explication :

Code: [Select]
for(i=0;i<8;i++)         ==> bon la tu l'auras compris je pense, on fait une boucle pour définir l'état de chaque sortie
Code: [Select]
pinMode(Pins[i],OUTPUT); ==> bon la aussi tu auras compris, on définit le pin en OUTPUT
Code: [Select]
digitalWrite(Pins[i],(1&Fonction[x]>>i)); ==> ici ça se corse, je décortique :

Prenons par exemple i=4 et x = 3 donc séquence = 0b00111111 :

Code: [Select]
Fonction[x]>>i <=> 00111111 >> 4 => 0011    
Ici on fait du bit bitshifting littéralement du décalage de bit, et ici sur 4 rang vers la droite
ensuite 0011&1 <=> 0011 & 0001 = 1 => ici on fait une opération logique binaire ET, et ça fait ce que ça dit c'est à dire qu'il me faut ET 1 ET 1 pour faire 1. 1 ET 0 fait 0.

Dans les opérateurs logique on trouve entre autre également le OU qui lui fait 1 OU 0 = 1 0 OU 0 = 0      1 OU 1 = 1     

Donc ici, si au lieu d'un ET j'avais fait un OU :
0011 | 1 <=> 0011 | 0001 = 0011

Pour en revenir à nos moutons
Code: [Select]
1&Fonction[x]>>i me permet d'extraire de la séquence le 1 ou le 0 qui m'interesse. A noter que TRUE, HIGH ou 1 c'est la même chose, donc écrire digitalWrite(9,HIGH) c'est exactement la même chose que  digitalWrite(9,1)

Pour ton problème de séquence au démarrage, tu peux poster ton code actuel complet ?
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

mirage2000

Bon tout fonctionne, j'avais pas remis int x=1 au bon endroit.

je te remercie pour les explications. Si tu veux je comprends le code à 90%, c'est sur  les petites subtilités d'écritures que je bloque.
les instructions pinmode, digitalwrite.......no problem, mais par exemple :
Quote
for(i=0;i<8;i++)

j'ai bien compris que FOR c'est une boucle, , il y a 40 ans  :)je programmais un peu en basic,
et les boucles FOR NEXT, avait la forme FOR I=0 to X, mais cette structure, je ne la comprends pas:
I=0 (ok), I<8 (c'est quoi ce 8), I++ (alors là ?)


fdufnews

#59
Dec 24, 2013, 09:26 am Last Edit: Dec 24, 2013, 09:35 am by fdufnews Reason: 1

j'ai bien compris que FOR c'est une boucle, , il y a 40 ans  :)je programmais un peu en basic,
et les boucles FOR NEXT, avait la forme FOR I=0 to X, mais cette structure, je ne la comprends pas:
I=0 (ok), I<8 (c'est quoi ce 8), I++ (alors là ?)



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

for (code à l'initialisation de la boucle; condition de maintien dans la boucle; code exécuté à chaque fin de boucle)

Nota: chaque bloc peut contenir plusieurs expressions séparées par des virgules, bien que cela ait peu de sens dans la condition de maintien

Ne pas oublier qu'il y a ça pour les problèmes de langage: http://arduino.cc/en/Reference/HomePage
dans notre cas: http://arduino.cc/en/Reference/For

edit: ajout du nota

Go Up