Comment ajouter un delay "dans un sens" pour une condition ???

Bonjour à tous,

Je me suis inscrit depuis un moment mais je n'avais jamais pratiqué, je n'ai qu'une semain d'expérience, donc "bébé à bord" :) !!!

j'utilise un Arduino Nano et je veux réaliser un petit montage tout simple avec un slider (potentiomètre) qui fera varier la tension de 0 à 5 V et un relais, implicant deux conditions:

Par exemple, "de 3.5 à 5V" si la tension est lu par l'analog pin A7 est >= 3.5, mettre la digital pin 2 à l'état HAUT si non ne rien faire.

Jusque la ça va je gère, mais je voulais rajouter un delay dans le sens "5 vers 3.5V" C'est à dire que l'orsque la tension décroit de 5 vers 3.5V, une fois qu'elle atteint 3.5 V attendre une certaint nombre de temps (timing, dans mon sketch) avant de remettre la digital pin 2 à l'état BAS!!!

J'ai pu faire un petit code pour la condition simple mais ne sais comment donner un "sens" à celle ci.

Merci pour vos conseils et votre patience par avance, j'èspere ne pas me faire tapper sur les doigts..

//Simple condition with timing on the way down //

const int sliderSensor = A7;              // Connecting sensor to analog pin 7
int sliderSensorVal;                      // Declaring a variable to store the sensor value
const int kcikDownRelay = 2;              // Connecting a relay to digital pin 2
int timing = 500;                         // Setting up the timing for "from ON to OFF"

void setup() {

  Serial.begin(115200);

 pinMode (sliderSensor, INPUT);     // Setting slider sensor pin as an input
 pinMode (kcikDownRelay, OUTPUT);   // Setting kick down relay pin as an output
 digitalWrite (kcikDownRelay, LOW); // setting kick down relay pin to low at start up

}

void loop() {

  sliderSensorVal = analogRead(sliderSensor);               // Reading and storing sensor value
  float sliderSensorVolt = (5. / 1023.) * sliderSensorVal;  // Converting sensor value to real voltage

  Serial.print(sliderSensorVolt);                           // Printing voltage @ sensor pin                          
  Serial.print(" Volts");                                   // ""
  Serial.print("\t");
  Serial.print(" Relay");
  
   if (sliderSensorVolt >= 3.5) {                           // Setting up condition        
    digitalWrite (kcikDownRelay, HIGH);                     // Then we turn relay on
    Serial.println(" ON");                                  // Printing relay status
      }

      else {                                                // If different, we do noting
    Serial.println(" OFF");                                 // Printing relay status
      }
      
}

Tu ne fais rien dans la condition else. Il te faut ceci :

   else {
     delay(timing);                                               // wait
     digitalWrite (kcikDownRelay, LOW);              // Then we turn relay off
     Serial.println(" OFF");                                  // Printing relay status
   }

Tu es dans le cas d’une “machine à états”.
En gros il te faut une variable qui indique dans quel état tu es, qui tu tiens bien à jour.
A chaque loop, selon l’état dans lequel tu es et selon les événements détectés (V>=3.5 , V<3.5 , délai écoulé) tu effectues les opérations adéquates et tu détermines si tu changes d’état.

Prends une feuille de papier (oui ça existe encore :-), dessine autant de patates que d’états. Marque le nom donné à l’état dans chaque patate.
Ensuite pour chaque événement qui peut arriver, et pour chaque état (chaque patate), tu dessines un trait fléché qui part de la patate et qui va vers une autre patate, y compris celle dont tu pars.
Le trait fléché va d’un patate à une autre s’il y a changement d’état, ou bien revient comme une boucle vers le point de départ si l’événement ne fait pas changer l’état.
Puis sur chaque trait sur écrit les actions à réaliser.
Une fois que tu as fait tout ça, ça devient très facile à programmer.
Vite fait à l’arrache, en PJ, le schéma pour ton problème. Tu noteras que ne dis dis pas quoi faire si, pendant l’attente, la tension repasse au dessus de 3.5V

hbachetti:
Tu ne fais rien dans la condition else.
Il te faut ceci :

   else {

delay(timing);                                               // wait
    digitalWrite (kcikDownRelay, LOW);              // Then we turn relay off
    Serial.println(" OFF");                                  // Printing relay status
  }

Salut hbachetti, merci!!

J’ai essayé ça déja, ça fonctionne mais c’est tout le sketch qui se trouve affecté par le delay, si tu vois ce que je veux dire…
lorsque la tension est < 3.5 V, il prends aussi le timing avant de repasser à l’état HAUT

biggil:
Tu es dans le cas d’une “machine à états”.
En gros il te faut une variable qui indique dans quel état tu es, qui tu tiens bien à jour.
A chaque loop, selon l’état dans lequel tu es et selon les événements détectés (V>=3.5 , V<3.5 , délai écoulé) tu effectues les opérations adéquates et tu détermines si tu changes d’état.

Prends une feuille de papier (oui ça existe encore :-), dessine autant de patates que d’états. Marque le nom donné à l’état dans chaque patate.
Ensuite pour chaque événement qui peut arriver, et pour chaque état (chaque patate), tu dessines un trait fléché qui part de la patate et qui va vers une autre patate, y compris celle dont tu pars.
Le trait fléché va d’un patate à une autre s’il y a changement d’état, ou bien revient comme une boucle vers le point de départ si l’événement ne fait pas changer l’état.
Puis sur chaque trait sur écrit les actions à réaliser.
Une fois que tu as fait tout ça, ça devient très facile à programmer.
Vite fait à l’arrache, en PJ, le schéma pour ton problème. Tu noteras que ne dis dis pas quoi faire si, pendant l’attente, la tension repasse au dessus de 3.5V

Salut biggil et merci,

Je vais analyser tout ça, pas encore bien saisi mais je vois se dessiner la solution. Je teste et je reviens

BenzDuino:
Salut hbachetti, merci!!

J’ai essayé ça déja, ça fonctionne mais c’est tout le sketch qui se trouve affecté par le delay, si tu vois ce que je veux dire…
lorsque la tension est < 3.5 V, il prends aussi le timing avant de repasser à l’état HAUT

Oui c’est clair que ma solution était un peu rapide, le délai est appliqué à chaque fois que la tension est vue basse.
Suis les conseils de biggil et exécutes les actions OFF seulement la première fois que tu vois la tension descendre en dessous de 3.5V, et les actions ON seulement la première fois que tu vois la tension monter au dessus de 3.5V.

@+

hbachetti: Oui c'est clair que ma solution était un peu rapide, le délai est appliqué à chaque fois que la tension est vue basse. Suis les conseils de biggil et exécutes les actions OFF seulement la première fois que tu vois la tension descendre en dessous de 3.5V, et les actions ON seulement la première fois que tu vois la tension monter au dessus de 3.5V.

@+

Ok cool, je teste ça et je reviens vers vous!!! :)