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.zipClassiquement, on inclut la bibliothèque :
#include <Bounce2.h>
La seconde chose est d'instancier un objet Bounce pour le contact :
Bounce contact;
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) :
pinMode(2, INPUT);
contact.attach(2);
Ensuite dans loop, il faut appeler update pour que l'objet contact face son travail :
contact.update();
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 :
if (contact.rose()) {
// lancer la tempo
}
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 :
#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);
}
}
}
C'est non testé mais je pense que ça va marcher.