Vérifier une condition pendantun certain temps

Bonjour

J’essaye d’obtenir une vérification d’une condition (état d’un capteur) et que tant que cet état est =1 pendant au moins 15 s alors je lance une alarme.
J4ai essayé d’utiliser while, mais rien n’y fait, l’alarme se déclenche dès que le capteur est à 1:

#include <VirtualWire.h>

void setup() {
  Serial.begin(9600);



  vw_set_rx_pin(12);
  vw_setup(2000);
  vw_rx_start(); 

  Serial.println("Go !");
  pinMode(4, OUTPUT);
  //beep(100);
}

void loop() {
  float valeur;
  byte taille_message = sizeof(float);

 

  // On attend de recevoir un message
  vw_wait_rx();

  if (vw_get_message((byte *) &valeur, &taille_message)) {
    
    Serial.println(valeur);


    unsigned long debut = millis();

    if (valeur == 1) {
  

      while ( (valeur == 1) && (millis - debut < 15000)) {};
      if (millis - debut > 15000) {

        Serial.println("DO1 less than 10 degree");
        beep(1500);
        delay(500);
      }
    }
  }
}
void beep (int dTime)
{

  tone(4, 3900);
  delay(dTime);
  noTone(4);


}

Si quelqu’un a une idée, il serait mon sauveur…

bien à vous

Nicolas

Merci d’éditer votre post pour rajouter les balises de de code, c’est illisible tel quel:

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l’icône </> dans la barre d’outils pour indiquer que c’est du code

(Assurez vous aussi d’indenter le code correctement dans l’IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)


sinon c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

#define Button  A1
#define LED     10
#define Interval    3000

enum { Off = HIGH, On = LOW };

void
loop ()
{
    static int           flag    = 0;
    static unsigned long msecLst = 0;
           unsigned long msec    = millis ();

    if (Off == digitalRead (Button))  {
        if (flag)  {
            flag = 0;
            digitalWrite (LED, Off);
        }
    }

    else {
        if (! flag)  {
            flag    = 1;
            msecLst = msec;
        }
        else if ( (msec - msecLst) > Interval)  {
            digitalWrite (LED, On);
        }
    }
}

void
setup ()
{
    Serial.begin (9600);

    pinMode (Button, INPUT_PULLUP);

    digitalWrite (LED, Off);
    pinMode (LED,    OUTPUT);
}

la machine a état va vous sauver :slight_smile:

(vous auriez pu éditer votre premier post au lieu de reposter)

Merci pour vos conseils et réponses. cela fonctionne parfaitement !

un autre code où on explicite la machine à états

const byte pinCapteur = 2;

enum : byte {NOMINAL, DECLENCHEMENT, ATTENTE} etat = NOMINAL;

bool capteurActif()
{
  // ici lire votre capteur et retourner true s'il est activé
  bool capteurActif;

  capteurActif = (digitalRead(pinCapteur) == LOW);
  delay(20); // anti rebond du pauvre

  return capteurActif;
}

bool alerte() {
  static unsigned long declenchement;
  bool alerte = false;

  switch (etat) {
    case NOMINAL: // on surveille le déclenchement
      if (capteurActif()) {
        Serial.println(F("Déclenchement !"));
        declenchement = millis();
        etat = DECLENCHEMENT;
      }
      break;

    case DECLENCHEMENT:
      if (capteurActif()) { // si on est toujours activé
        if (millis() - declenchement >= 15000) { // et que ça fait plus de 15s
          Serial.println(F("Alerte !"));
          alerte = true;
          digitalWrite(LED_BUILTIN, HIGH);
          etat = ATTENTE;
        }
      } else { // fausse alerte
        Serial.println(F("Fausse Alerte !"));
        etat = NOMINAL;
      }
      break;

    case ATTENTE:
      if (! capteurActif()) {
        Serial.println(F("Fin d'alerte !"));
        digitalWrite(LED_BUILTIN, LOW);
        etat = NOMINAL; // on attend la fin de l'alerte
      }
      break;
  }
  return alerte;
}

void setup() {
  pinMode(pinCapteur, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  Serial.println(F("Système prêt !"));
}

void loop() {
  if (alerte()) {
    // ... traiter l'alarme
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.