[RÉSOLU]Aide pour un programme signal PWM


bonjour tous,


je voudrais réaliser un programme que quand j'appuie sur un bouton poussoir j'ai un signal pwm qui démarre progressivement et s'arrête progressivement.
pour le signal pwm j'ai aucun problème le problème vient du bouton poussoir je sais pas comment le mettre dans mon programme.

si quelqu'un pourrais m'aider merci

voici le programme.
code: [select]

int ledpin = 9;
int luminosite = 0;
int variation = 5;

boolean etat = false;

void setup()
{
 pinmode (ledpin, output);
}

void loop()
{

 analogwrite(ledpin, luminosite);
 luminosite = luminosite + variation;
 if ( luminosite == 0 || luminosite == 25){
   variation = - variation;
 }
   
   delay(1000);
}



edit de jean-françois :  merci de mettre les balises "code"

bonjour et bienvenue parmis nous ;)

ma religion, c'est la machine d'état.
c'est une méthode pour gérer plusieurs taches en même temps sans se bloquer entre elles.

je te suggère de connecter un bouton poussoir à la broche 8 de la façon suivante :

code: [select]

5v -----/\/\/\/\/\-----+------ broche 8
         res ~4k7      |
                       |    -+-
                       +----* *-----gnd


quand le bouton n'est pas appuyé, digitalread() renvoi high, quand le bouton est appuyé digitalread() renvoi low.

le code devient quelque chose comme
code: [select]

int ledpin = 9;
int pushpin = 8;
int luminosite = 0;
int variation = 5;

unsigned long heure_dernier_changement = 0;

enum {
  repos,          // attente pression poussoir
  en_cours     // gradateur & down
} etat = repos;

void setup()
{
  pinmode (ledpin, output);
  pinmode (pushpin, input );
}

void loop()
{
  switch( etat )
  {
  case repos:
    // on attend le bouton
    if ( digitalread( pushpin ) == low )
      etat = en_cours;
    break;
  case en_cours:
    if ( (millis() - heure_dernier_changement) > 1000 )
    {
      analogwrite(ledpin, luminosite);
      luminosite = luminosite + variation;
      if ( luminosite == 0 || luminosite == 25)
      {
        variation = - variation;
      }
      heure_dernier_changement = millis();
      break;
    }
}


tu avais, je pense, commencé à prévoir le coup avec ta variable 'bool etat' que j'ai remplacé par un enum.
l'avantage c'est que avec l'enum tu donnes des noms en clair aux états de ta tache et c'est plus facile d'en rajouter ultérieurement.

j'ai aussi supprimé l'appel delay() qui est une fonction bloquante.
je préfère enregistrer la date du dernier événement et tester si le temps s'est écoulé.
attention à la façon dont le test est écrit.
il ne faut jamais écrire :
code: [select]
if ( (date_avant + temps) > millis() )
mais
code: [select]
if ( (millis() - date_avant) > temps) )
car millis() reboucle et repasse pas 0 toutes les 49 jours environ.
c'est comme des cyclistes qui se courent après sur un vélodrome.
la distance ce le vélodrome part à 0, augmente jusqu'au km maxi puis repasse à 0.
il faut calculer la distance entre le premier et le suiveur par une différence modulo la valeur maxi.
ici c'est pareil sauf que le modulo est implicite parce qu'il est égal à la valeur max que peut prendre un "unsigned long".

tu verras avec l'usage que c'est plus pratique de faire comme cela plutot qu'avec delay() car cela permet à loop() de tourner rapidement sans bloquer.
dans le futur, tu pourras ainsi facilement ajouter d'ajouter d'autre tâches/traitements qui ne seront pas pénalisée par le rythme de ton gradateur... si elles aussi procèdent de même, elle ne pénaliseront pas le gradateur non plus.

il faut apprendre à partager le temps sur arduino car tu n'as pas de système multi-tâche.
il faut donc que tous les tâches coopèrent entre elles pour accorder du temps aux autres sans le monopoliser pour soi.


Arduino Forum > International > Français (Moderators: jfs, Snootlab) > [RÉSOLU]Aide pour un programme signal PWM


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial