bug dans mon programme

bonjour, j'ai un bug, mes tests lignes 92 et 97 marche tres bien

malgré cela je n arrive pas a faire mon print ligne 62

du coup, ba ça marche pas

et les tests lignes 69 et 80 marchent, donc pourquoi pas le 62..

et pourtant l action ligne 137 marche pas

je pige pas...

//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
#define vcc_buzzer 6
#define entree_vide A0
#define entree_plein A1


//declaration variable
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE

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




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

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

}

void timer()
{
    chrono = millis();
  //Serial.println(etiquettePresente);
    if(etiquettePresente) // SI QUELQUE CHOSE DEVANT LA SONDE
  {
    //Serial.println("Q");
    timersondevide = chrono + TEMPS_SONDE_VIDE; //ON RAFRAICHIT TIMERSONDEVIDE
    //Serial.println("timersondevide");

    if (chrono > timersondepleine)  // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
    {
      etiquetteremonte = true;
      //Serial.println("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.println("\nCasse\n");
    }
  }

}


void etat_entree()
{
     if (digitalRead(sonde)==HIGH) 
   {
    etiquettePresente = true;
    //Serial.println("\presence= true");
   }
  else 
  {
    etiquettePresente = false;
    //Serial.println("presence= false"); 
  }


TEMPS_SONDE_PLEINE = analogRead(A0)*15;
//Serial.println(TEMPS_SONDE_PLEINE);
TEMPS_SONDE_VIDE = analogRead(entree_vide)*15;
//Serial.println(TEMPS_SONDE_VIDE);
  
}
void loop()
{
  timer();



  
  etat_entree();





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

  
  if (digitalRead(inter)== LOW) // si l'inter est en position arret
  {
    noTone (buzzer); 
    digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
    digitalWrite(vcc_buzzer, LOW);
    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); 
      digitalWrite(vcc_buzzer, HIGH);
      Serial.print("a");     
    }
    else
    {
      noTone (buzzer);
      digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS 
      digitalWrite(vcc_buzzer, LOW);
      //Serial.print("b");  
    }
  }

}

merci

Bonjour,

timer();

etat_entree();

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

Je trouve bizarre que tu fixes etiquetteremonte et echenillagecasse à false après avoir appelé timer() dont un des rôle est justement de fixer ces variables. C’est normal ?

ba bonne question je me suis demandé pareil, j avais fais le programme y a un petit moment, et je sait que j avais ete embeter a l epoque par un truc les timers marchait mal

et j avais due ecrire un truc de ce genre pour definir les variables de temps

#define TEMPS_SONDE_PLEINE = 5000ul;

sinon ça marchait pas....

voila une variante qui bug differement

sonde a vide, le buzzer marche
sonde pleine, ça "gresille"

//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
#define vcc_buzzer 6
#define entree_plein A0
#define entree_vide A1


//declaration variable
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE

// #define TEMPS_SONDE_PLEINE = 5000ul;
// #define TEMPS_SONDE_VIDE = 5000ul;
unsigned long TEMPS_SONDE_PLEINE; 
unsigned long TEMPS_SONDE_VIDE ;
bool etiquettePresente = false;
bool etiquetteremonte=false;
bool echenillagecasse=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, LOW);
  pinMode(vcc_buzzer, OUTPUT);
  digitalWrite(vcc_buzzer, LOW);
  // Initialisation des 2 timers
  timersondepleine = chrono + TEMPS_SONDE_PLEINE;
  timersondevide=chrono + TEMPS_SONDE_VIDE;
}


void loop()
{

  TEMPS_SONDE_PLEINE = analogRead(entree_plein)*15;
  //Serial.println(TEMPS_SONDE_PLEINE);
  TEMPS_SONDE_VIDE = analogRead(entree_vide)*15;
  //Serial.println(TEMPS_SONDE_VIDE);

  chrono = millis();
  //Serial.print(timersondevide);
  //Serial.print("              ");
  
  
  if (digitalRead(sonde)==HIGH) etiquettePresente = true;
  else etiquettePresente = false;


Serial.println(timersondepleine);

  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
    {
     echenillagecasse = false; 
    }
  }
  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");
    }
    else
    {
      etiquetteremonte = false;
    }
  }


  if (digitalRead(inter)== LOW) // si l'inter est en position arret
  {
    noTone (buzzer); 
    digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
    digitalWrite(vcc_buzzer, LOW);
    //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); 
      digitalWrite(vcc_buzzer, HIGH);
      //Serial.print("a");     
    }
    else
    {
      noTone (buzzer);
      digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS 
      digitalWrite(vcc_buzzer, LOW);
      //Serial.print("b");  
    }
  }

}

Aie ! si tu as mis des lignes que tu ne comprends pas dans ton code ça va être chaud :wink:

Pour ce qui est des lignes etiquetteremonte = false; echenillagecasse = false; dans le loop après l'appel à timer() ce n'est pas logique de mon point de vue. Mais je n'ai pas chercher à comprendre la logique de l'ensemble donc...

Perso, quand j'ai un programme enchaînant des if... et qu'il ne se comporte pas comme prévu et bien je le "trace" (avec des Serial.println judicieusement placés et affichant l'état des variables) pour circonscrire le problème.

Edit : je viens de voir que tu fais la même chose :wink: du coup à quel endroit ça ne fait pas ce qui est attendu ?

en fait c est hyper simple

j'ai une sonde

si quelque chose reste devant un certain nombre de seconde, on buzz

ou si il y a rien devant pendant un certain autre nombre de seconde; on buzz

sinon on buzz pas

les variables de temps se regle au potard

le programme marchait impecc sans les potards

le voici

//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
#define vcc_buzzer 6


//declaration variable
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
#define TEMPS_SONDE_PLEINE  5000ul // 5 SECONDES
#define TEMPS_SONDE_VIDE    10000ul //8 SECONDES
bool etiquettePresente = false;
bool etiquetteremonte=false;
bool echenillagecasse=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, LOW);
  pinMode(vcc_buzzer, OUTPUT);
  digitalWrite(vcc_buzzer, LOW);
  // Initialisation des 2 timers
  timersondepleine = chrono + TEMPS_SONDE_PLEINE;
  timersondevide=chrono + TEMPS_SONDE_VIDE;
}


void loop()
{
  //delay(500);
  chrono = millis();
  //Serial.print(timersondevide);
  //Serial.print("              ");
  
  
  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
    digitalWrite(vcc_buzzer, LOW);
    //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); 
      digitalWrite(vcc_buzzer, HIGH);
      //Serial.print("a");     
    }
    else
    {
      noTone (buzzer);
      digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS 
      digitalWrite(vcc_buzzer, LOW);
      //Serial.print("b");  
    }
  }

}

ya juste cette partie là qui ma avait emmerdé à l epoque

 #define TEMPS_SONDE_PLEINE  5000ul // 5 SECONDES
#define TEMPS_SONDE_VIDE    10000ul //8 SECONDES

j avais mis a la base des int, mais ça marchait pas.... je sais meme pas ce que c est le ul

Bonjour,

Dans les setup timersondepleine et timersondevidesont initialisés à 0

 timersondepleine = chrono + TEMPS_SONDE_PLEINE;
 timersondevide=chrono + TEMPS_SONDE_VIDE;

Donc la première fois le test
   if (chrono > timersondepleine)  // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDEou if (chrono > timersondevide)  // SI RIEN EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 10 SECONDE
est toujours vrai.

en fait c est hyper simple

Si tu le dis :wink:

Bon blague à part, j'ai tout compris à ce que tu veux faire.

Par contre là je suis en train de me griller quelques neurones sur la manière dont tu gères les temps....

Il va me falloir un peu de temps (ou que kamill debug tout avant ;-))

Sinon ul signifie unsigned long, en le précisant derrière un entier constant tu indiques au compilateur son type (par défaut il choisit int, de taille insuffisante pour les calculs sur les temps (unsigned long)).

a ok

alors mes timers sont des timers non bloquant

pour l histoire du chrono = 0 je test

bon voila

//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
#define vcc_buzzer 6
#define entree_plein A0
#define entree_vide A1


//declaration variable
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE

// #define TEMPS_SONDE_PLEINE = 5000ul;
// #define TEMPS_SONDE_VIDE = 5000ul;
unsigned long TEMPS_SONDE_PLEINE; 
unsigned long TEMPS_SONDE_VIDE ;
bool etiquettePresente = false;
bool etiquetteremonte=false;
bool echenillagecasse=false;
unsigned long timersondepleine=0;
unsigned long timersondevide=0;





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

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


void loop()
{

  TEMPS_SONDE_PLEINE = analogRead(entree_plein)*15;
  //Serial.println(TEMPS_SONDE_PLEINE);
  TEMPS_SONDE_VIDE = analogRead(entree_vide)*15;
  //Serial.println(TEMPS_SONDE_VIDE);


  //Serial.print(timersondevide);
  //Serial.print("              ");
  
  
  if (digitalRead(sonde)==HIGH) etiquettePresente = true;
  else etiquettePresente = false;


Serial.println(timersondepleine);

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

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


  if (digitalRead(inter)== LOW) // si l'inter est en position arret
  {
    noTone (buzzer); 
    digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
    digitalWrite(vcc_buzzer, LOW);
    //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); 
      digitalWrite(vcc_buzzer, HIGH);
      //Serial.print("a");     
    }
    else
    {
      noTone (buzzer);
      digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS 
      digitalWrite(vcc_buzzer, LOW);
      //Serial.print("b");  
    }
  }

}

je vais le tester demain avec son alim 9v, car je pense que le fait que ça bug quand un truc est devant la sonde, est due au fait que je ne suis alimenter que par l usb , et que ma sonde est une 6-36v

donc je test demain

Ok pour moi, je laisse refroidir mes neurones :wink:

ce type de timer est tres interressant, ça evite les delay qui bloque le programme

je pense que là ça va marcher, mais le fait que tone et son relais gresille, est due au manque de tension

alors dans le programme, ça but quand quelque chose est devant la sonde, on doit avoir un coup high et un coup lopw, faut que je trouve ou est le soucis

Si ta machine fonctionne en continue plus de 50 jours, tu t'exposes si j'en crois ce blog à un bug.

Bon mais là je ne vois pas le problème immédiat....

slt il semblerais que la sonde deconnais, c etait pas franc, je l'ai remplacer, ça fonctionne mais pas 100% comme je le voulais, mais je vais m en contenter

merci

Sinon, mais si cela te convient comme ça ne t’embête même pas à répondre ;-), il y a un truc que je ne comprends pas dans ton algo mais c'est peut-être ce que tu cherches à faire. Je trouve juste étrange au premier abord que echenillagecasse soit lié timersondepleine via ce code

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

Je ne vois pas le lien mais comme je ne connais pas la machine...

ba en fait je partaie du principe que si une etiquette remonte (car mal decoupé), l echenillage ne peu pas etre cassé

et vice versa

Si c'est le cas parfait, si ce n'est pas le cas peut-être que cela expliquerait les bugs qui restent. Perso je ne comprends pas le fonctionnement global de la machine :confused:

Encore une fois, te casse pas la tête à m'expliquer, si cela te va comme ça :wink:

voila la machine

la partie autours des etiquettes qui ne sert pas s appel l echenillage

il arrive parfois que celui ci casse, ou bien que le plotter coupe pas assez profond, du coup, les etiquettes remontent avec

ma machine est juste une alarme pour me prevenir d'intervenir

l'ideal aurait été qu il mette la machine en pause, mais il y a pas de vrai bouton pause facile a repiquer

C'est tout de suite plus parlant (bon il a quand même fallut que je regarde 2 fois ;-)). Belle machine en tout cas ! Onéreuse j'imagine ! Je vois mieux ce que tu fais. Pour la faire taire, un relai sur le 230 V :slight_smile: Non je déconne dès que cela dépasse 5V je me déclare moi même dangereux ! :wink: