timer qui deraille

bonjour tout le monde, j'ai fais un petit code tout simple, avec une sonde en entrée, et un buzzer et un relais en sortie

en gros c est simple

si quelque chose reste devant la sonde plus de 5 secondes non stop, on buzz, si rien devant la sonde pendant plus de 8 secondes, on buzz

si l etat de la sonde passe régulièrement de haut à bas, on ne met pas le buzzer

j'ai fais 2 petites fonction timer non bloquante

ça marche tres bien bien 4-5 fois, et après ça déraille

l'etat reste bloquer en A, ou en B

j'ai printer un peu partout pour trouver la faille, mais ça à l'air bon, donc je comprend pas
j'ai changer d'arduino idem

//definition entrées et sorties

/*
 * D2=entrée sonde      etat haut 4.5v si quelque chose devant la sonde, et 0v si rien
 * D3=buzzer tone
 * D4=entree interrupteur
 * D5=relais
 */
#define sonde 2
#define buzzer 3
#define inter 4
#define relais 5


//declaration variable
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
#define TEMPS_SONDE_PLEINE  5000 // 5 SECONDES
#define TEMPS_SONDE_VIDE    8000; //8 SECONDES

int etiquetteremonte=0;
int echenillagecasse=0;
int timersondepleine=0;
int timersondevide=0;
unsigned long chrono=0;



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

  //pinmode
  pinMode(sonde, INPUT);
  pinMode(buzzer,OUTPUT);
  digitalWrite(buzzer, LOW);
  pinMode(inter, INPUT);
  pinMode(relais, OUTPUT);
  digitalWrite(relais, HIGH);
  timersondepleine = chrono + TEMPS_SONDE_PLEINE;
  timersondevide=chrono + TEMPS_SONDE_VIDE;
}


void loop()
{
  //delay(500);
  chrono = millis();
  //Serial.print(timersondepleine);
  if (digitalRead(sonde)==LOW) //si rien devant la sonde
  {
   Serial.print(".");
    timersondepleine = chrono + TEMPS_SONDE_PLEINE; //ON RAFRAICHIT TIMERSONDEPLEINE
  }
  else
  {
    Serial.print("/");
  }
  if (digitalRead(sonde)==HIGH && chrono > timersondepleine)  // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
  {
    etiquetteremonte = 1;
    //Serial.print("etiquetteremonte=1");
  }
  else
  {
    etiquetteremonte = 0;
    //Serial.print("etiquetteremonte=0");
  }

  //DEFINITION TIMER SI L ECHENILLAGE CASSE


  if (digitalRead(sonde)== HIGH) //SI QUELQUE CHOSE DEVANT LA SONDE
  {
    //Serial.print("Q");
    timersondevide=chrono + TEMPS_SONDE_VIDE; //ON RAFRAICHIT TIMERSONDEVIDE
  }
  if (digitalRead(sonde)==LOW && chrono > timersondevide)  // SI RIEN EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 10 SECONDE
  {
    echenillagecasse = 1;
    //Serial.print("\nCasse\n");
  }
  else
  {
    echenillagecasse = 0;
    //Serial.print("\npascasse\n");
  }

  if (digitalRead(inter)== HIGH) // si l'inter est en position marche
  {
    if (echenillagecasse== 1 || etiquetteremonte== 1)  // SI LES ETIQUETTES REMONTE PENDANT PLUS DE 5 SECONDES OU QUE L ECHENILLAGE CASSE PENDANT PLU DE 10 SECONDE
    {
      digitalWrite(relais, LOW);  //on active la sortie relais
      tone (buzzer,900); 
      Serial.print("a");     
    }
    else
    {
      noTone (buzzer);
      digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS 
      Serial.print("b");  
    }
  }
  else
  {
    noTone (buzzer); 
    digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
    Serial.print("c");   
  }

}

Bonjour,

Si vous utilisez un interrupteur, vous devez déclarer cette broche en 'INPUT_PULLUP' pour ne pas laisser le potentiel non fixé.

Pour calculer une temporisation avec millis(), utiliser la soustraction (millis() - début > durée).

Bonjour le câblage de la sonde est ok de ce côté-là pour l'histoire du timer on va essayer

Là, il y a un problèmeint timersondepleine=0;
un int code sur la fourchette -32768 à +32767 soit 32 secondes puisque le timer fonctionne à la milliseconde.
millis() retourne un unsigned long ce serait peut-être une bonne idée de déclarer toutes tes variables qui manipulent le temps dans ce format. Ne pas oublier de suffixer les constantes avec ul.

#define TEMPS_SONDE_VIDE    8000ul

Je pense ques ces lignes doivent être la cause de quelques erreurs à la compilation

//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
#define TEMPS_SONDE_PLEINE  5000 // 5 SECONDES
#define TEMPS_SONDE_VIDE    8000; //8 SECONDES

merci je test dans 10-15mn

alors voici le code remanier, et ça ne change pas le probleme

par contre effectivement, j ai mis un chrono, et apres 32 seconde suite au demarrage du programme on ne peut plus rien en faire

sauf que y a plus aucun int null part...

//definition entrées et sorties

/*
 * D2=entrée sonde      etat haut 4.5v si quelque chose devant la sonde, et 0v si rien
 * D3=buzzer tone
 * D4=entree interrupteur
 * D5=relais
 */
#define sonde 2
#define buzzer 3
#define inter 4
#define relais 5


//declaration variable
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
#define TEMPS_SONDE_PLEINE  5000ul // 5 SECONDES
#define TEMPS_SONDE_VIDE    8000ul //8 SECONDES

bool etiquetteremonte=false;
bool echenillagecasse=false;
bool etiquettePresente = false;
unsigned long timersondepleine=0;
unsigned long timersondevide=0;
unsigned long chrono=0;



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

  //pinmode
  pinMode(sonde, INPUT);
  pinMode(buzzer,OUTPUT);
  digitalWrite(buzzer, LOW);
  pinMode(inter, INPUT);
  pinMode(relais, OUTPUT);
  digitalWrite(relais, HIGH);
  // Initialisation des 2 timers
  timersondepleine = chrono + TEMPS_SONDE_PLEINE;
  timersondevide=chrono + TEMPS_SONDE_VIDE;
}


void loop()
{
 
  chrono = millis();
  //Serial.print(timersondepleine);
  
  if (digitalRead(sonde)==HIGH) 
  {etiquettePresente = true;}
  else {etiquettePresente = false;}


  // Par défaut, pas d'erreur
  //etiquetteremonte = false;
  //echenillagecasse = false;

  if(etiquettePresente) // SI QUELQUE CHOSE DEVANT LA SONDE
  {
    //Serial.print("Q");
timersondevide = chrono + TEMPS_SONDE_VIDE; //ON RAFRAICHIT TIMERSONDEVIDE
    
    
    //Serial.print("\npascasse\n");

    if (chrono > timersondepleine)  // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
    {
      etiquetteremonte = true;
      //Serial.print("etiquetteremonte=1");
    }
  }
  else // SI RIEN DEVANT LA SONDE
  {
    Serial.print(".");
timersondepleine = chrono + TEMPS_SONDE_PLEINE; //ON RAFRAICHIT TIMERSONDEPLEINE
    
	
	if (chrono > timersondevide)  // SI RIEN EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 10 SECONDE
    {
      echenillagecasse = true;
      //Serial.print("\nCasse\n");
    }
  }


  if (digitalRead(inter)== LOW) // si l'inter est en position arret
  {
    noTone (buzzer); 
    digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
    Serial.print("c");   
  }
  else // si l'inter est en position marche
  {
    if (echenillagecasse || etiquetteremonte)  // SI LES ETIQUETTES REMONTENT PENDANT PLUS DE 5 SECONDES OU QUE L ECHENILLAGE CASSE PENDANT PLUS DE 10 SECONDE
    {
      digitalWrite(relais, LOW);  //on active la sortie relais
      tone (buzzer,900); 
      Serial.print("a");     
    }
    else
    {
      noTone (buzzer);
      digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS 
      Serial.print("b");  
    }
  }

}

Bonjour,

Quand tu écris

    //Serial.print("Q");
    timersondepleine = chrono + TEMPS_SONDE_PLEINE; //ON RAFRAICHIT TIMERSONDEPLEINE

    //Serial.print("\npascasse\n");

    if (chrono > timersondepleine)  // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
    {
      etiquetteremonte = true;
      //Serial.print("etiquetteremonte=1");
    }

Les if n'est jamais vrai puisque timersondepleine = chrono + TEMPS_SONDE_PLEINE

Il faut que tu initialise timersondepleine uniquement lorsque etiquettePresente passe à true, c'est à dire que l'état précédent était à false. Pour ça il faut mémoriser l'état précédent.
Idem dans le else suivant.

oui excuse ça c est ma boulette

j'ai retoucher son code a la derniere minute pensant que c etait une erreur, mais non, je rectifie le code plus haut tels qu il etait

comment je peux faire pour printer les valeurs des timers? ou de millis(), afin de verifier chacune des variables

Serial.println("lgx"+ String(millis()); doit suffire pour debugguer

c est bon merci ta solution etait la bonne c est moi qui ai pas bien compiler, je suis fatigué

merci

est ce que a tout hasard quelqu'un pourrait m'aider sur ce post?

https://forum.arduino.cc/index.php?topic=602976.0

car c est hyper important pour moi, et je suis archi bloqué