Go Down

Topic: timer qui deraille (Read 252 times) previous topic - next topic

vtec35

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


Code: [Select]

//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");   
  }

}


Zlika

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).
Si ça coince, forcez. Si ça casse, ça devait probablement être réparé, de toute façon.

vtec35

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

fdufnews

#3
Mar 13, 2019, 03:12 pm Last Edit: Mar 13, 2019, 03:13 pm by fdufnews
Là, il y a un problème
Code: [Select]
int 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.
Code: [Select]
#define TEMPS_SONDE_VIDE    8000ul


Je pense ques ces lignes doivent être la cause de quelques erreurs à la compilation
Code: [Select]
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
#define TEMPS_SONDE_PLEINE  5000 // 5 SECONDES
#define TEMPS_SONDE_VIDE    8000; //8 SECONDES

vtec35

merci je test dans 10-15mn



vtec35

#5
Mar 13, 2019, 07:26 pm Last Edit: Mar 13, 2019, 08:12 pm by vtec35
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...

Code: [Select]

//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"); 
    }
  }

}

kamill

Bonjour,

Quand tu écris
Code: [Select]
    //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.

vtec35

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

vtec35

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

dbrion06

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

vtec35

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é

Go Up