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