Besoin d'une sortie temporisée.

Bonjour,

J'ai besoin d'une temporisation(entre 250 et 400 ms) sur les sorties de mon arduino.

Si je reçois une commande sur une entrée je dois mettre les sorties à low pendant les 250 à 400 ms. La sortie doit revenir à HIGH après.

Les entrées viennent du port série et d'un écran tactile sur arduino.

Merci de votre aide.

int relayPin1 = 13 ;// Déclaration de la broche de sortie LED
int bpPin1 = 2 ; // pin entrée bp
int bp1; 
int topDepart1;

 
void setup() {

pinMode(13, OUTPUT); // sortie temporisée vers module domotique
pinMode (bpPin1, INPUT) ; // Initialisation de la broche du capteur
 digitalWrite(relayPin1, HIGH);
}

void loop() {
topDepart1 = 0;
  
   bp1 = digitalRead(bpPin1);
 
  if (bp1){ // si bouton appuyé
      digitalWrite(relayPin1, LOW); // activer le relais
      topDepart1=millis();
    }
 
  if ((millis()-topDepart1)>=300 && digitalRead(relayPin1)){ // si temps écoulé et relais actif
      digitalWrite(relayPin1, HIGH);
    }
 
}

regarder l'usage de millis() et la programmation par machine à états (cf mon tuto éventuellement)

bravo pour l'usage des balises de code, un petit plus serait d'indenter correctement le code pour faciliter la lecture (appuyez sur ctrl-T sur PC ou cmd-T sur Mac dans l'IDE)

votre relais est actif LOW      digitalWrite(relayPin1, LOW); // activer le relaismais il semble que vous testez HIGH avec le && digitalRead(relayPin1)dans  if ((millis()-topDepart1)>=300 && digitalRead(relayPin1)){ // si temps écoulé et relais actif

PS: d'un point de vue nommage des variables, relayPin1 serait mieux en relay1Pin sans doute, c'est la pin du relais 1 et déclarée en const byte, pas en int.

PS2: tout ce qui a trait au temps (ie vous mettez millis() dedans par exemple) doit être un unsigned long, avec un int votre topDepart1 va déborder au bout de 37 secondes de fonctionnement du sketch.

Merci pour ces remarques pertinentes j'ai fait un peu vite pour l'écrire.

Les modules domotiques que j'attaque se pilote par une mise à zéro des entrées (dimmers et relais) J'ai testé la sortie arduino donne environ 600 mV ce qui est reconnu comme 0 par les modules. Je n'ai donc pas besoin de passer par un contact sec de relais. La sortie arduino rentre directement sur les entrées modules. Le seul problème est pour les dimmers. Une impulsion de 200 à 400 ms allume ou éteins le dimmer, si on dépasse cette valeur on dimme. Pour les modules relais ce n'est pas important.

J'ai donc besoin d'avoir le niveau HIGH en sortie de mes arduinos.

dommage il n'y a plus les balises de code - Merci de corriger le post ci dessus en l'éditant.

  • Prise en compte de mes commentaires sur le type des variables ? ça aiderait.
  • prise en compte de ce que j'ai dit pour l'état de relay1Pin ?
  • sinon les boutons sont généralement mieux en INPUT_PULLUP, comment est câblé le vôtre, vous avez bien une résistance de pull-down ?
Désolé pas très expérimenté sur ce site? Comment remettre les balises de codes dans une réponse?
Merci

[codeint relay1Pin = 13 ;// Déclaration de la broche de sortie vers relais
const byte bp1Pin = 2 ; // pin entrée bp
int bp1;
unsigned long topDepart1;
 
void setup() {

pinMode(13, OUTPUT); // sortie temporisée vers module domotique
pinMode (bp1Pin, INPUT_PULLUP ) ; // Initialisation de la broche du capteur
digitalWrite(relay1Pin, HIGH);
}
void loop() {
topDepart1 = 0;
 
   bp1 = digitalRead(bp1Pin);
 
  if (bp1){ // si bouton appuyé
      digitalWrite(relay1Pin, LOW); // sortie pour activer le relais
      topDepart1=millis();
    }
 
  if ((millis()-topDepart1)>=300ul && digitalRead(relay1Pin)){ // si temps écoulé et relais actif
      digitalWrite(relay1Pin, HIGH);
 } 
}
]

Pour J-M-L, le tuto est vraiment très bien expliqué mais je vais avoir difficile d'intégrer cette bibliothèque j'utilise Blynk avec des capteurs sur l'arduino.

Dans ma domotique je gère très facilement ce genre de fonction on,off général scénario, transfert vers d'autres modules,....

Ici j'aimerai pouvoir récupérer les sorties venant d'un arduino avec un écran tactile et les variables du port série venant de "sarah" en reconnaissance vocale.

Le but n'est pas d'intégrer une quelconque bibliothèque mais le principe de la machine à états.

Comment remettre les balises de codes dans une réponse? Merci

vous éditez (sans le détruite) votre message déjà posté et rajoutez les balises de code autour du code:

[code]

[color=blue]// votre code ici[/color]

[/code]

ça doit ressembler à cela:
[/color]// votre code ici

(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

J'espère avoir bien déposé le code?
Que fait le CTRL T je ne vois rien se passer à l'écran?

Je pense avoir fait les modifs mais le code ne fonctionne pas?

 relay1Pin = 13 ;// Déclaration de la broche de sortie vers relais
const byte bp1Pin = 2 ; // pin entrée bp
int bp1;
unsigned long topDepart1;
 
void setup() {

pinMode(13, OUTPUT); // sortie temporisée vers module domotique
pinMode (bp1Pin, INPUT_PULLUP ) ; // Initialisation de la broche du capteur
digitalWrite(relay1Pin, HIGH);
}
void loop() {
topDepart1 = 0;
 
   bp1 = digitalRead(bp1Pin);
 
  if (bp1){ // si bouton appuyé
      digitalWrite(relay1Pin, LOW); // sortie pour activer le relais
      topDepart1=millis();
    }
 
  if ((millis()-topDepart1)>=300ul && digitalRead(relay1Pin)){ // si temps écoulé et relais actif
      digitalWrite(relay1Pin, HIGH);
 }
}

si vous utilisez l'IDE sur un ordinateur, ctrl-T (ou cmd-T sur un mac) va indenter le code proprement

votre problème c'est que vous remettez topDepart1 à zéro au début de chaque loop (et vous testez toujours && digitalRead(relay1Pin) à HIGH dans le if comme déjà dit en #1)

Je suis sur PC, je ne vois rien à l'écran en appuyant sur les touches ctrl-T?

J'ai supprimé topDepart1 mais ça ne fonctionne pas?

Au départ la sortie relay1Pin est à 0
Quand je met le bp à O (masse) j'ai la tempo qui démarre puis la sortie relay1pin passe à 1?

On reprend dans l'ordre répondez à cela:

Les boutons sont généralement mieux en INPUT_PULLUP, comment est câblé le vôtre, vous avez bien une résistance de pull-down ?

Bonjour, oui bien en intput pullup et déclarée en entrée 2.

ok donc ce test ne vous dit pas si le bouton est appuyé

   bp1 = digitalRead(bp1Pin);
 
  if (bp1){ // si bouton appuyé

Voici: j'ai ajouté un serial print juste après le digital read bp1Pin pour pouvoir lire l'état:
1° Sans appuyer sur le bp = 1
2° Avec appui sur le bp = 0

J'ai augmenté la tempo à 3 sec pour être certain de voir son action

oui donc si vous voulez déclencher le relais lors de l'appui il faut faire

if (digitalRead(bp1Pin) == LOW) { 
  //si bouton appuyé
  digitalWrite(relay1Pin, LOW); // sortie pour activer le relais
  ...
} else {
  // si bouton pas appuyé
  ...
}

et vous avez donc votre relay1Pin à LOW. il faudra donc tester quand le temps est écoulé ET si la pin est LOW, pas HIGH

il y aura bien sûr des rebonds sur votre bouton, il faudra gérer cela.