Pages: 1 [2]   Go Down
Author Topic: de l'aide pour un débutant  (Read 1757 times)
0 Members and 1 Guest are viewing this topic.
Toulouse / France
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je vais m'atteler à ça au plus vite et j'essaierai de pouvoir vous montrer ce qu'il en sort, quelque chose de plus concret que ce que j'ai donné dans le début du topic.
merci en tout cas.
Logged

Toulouse / France
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai essayé de faire ça :

Code:
#define LED_ROUGE_ON 1
#define LED_ROUGE_OFF 0
#define LED_VERTE_ON 1
#define LED_VERTE_OFF 0

bool bouton[2];
bool statebouton[2];

char EtatLedVerte=0;
char EtatLedRouge=0;
char EtatCourant=0;
int ledVerte = 12;
int ledRouge = 11;
int bouton1 = 6;
int bouton2 = 5;
int reading;
int previous = LOW;

long time = 0;
long debounce = 100;

void setup(){
  pinMode(bouton1,INPUT);
  pinMode(bouton2,INPUT);
  pinMode(ledVerte,OUTPUT);
  pinMode(ledRouge,OUTPUT);  
  digitalWrite(bouton1, HIGH);      
  digitalWrite(bouton2, HIGH);
}

void loop(){

for(int i=0;i<2;i++)
{
statebouton[i]=bouton[i];//tu stockes l etat precedent, cela te permet de comparer et de savoir si quelqu un appuye, ou relache le bouton
bouton[i] = digitalRead[i];//tu lis tes boutons et tu stockes dans ce tableau
}

int reading = digitalRead(button[i]);

if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (statebouton[i] == HIGH)
      statebouton[i] = LOW;
    else
      statebouton[i] = HIGH;

    time = millis();    
  }

  
EtatCourant = EtatLedRouge | EtatLedVerte;  // Nouvel état
switch (EtatCourant){
   case 0:
      if (bouton1 == LOW && bouton2 == HIGH){ // si je suis dans cet état et que mes entrées sont comme décrit dans le if alors ...
           EtatLedRouge = LED_ROUGE_ON; // exemple
           EtatLedVerte =  LED_VERTE_OFF;  // exemple
     break;
      }
   case 1:
      if (bouton1 == HIGH && bouton2 == HIGH){ // si je suis dans cet état et que mes entrées sont comme décrit dans le if alors ...
           EtatLedRouge= LED_ROUGE_OFF; // exemple
           EtatLedVerte =  LED_VERTE_ON;  // exemple
     break;
      }


}
digitalWrite(ledVerte,EtatLedVerte);
digitalWrite(ledRouge,EtatLedRouge);
}

mais ça ne compile pas
ça m'écrit :

 In function 'void loop()':
error: pointer to a function used in arithmetic
Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

accolade mal placée ;-) du coup le compilateur ne comprend pas les fonctions demandées

Code:
switch (EtatCourant){
   case 0:
      if (bouton1 == LOW && bouton2 == HIGH){ // si je suis dans cet état et que mes entrées sont comme décrit dans le if alors ...
           EtatLedRouge = LED_ROUGE_ON; // exemple
           EtatLedVerte =  LED_VERTE_OFF;  // exemple
     break;
      }  // << l erreur
   case 2:
  

à sa place il faut faire:
Code:
switch (EtatCourant){
   case 0:
      if (bouton1 == LOW && bouton2 == HIGH){ // si je suis dans cet état et que mes entrées sont comme décrit dans le if alors ...
           EtatLedRouge = LED_ROUGE_ON; // exemple
           EtatLedVerte =  LED_VERTE_OFF;  // exemple
    } //<< tu fermes le if ici, dans le case 0 sinon il pense que le switch est fermé
     break;
    case 1:
    blablabala
   break;
      ...
}//fin du switch
« Last Edit: September 12, 2010, 09:07:28 am by karistouf » Logged

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

Quote
#define LED_ROUGE_ON 1
#define LED_ROUGE_OFF 0
#define LED_VERTE_ON 1
#define LED_VERTE_OFF 0
Ce n'est pas ce que j'avais mis.
Pour LED_VERTE_ON j'avais mis 2. Cela permet d'obtenir les 4 états possibles d'EtatCourant en faisant le ou avec LED_VERTE_ON et LED_VERTE_OFF

D'ailleurs pour rendre la chose plus clair il serait préférable de remplacer le chiffre dans les case par cela
Code:
case LED_ROUGE_OFF | LED_VERTE_OFF:
  ........
case LED_ROUGE_ON | LED_VERTE_OFF:
  ........
case LED_ROUGE_OFF | LED_VERTE_ON:
  ........
case LED_ROUGE_ON | LED_VERTE_ON:
  ........

Concernant l'erreur de compilation elle vient de cette ligne:
Code:
bouton[i] = digitalRead[i];//tu lis tes boutons et tu stockes dans ce tableau
digitalRead c'est une fonction donc on ne peut pas utiliser les crochets
Il faut corriger comme cela
Code:
bouton[i] = digitalRead(i);//tu lis tes boutons et tu stockes dans ce tableau

Ensuite il y a 2 ou 3 autres erreurs qui sortent.
Après correction on arrive à ça:
Code:
#define LED_ROUGE_ON 1
#define LED_ROUGE_OFF 0
#define LED_VERTE_ON 2
#define LED_VERTE_OFF 0

bool bouton[2];
bool statebouton[2];

char EtatLedVerte=0;
char EtatLedRouge=0;
char EtatCourant=0;
int ledVerte = 12;
int ledRouge = 11;
int bouton1 = 6;
int bouton2 = 5;
int reading;
int previous = LOW;

long time = 0;
long debounce = 100;

void setup(){
  pinMode(bouton1,INPUT);
  pinMode(bouton2,INPUT);
  pinMode(ledVerte,OUTPUT);
  pinMode(ledRouge,OUTPUT);
  digitalWrite(bouton1, HIGH);
  digitalWrite(bouton2, HIGH);
}

void loop(){

for(int i=0;i<2;i++)
{
statebouton[i]=bouton[i];//tu stockes l etat precedent, cela te permet de comparer et de savoir si quelqu un appuye, ou relache le bouton
bouton[i] = digitalRead(i);//tu lis tes boutons et tu stockes dans ce tableau


int reading = bouton[i];

if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (statebouton[i] == HIGH)
    statebouton[i] = LOW;
    else
    statebouton[i] = HIGH;

    time = millis();
  }
}

EtatCourant = EtatLedRouge | EtatLedVerte;  // Nouvel état
switch (EtatCourant){
   case LED_ROUGE_OFF | LED_VERTE_OFF:
    if (bouton1 == LOW && bouton2 == HIGH) // si je suis dans cet état et que mes entrées sont comme décrit dans le if alors ...
         EtatLedRouge = LED_ROUGE_ON; // exemple
         EtatLedVerte =  LED_VERTE_OFF;  // exemple
     break;
    
   case LED_ROUGE_ON | LED_VERTE_OFF:
    if (bouton1 == HIGH && bouton2 == HIGH) // si je suis dans cet état et que mes entrées sont comme décrit dans le if alors ...
         EtatLedRouge= LED_ROUGE_OFF; // exemple
         EtatLedVerte =  LED_VERTE_ON;  // exemple
     break;
    


}
digitalWrite(ledVerte,EtatLedVerte >> 1);
digitalWrite(ledRouge,EtatLedRouge);
}


Je ne suis pas chez moi, et je n'ai pas d'Arduino sous la main donc le code n'est pas testé
Logged

Toulouse / France
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai enfin réussi mais en faisant autrement que ce que vous m'avez dit.
Si vous avez des suggestion d'améliorations elles seront les bienvenues.
voilà le code:
Code:
const int playPin = 5;        
const int playLed = 12;
const int recPin = 6;
const int recLed = 11;

volatile int playState = LOW;      
volatile int playReading;          
volatile int playPrevious = HIGH;

volatile int recState = LOW;      
volatile int recReading;          
volatile int recPrevious = HIGH;

volatile int play;
volatile int rec;
volatile int playpause = 0;
volatile int playstart = 0;

long playTime = 0;        
long playDebounce = 300;  
long recTime = 0;        
long recDebounce = 200;


void setup()
{
  pinMode(playPin, INPUT);
  digitalWrite(playPin, HIGH);
  pinMode(playLed, OUTPUT);
  pinMode(recPin, INPUT);
  digitalWrite(recPin, HIGH);
  pinMode(recLed, OUTPUT);
  
  Serial.begin(300);
}


void loop()
{

playReading = digitalRead(playPin);

if (playstart > 0){
if (playReading == HIGH && playPrevious == LOW && millis() - playTime > playDebounce) {
   play += 1;
   playTime =  millis();
}
}

recReading = digitalRead(recPin);
if (recReading == HIGH && recPrevious == LOW && millis() - recTime > recDebounce) {
  rec += 1;
  recTime = millis();    
}

  

if (rec != 0){
recState = 1;
}else{
recState = 0;
}

if (rec != 0){
  playstart = 1;
}

if (play != 0){
playState = 1;
}else{
playState = 0;
}
  
if (playpause == 0){
  if (rec > 0 && play > 0){
    rec = 0;
    play = 1;
    playpause = 1;  
  }
}

if (playpause == 1){
  if (rec > 0 && play > 1){
    play = 1;
    rec = 0;
  }
  
  if (rec == 0 && play > 1){
    play = 0;
    rec = 0;
  }
  if (rec == 0 && play == 0){
    playpause = 2;
  }
}

if (playpause == 2){
  if (rec > 0 && play > 0){
    rec = 0;
    play = 1;
    playpause = 1;
  }
  if (rec == 0 && play == 2){
    rec = 0;
    play = 0;
  }
}

  
digitalWrite(playLed, playState);
digitalWrite(recLed, recState);
playPrevious = playReading;
recPrevious = recReading;
  
Serial.print(rec);
Serial.print(play);
Serial.println(playpause);
}
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

As-tu une bonne raison de déclarer toutes tes variables comme volatile? Si non, ne le fais pas, ça n'améliore pas ton programme.

Korman
Logged

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

de manière générale réserver volatil pour les variables modifiées de manière asynchrone.
C'est à dire, les variables modifiées par des routines de traitement d'interruption ou lorsqu'il s'agit d'I/O qui peuvent changer sans prévenir.
volatil demande au compilateur de ne pas faire d'optimisation sur les variables considérés et de relire systématiquement la mémoire qui contient la valeur (donc cela ralentit l'exécution)

Dans les processeur avec peu de mémoire éviter const qui monopolise une variable pour rien puisqu'elle ne peut pas être modifiée. Il vaut mieux utiliser un #define
Par exemple
Remplacer cà:
Code:
const int playPin = 5;        
const int playLed = 12;
par ça
Code:
#define playPin 5        
#define playLed 12
Cela donne les même possibilités:
  - groupement des déclarations en tête
  - possibilité de paramètrage rapide
Mais ça n'utilise pas de RAM qui est critique sur les petits micro contrôleurs.
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Il vaut mieux utiliser un #define
Par exemple
Remplacer cà:
Code:
const int playPin = 5;        
const int playLed = 12;
par ça
Code:
#define playPin 5        
#define playLed 12
Cela donne les même possibilités:
 - groupement des déclarations en tête
 - possibilité de paramètrage rapide
Mais ça n'utilise pas de RAM qui est critique sur les petits micro contrôleurs.

fdufnews, voyons ce que le compilateur en pense:
Code:
const int ledPin = 13;
#define totoPin 12

...

    digitalWrite(ledPin, ledState);
 1ee:   8d e0           [glow]ldi r24, 0x0D[/glow]   ; 13
 1f0:   60 91 30 01     lds r22, 0x0130
 1f4:   0e 94 e2 01     call    0x3c4   ; 0x3c4 <digitalWrite>
    digitalWrite(totoPin, ledState);
 1f8:   8c e0           [glow]ldi r24, 0x0C[/glow]   ; 12
 1fa:   60 91 30 01     lds r22, 0x0130
 1fe:   0e 94 e2 01     call    0x3c4   ; 0x3c4 <digitalWrite>

totoPin est un #define, ledPin un const int. Le code est exactement le même pour les deux cas.  Ce que tu as écrit plus haut n'a aucune relation avec la réalité et tes conseils dans ce cas n'ont aucun effet. De plus, les déclarations const ont été inventés juste pour réparer un tas de problèmes avec les #defines. Ton conseil de les éviter est donc à peu prêt la pire des choses à conseiller dans ce cas.

La prochaine fois aie la gentillesse de vérifier la véracité de tes conseils.

Merci,

Korman

« Last Edit: October 05, 2010, 08:49:58 am by Korman » Logged

Toulouse / France
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci à tous.
ne vous battez pas quand même.
Logged

Toulouse / France
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

en ce qui concerne les "const" "int" et "volatile"...
pour les "const" , ben j'ai vu beaucoup d'exemples sur le site arduino.cc qui declarait les broches de leds et d'interrupteur en "const" alors j'ai supposé que ça ne pouvais pas faire de mal.
En ce qui concerne les "volatile" c'est autre chose, je suis plutôt débutant en code mais je suis aussi une méga bille en ce qui concerne le fonctionnement interne des microcontrôleurs. Je viens à arduino plutôt par le côté électronique (transistors et tout ça). Tout ça pour dire que dans ma tête la RAM pouvais "alléger" le programme en fonctionnement et non le ralentir, ça doit être un mauvais amalgame avec la RAM d'un ordinateur.
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

const: C'est le bon truc à utiliser pour toutes les constantes.

volatile: Cette directive dit au compilateur de se méfier des valeurs dans cette variable. C'est nécessaire que pour des variables utilisées pour la communication avec des fonctions d'interruption. Tant que ça te dit rien, oublie cette directive.

Tank que j'y suis il y a encore:

static: Cette variable retient sa valeur d'un appel d'une fonction à l'autre. C'est très utile pour sauvegarder des valeurs dans la fonction loop qui n'intéressent personne à l'intérieur de la fonction.

Korman
Logged

Pages: 1 [2]   Go Up
Jump to: