Activation d'un module relai après lecture de tension (capteur de force)

Bonjour,

Dans le cadre d'un projet, je souhaite piloter un ventilateur en fonction de la présence d'une personne sur une chaise. Si une personne est détectée, cela arrête le ventilateur sinon cela le laisse tourner. Un capteur de force se trouvera sur cette chaise. Ce capteur me renvoi la tension en fonction du poids détecté par le capteur. Aucun soucis jusque la. Cependant je souhaite que le capteur détecte la présence d'une personne pendant un temps minimum, dans mon cas, 5 secondes or lorsque je met mon code en pratique, dès qu'il détecte un nombre supérieur au seuil, il active le relai immédiatement et après la tempo est respectée mais il arrive qu'il y ait toujours des défaillances après.
Pour résumer, le capteur doit me renvoyer des valeurs supérieures à 4900 pendant 5s pour envoyer un LOW au relai sinon il ne fait rien.

Ci-joint mon code :

/* FSR simple testing sketch.

  Connect one end of FSR to power, the other end to Analog 0.
  Then connect one end of a 10K resistor from Analog 0 to ground

  For more information see www.ladyada.net/learn/sensors/fsr.html */

int fsrPin = 0;     // the FSR and 10K pulldown are connected to a0
int fsrReading;     // the analog reading from the FSR resistor divider
int fsrVoltage;
unsigned long int millis_depart;
unsigned long int temps_presence;
const int pin_relai = 8;

void setup(void) {
  // We'll send debugging information via the Serial monitor
  Serial.begin(9600);
  pinMode(pin_relai, OUTPUT);
  millis_depart = millis();

}

void loop(void) {
  fsrReading = analogRead(fsrPin);

  Serial.print("Analog reading = ");
  Serial.print(fsrReading);     // the raw analog reading
  fsrVoltage = map(fsrReading, 0, 1023, 0, 5000);
  Serial.print("Voltage reading in mV = ");
  Serial.println(fsrVoltage); //tension entre 0 et 5000 mV


  if (fsrVoltage < 4900)
  {
    Serial.println("Il n'y a personne");
    digitalWrite(pin_relai, HIGH); //on active le relai pour laisser le ventilo allumé
  }
  if (fsrVoltage >= 4900) //4900 mV = 10 kg
  {
    temps_presence = millis();
    if (temps_presence - millis_depart >= 5000)
    {
      millis_depart = temps_presence; //on copie le temps actuel à la place du temps de départ
      Serial.println("Il y a quelqu'un");
      digitalWrite(pin_relai, LOW); //on désactive le relai pour éteindre le ventilo
    }
  }
  delay(1000);
}

Merci de votre aide. Si jamais un point n'est pas clair, n'hésitez pas, cela sera un plaisir pour moi de vous éclaire.

Bonjour,

Il faut que tu mémorise le temps dans millis_depart uniquement la première fois que la valeur est supérieure à 4900.
Pour cela tu peux utiliser un flag ou mettre dans millis_depart à 0 quand il n'y a pas présence et mémoriser le temps quand la valeur est supérieure à 4900 et que millis_depart est égal à 0.

  if (fsrVoltage < 4900)
  {
    Serial.println("Il n'y a personne");
    digitalWrite(pin_relai, HIGH); //on active le relai pour laisser le ventilo allumé
    millis_depart=0;
  }
  if (fsrVoltage >= 4900) //4900 mV = 10 kg
  {
    temps_presence = millis();
    if (millis_depart == 0)
      millis_depart = temps_presence;  // la mesure vient de passer au dessus de 4900
    if (temps_presence - millis_depart >= 5000)
    {
      Serial.println("Il y a quelqu'un");
      digitalWrite(pin_relai, LOW); //on désactive le relai pour éteindre le ventilo
    }
  }

Parfait, c'est exactement ce qu'il me fallait, un énorme merci! ! J'avais bien compris pour l'histoire de la mémorisation du temps (même si pas capable de l'appliquer), en essayant de comprendre les ajouts de code que tu m'as fourni, on "reset" le millis de départ en le mettant dans l'autre condition, donc à chaque fois qu'on détecte une valeur supérieure à 4900 après une détection de valeur inférieure à 4900, le timer démarre et on a bien nos 5s de tempo attendu car on démarre de 0.