Pages: [1] 2   Go Down
Author Topic: de l'aide pour un débutant  (Read 1797 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

j'essaie de mettre en place un truc avec arduino mais je galère beaucoup. J'ai fait plein de test etc etc mais j'ai du mal à avoir une vision d'ensemble et je suis super débutant.

J'essaie d'allumer deux led mais qui interagiraient entre elles.
il y a une led verte et une rouge commandées chacune par des boutons disons boutonvert et boutonrouge

- Si la led verte est allumée et qu' on enclenche boutonrouge, il s'allume, si on l'enclenche à nouveau, il reste allumé et la led verte reste toujours allumée.
- Si la led verte est allumée quand la led rouge est allumée si on appuie sur boutonvert, la led rouge s'eteind et la led verte reste allumée
- Si la led verte est allumée et la led rouge est eteinte et qu'on appuie sur boutonvert, le led verte s'éteint.
- Si la led verte est éteinte et qu'on appuie sur boutonrouge, la led rouge s'allume et si on rappuie dessus elle reste allumée et la led verte reste éteinte

J'ai l'impression que cette description est presque le code que je cherche mais j'y arrive pas.
j'ai essayé de modifier un code des tuto arduino et ca marche pas.

le voici (sans les modifs puisqu'aucune ne marche):
Code:
void loop()
{
  reading = digitalRead(inPin);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    time = millis();    
  }

  digitalWrite(outPin, state);

  previous = reading;
}


Si quequ'un peut m'aider :-[  :-/  :'(
Logged

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

Aller une petite piste.

Le code que tu as copié permet de gérer un poussoir.
Si tu le dupliques et que dans chacune des copies tu suffixes le nom des variables avec Vert et Rouge tu auras à la fin stateVert et stateRouge.
En faisant quelques tests sur les états de stateRouge et stateVert tu devrais arriver à réaliser la fonction que tu veux.
« Last Edit: September 09, 2010, 05:41:34 am by fdufnews » Logged

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

j'ai déjà fais ça, en dupliquant la fonction une pour rouge et une pour vert et j'ai rajouté des conditions dans la fonction associée au vert mais une fois allumée la led verte reste allumée quoique je fasse.
J'ai aussi tenté d'imbriquer des "if" dans :

Code:
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
******
ICI
******
    else
      state = HIGH;

Mais ça ne marche pas non plus.
« Last Edit: September 09, 2010, 06:07:16 am by did_poutrator » Logged

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

Ce serait plus facile si tu postais l'ensemble du code et non pas des morceaux.
Logged

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

Ben pour le moment je peux pas puisque je ne suis pas chez moi.
Mais je ne sais pas si ça vaut tellement le coup puisque je n'ai fait que copier celui de l'exemple, changer les variables selon si c'est la led verte ou rouge ou le boutonvert ou boutonrouge en gros ça devait être ça :
Code:
void loop()
{
  reading = digitalRead(inPin);
  reading2 = digitalRead(inPin2);

  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH){
      if(state2 == HIGH){
         state = HIGH;
         state2 = HIGH;
   }
      if(state2 == LOW){
        state2 == HIGH;
        state = HIGH;
  }
}else{
      state = HIGH;
}
    time = millis();    
  }


  if (reading2 == HIGH && reading==HIGH && previous2 == LOW && millis() - time > debounce) {
    if (state2 == HIGH)
      state2 = LOW;
    else
      state2 = HIGH;

    time = millis();    
  }

  digitalWrite(outPin, state);
  digitalWrite(outPin2, state2);

  previous = reading;
  previous2 = reading2;

}


en gros mais il n'est pas fini puisque même ça , ça ne va pas.
« Last Edit: September 09, 2010, 08:57:02 am by did_poutrator » Logged

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

est ce que "switch" ne fonctionnerai pas?
Logged

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

Code:
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    time = millis();    
  }

Ce morceau de code teste le changement d'état du poussoir d'entrée et il vérifie qu'un certain temps c'est écoulé pour être certain que le contact ne rebondisse plus.
C'est ce bloc qu'il faut dupliquer et toute les variables de ce bloc doivent être unique même la variable time.
Pour chacun des poussoirs, la variable reading contient l'état courant, la variable previous l'état précédent la variable state l'état courant après filtrage (debounce).
Avec ces 3 variables pour chacun des poussoirs tu dois pouvoir gérer la logique que tu avais décrite au début de ce fil. Cette logique doit être située après les deux blocs de codes qui déterminent l'état des poussoirs
« Last Edit: September 09, 2010, 03:25:25 pm by fdufnews » Logged

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

Quote
Cette logique doit être située après les deux blocs de codes qui déterminent l'état des poussoirs

tu veux dire que je dois déclarer comment se comportent mes pushbuttons et après ça, je dois déclarer des conditions selon lesquelles telle ou telle led s'allume?
du genre:

if (...)
  code du bouton vert

if (...)
  code du bouton rouge

if (...)
  conditions selon lesquelles le rouge ou le vert s'allument ou pas

ou alors j'ai pas compris.
Logged

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

Quote
tu veux dire que je dois déclarer comment se comportent mes pushbuttons et après ça, je dois déclarer des conditions selon lesquelles telle ou telle led s'allume?
C'est l'idée.

Il faudrait réaliser une petite machine à état qui en fonction de l'état actuel des sorties et des boutons décrive le nouvel état des sorties. C'est le seul moyen de gérer simplement un automate avec plusieurs entrées et plusieurs sorties.

D'ailleurs avant même d'écrire du code il est bon de faire un petit diagramme qui décrit les états et les conditions qui font passer d'un état à l'autre. C'est la manière la plus sûre de vérifier que l'on a bien pris en compte toutes les conditions et que quelque soit l'état où on se trouve une action sur l'un des boutons amènera bien vers l'état voulu. Le plus simple c'est de partir de l'état d'initialisation avec les voyants éteints et de dire si j'appuie sur tel bouton qu'est-ce que je fais et si j'appuie sur l'autre qu'est-ce que je dois faire. Et on répète pour chacun des nouveaux états.
Logged

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

Je te remercie, je ne peux pas essayer aujourd'hui encore malheureusement. Mais je tenterai avec cette méthode et je te donnerai des nouvelles.
Logged

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

il faut que tu crées un tableau de stockage

Code:
bool mes_boutons[6];
bool mes_boutons_etat_precedent[6]
Logged

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

pourquoi mets tu [6], ça veut dire que je peux stocker 6 variantes de mes_boutons?
Logged

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

tu crées des tableaux. comme un tableau excel à une seule ligne.

une procedure en for i=.... te permet de travailler sur plusieurs boutons et d'alléger ton code , cad de ne pas rajouter des if des else etc... pour chacun des boutons ( ce qui généralement amène des erreurs classiques de parenthèse et de syntaxe)

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


après tu peux toujours inclure dans cette boucle for(int  i=....)
des trucs commes:

if(mes_boutons==1 && mes_boutons_etat_precedent==0)
{
//action si tu appuyes sur le bouton: allumer une led, revenir au debut d un morceau de musique, etc

}
else if(mes_boutons==0 && mes boutons_etat_precedent==1)
{
//la c est si tu relaches ton bouton ce que tu fais
}

Dans un precedent message, quelqu un te suggerait de faire un arbre logique.
Avec des boutons, c est le plus simple: l etat est soit 0 soit 1. Et toute la logique de ce que tu veux faire dépend du choix des conditions.
Telle valeur==1 , je fais ceci, sinon celà ( le else n est pas obligé)

Il vaut mieux commencer avec des if et des else, avant de s attaquer au switch.

Grosso modo tous les ifs vont être lus par arduino:

if ( condition 1){...}
if (condition 2){...}
etc...

ce qui prend tu temps au processeur.

 le switch permet de voir si une condition est remplie, alors il execute le troncon de code. Celà veut dire que par exemple si  tu teste des conditions, tu peux avoir plus de deux scenarios, peut etre 16 ou 20, le if va beaucoup te manger de temps processeur.
le switch te permet d executer moins de tests de conditions

tu peux t en passer au debut. surtout si ce que tu veux faire est léger.
« Last Edit: September 11, 2010, 07:39:05 am by karistouf » Logged

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

Ok ok , je vais tenter ça. Je me sens en général (débutant oblige) assez mal à l'aise avec les "assignations automatiques" comme dans ton exemple avec la boucle "for" même si je comprends tout à fait l'utilité , mais il va falloir que j'y arrive.
Logged

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

Tu peux faire quelque chose comme ça
Code:
#define LED_ROUGE_ON 1
#define LED_ROUGE_OFF 0
#define LED_VERTE_ON 2
#define LED_VERTE_OFF 0

char EtatLedVerte=0;
char EtatLedRouge=0;
char EtatCourant=0;


EtatCourant = EtatLedRouge | EtatLedVerte;  // Nouvel état
switch (EtatCourant){
   case 0:
      if (condition à définir) // 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
     else  (condition à définir)
           EtatLedRouge= LED_ROUGE_ON;
           EtatLedVerte =  LED_VERTE_OFF;
     }
     break;
   case 1:
      if (condition à définir)
           EtatLedRouge= LED_ROUGE_OFF;
           EtatLedVerte =  LED_VERTE_OFF;
     else  (condition à définir)
           EtatLedRouge= LED_ROUGE_ON;
           EtatLedVerte =  LED_VERTE_ON;
    }
    break;
    case 2:
       ...............
    case 3:
       ...............
}
digitalWrite(ledVerte,...
digitalWrite(ledRouge,...


L'état courant dépend de l'état des LED et les conditions dans les if sont celles que tu as déterminées dans le diagramme des états dont je parlais dans un post précédent
Logged

Pages: [1] 2   Go Up
Jump to: