Bonjour à tous
je vais essayé d'être le plus clair possible
Il y a 2 cas de figure
1 - le test "testouverture" est negatif
2 - le test "testouverture" est positif
Il y a 1 relais qui alimente 1 verin.
Si le test est negatif, le relais est alimenté durant 5 secondes (delay = 5000) puis
coupé, puis alimenté, etc.La, ça fonctionne bien.
Si le test est positif, il faut que le relais soit coupé instantannement.
Or, il ne se coupe qu'au bout du delay(5000)
Pourtant, d'après le code, il devrait se couper de suite.
Il y a surement un probleme dans mon code ...
J'ai fait des essais en remplaçant "delay" par des boucles ou bien par "millis", ça
ne change rien.
if (NIVAVAR_REF_0 <= NIVAVAR_AV_M) { // si la condition est OK
digitalWrite(AVGRO, LOW); // j'alimente le relais
testouverture ();
delay (5000);
digitalWrite(AVGRO, HIGH); // je coupe le relais
}
-------------------------------------------------
void testouverture () {
// ARRET VERIN AVANT GAUCHE SI COMPLETEMENT OUVERT
VAL_CVOAVG = digitalRead (CVOAVG); // lecture de l'entréé
if (VAL_CVOAVG == HIGH){ // je teste si le verin associé au relais est completement ouvert
digitalWrite(AVGRO, HIGH); // je coupe le relais
}
}
Je commence en programmation Arduino, mais je programme sous d’autre langage.
Pour moi il y a une petite erreur dans la compréhension.
La fonction Dely(), pour moi , te bloque l’exécution de ton code pendant le temps voulu, c'est-à-dire que l’excution reste sur cette ligne, et attend.
Pour ce que tu veux faire, il faut, au début, mémoriser ‘’l’heure’’ de l’Arduino, puis dans la boucle, lui dire de faire l’action si temps mémoriser + temps action >= ‘’l’heure’’ de l’Arduino
Je pense qu’une personne avec plus d’expérience va te le confirmer.
Par contre je ne comprends l'intérêt, pourquoi ne pas attendre la présence de l'ouverture.
Ca ne peut pas être ça puisque le delay est précédé parce la condition de testouverture(). Donc les 5000 ms peuvent se passer relais ouvert ou relais fermé.
A mon avis c'est plus un problème de latence : un digitalWrite() prend quelques microseconds, puis tu tests un paramètre après le relais ce qui prend la aussi un temps de l'ordre de la µs. Probleme : même si ton relais commute en 10 ou 20µs (ce qui est très rapide pour un relais !) testouverture() sera passé depuis longtemps. De toute façon ton code n'est pas rigoureux il vaut mieux :
if (NIVAVAR_REF_0 <= NIVAVAR_AV_M && digitalRead (CVOAVG)== LOW) { // si la condition est OK
digitalWrite(AVGRO, LOW); // j'alimente le relais
delay (5000);
} else {
digitalWrite(AVGRO, HIGH); // je coupe le relais
}
}
Après tu veux peut-être que ton relais se coupe quand ton verrin arrive en butée :
long Depart;
...
if (NIVAVAR_REF_0 <= NIVAVAR_AV_M && digitalRead (CVOAVG)== LOW ) { // si la condition est OK
digitalWrite(AVGRO, LOW); // j'alimente le relais
Depart=millis();
}
if(millis()-Depart>5000 || digitalRead (CVOAVG)== HIGH) {
digitalWrite(AVGRO, HIGH); // je coupe le relais
}
}
Bonsoir,
Je comprends le principe de la programmation.
Par contre que le but de la programmation.
Est-ce que le but est de faire avancer le vérin pendant cinq secondes, de tester savoir s'il est en bout de courses et arrêter sa progression le cas échéant ou alors est-ce que le but est de faire avancer le vérin et de l'arrêter en bout de courses ?
--> Malicati
Le but : les vérins effectuent des cycles "marche" et "arrêt" de X secondes.
Mais, s'ils arrivent en butée "ouverture", ils doivent s’arrêter instantanément.
Or pour le moment, ils ne le font pas.
Ils ne stoppent qu’après avoir fait un cycle complet (marche +arrêt).
--> B@tto
Ta solution est peut être la bonne, mais je ne peux pas la tester.
En effet, le Code que j'ai mis est très épuré (c’était surtout pour voir le principe)
En réalité, les vérins fonctionnent par paires, il y à 4 vérins, et ils sont testés 2 par 2.
On teste :
inclinaison avant -> vérin avant droit et vérin avant gauche
inclinaison droite -> vérin avant droit et vérin arrière droit
inclinaison arrière -> vérin arriéré droit et vérin arriéré gauche
inclinaison gauche -> vérin arrière gauche et vérin avant gauche
Voila le code plus complet.
// SI CA PENCHE VERS L'AVANT ON ALIMENTE LES RELAIS "OUVERTURE" AVG ET AVD
if (NIVAVAR_REF_0 <= NIVAVAR_AV_M) { // si la condition est OK
digitalWrite(AVGRO, LOW); // j'alimente le relais AVGRO
digitalWrite(AVDRO, LOW); // j'alimente le relais AVDRO
testouverture (); // je teste si le verin est totalement ouvert
delay (3000); // délai 3 secondes lorsque l'on est en cycle normal
digitalWrite(AVGRO, HIGH); // je coupe le relais AVGRO
digitalWrite(AVDRO, HIGH); // je coupe le relais AVDRO
}
// SI CA PENCHE VERS LA DROITE ON ALIMENTE LES RELAIS "OUVERTURE" AVD ET ARD
if (NIVGADR_REF_0 >= NIVGADR_DR_M) {
digitalWrite(AVDRO, LOW);
digitalWrite(ARDRO, LOW);
testouverture ();
delay (3000);
digitalWrite(AVDRO, HIGH);
digitalWrite(ARDRO, HIGH);
}
// SI CA PENCHE VERS L'ARRIERE ON ALIMENTE LES RELAIS "OUVERTURE" ARG ET ARD
if (NIVAVAR_REF_0 >= NIVAVAR_AR_M) {
digitalWrite(ARGRO, LOW);
digitalWrite(ARDRO, LOW);
testouverture ();
delay (3000);
digitalWrite(ARGRO, HIGH);
digitalWrite(ARDRO, HIGH);
}
// SI CA PENCHE VERS LA GAUCHE ON ALIMENTE LES RELAIS "OUVERTURE" AVG ET ARG
if (NIVGADR_REF_0 <= NIVGADR_GA_M) {
digitalWrite(AVGRO, LOW);
digitalWrite(ARGRO, LOW);
testouverture ();
delay (3000);
digitalWrite(AVGRO, HIGH);
digitalWrite(ARGRO, HIGH);
}
--------------------------------------------------------------------
void testouverture () {
// ARRET VERIN AVANT GAUCHE SI COMPLETEMENT OUVERT
VAL_CVOAVG = digitalRead (CVOAVG);
if (VAL_CVOAVG == HIGH){
digitalWrite(AVGRO, HIGH);
}
// ARRET VERIN AVANT DROIT SI COMPLETEMENT OUVERT
VAL_CVOAVD = digitalRead (CVOAVD);
if (VAL_CVOAVD == HIGH){
digitalWrite(AVDRO, HIGH);
}
// ARRET VERIN ARRIERE GAUCHE SI COMPLETEMENT OUVERT
VAL_CVOARG = digitalRead (CVOARG);
if (VAL_CVOARG == HIGH){
digitalWrite(ARGRO, HIGH);
}
// ARRET VERIN ARRIERE DROIT SI COMPLETEMENT OUVERT
VAL_CVOARD = digitalRead (CVOARD);
if (VAL_CVOARD == HIGH){
digitalWrite(ARDRO, HIGH);
}
Mais, s'ils arrivent en butée "ouverture", ils doivent s’arrêter instantanément.
Or pour le moment, ils ne le font pas.
Ben oui parce que ton pas d'échantillonnage est de 5s (ou 3 dans le deuxième code). Ton vérin peut arriver en butée à n'importe quelle moment.
Tu peux très bien tester ne pas le trouver en butée. Alimenter pour 5s et là il arrive en butée tout de suite mais comme tu as un delay() le code est bloqué le temps de ce délai.
Il ne faudrait pas fonctionner comme cela.
Il faut faire une boucle utilisant millis() afin de gérer le temps et tester dans la boucle tes entrées et pouvoir ainsi réagir immédiatement à l'arrivée en butée.
En fait, regarde le deuxième logigramme de mon précédent post, c'est le principe de programmation.
Je suis en train de coder un peu la même fonction pour la gestion de mes lumières extérieures. En effet, il y a une tempo pour l'arrêt, sauf si je demande l'arrêt avant la fin.
Si tu le souhaites, je pourrais te montrer le code.