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);
}
}
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.
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.
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)
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