Parlons Arduino > Débuter

y a t'il un programmeur dans l'avion?

(1/2) > >>

dudule:
bonsoir
bon cela fait pas mal de jours que je galère et je n'arrive pas à trouver d'explications sur tous les forums que j'ai visité, alors je viens voir si quelqu'un peut me donner la solution ( j'ai l'impression que l'arduino ne sais faire que du clignotement)
voila je vous expose mon problème .
je ferme un contact qui met une entrée à 1 ce qui a pour effet de mettre une sortie à 1 et de démarrer une tempo.en fin de tempo je remet la sortie à 0 . je précise que cela doit fonctionner même si le contact reste fermé . le cycle ne se répète que si le contact  a été ouvert puis refermé  :'(
merci à ceux qui pourront m'aider

Jean-Luc:
Bonsoir,

Il y a plusieurs aspects.

Tout d'abord ce qui t'intéresse dans ton contact ce n'est pas son état, 0 ou 1 mais son changement d'état, en l'occurrence de 0 à 1. Comme c'est le changement d'état qui t'intéresse, il faut généralement faire attention aux rebonds du contact qui vont produire plusieurs changement d'état. Mais dans ton cas, comme tu démarres une temporisation, les rebonds ne seront pas vu car je suppose que les changement d'état ne t'intéressent que si la temporisation n'est pas démarrée. Mais bon, abondance de bien ne nuit pas

Quoiqu'il en soit, le mieux est d'utiliser une bibliothèque pour lire ton contact. Par exemple Bounce2 qui va traiter les rebonds et qui s'occupe également des changements d'états. https://github.com/thomasfredericks/Bounce2/archive/master.zip

Classiquement, on inclut la bibliothèque :


--- Code: ---#include <Bounce2.h>

--- Fin du code ---

La seconde chose est d'instancier un objet Bounce pour le contact :


--- Code: ---Bounce contact;

--- Fin du code ---

Puis dans setup, de programmer la broche en entrée et de lier cet objet à cette broche, supposons que ça soit le broche 2. Note que comme ton contact connecte la broche à 5V, il faut une résistance (47kΩ) pour tirer la broche à GND quand le bouton contact n'est pas établi. Si le contact connectait la broche à GND, tu pourrais employer les résistances pullup intégrées à l'Arduino et avoir un montage plus simple) :


--- Code: ---  pinMode(2, INPUT);
  contact.attach(2);

--- Fin du code ---

Ensuite dans loop, il faut appeler update pour que l'objet contact face son travail :


--- Code: ---  contact.update();

--- Fin du code ---

Ensuite ce qui t'intéresse c'est le passage de 0 à 1 de ton entrée. Pour cela il faut appeler rose (de monter ou s'élever : rise, rose, risen) qui renvoit un booleen vrai si une montée, passage de 0 à 1 est détectée :


--- Code: ---if (contact.rose()) {
  // lancer la tempo
}

--- Fin du code ---

Je suppose que si pendant qu'il y a une tempo de lancée, le contact est coupé puis rétabli, cela doit être ignoré. Il faut donc une variable d'état pour indiquer que la tempo est lancée. Appelons cette variable, un booléen, tempoEnCours. Il faut maintenant récupérer la date courante, via millis() et et la stocker dans une variable dateDebutTempo. On va ensuite à chaque tour de loop, relire la date courante avec millis et, quand cette date courante — dateDebutTempo devient supérieur à la durée de la tempo, on remet tempoEnCours à false et on remet la sortie à 0. Ça donne ça :


--- Code: ---#include <Bounce2.h>

Bounce contact;
const byte pinContact = 2;
const byte pinSortie = 3;

void setup() {
  contact.attach(pinContact, INPUT);
  pinMode(pinSortie, OUTPUT);
  digitalWrite(pinSortie, LOW);
}

bool tempoEnCours = false;
unsigned long dateDebutTempo;
const unsigned long dureeTempo = 3000;

void loop() {
  contact.update();

  if (contact.rose() && ! tempoEnCours) {
    // lance la tempo
    tempoEnCours = true;
    dateDebutTempo = millis();
    digitalWrite(pinSortie, HIGH);
  }

  if (tempoEnCours) {
    unsigned long dateCourante = millis();
    if (dateCourante - dateDebutTempo > dureeTempo) {
      tempoEnCours = false;
      digitalWrite(pinSortie, LOW);
    }
  }
}

--- Fin du code ---

C'est non testé mais je pense que ça va marcher.

dudule:
merci Jean-Luc pour ta réponse.
je vais voir de mettre en application,  je n'avais pas précisé mais c'est bien que tu m'ais proposé une solution avec millis ,plutôt que delay.
A+ Gérard   

dudule:
Re moi.
après chargement du programme, j'ai ( erreur de compilation ) je vais voir si je trouve le cafard


Aucun fichier ou répertoire de ce noArduino : 1.6.7 (Windows 7), Carte : "Arduino/Genuino Uno"




fatal error: bounce2.h: No such file or directory              { apparemment il n'y a pas de fichier de ce nom }?

 #include <bounce2.h>

                     ^

compilation terminated.

exit status 1
Erreur lors de la compilation.m < bounce2.h >

dudule:
bon si j'ai bien compris, cette bibliothèque manque dans mon IDE; reste plus qu'a la trouver

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique