bonjour tout, le monde , je ne suis pas expert en code, car je pratique pas assez regulierement, j ai ecrit ça hier soir, et ça bloque, mais je ne comprend pas pourquoi
il me semble avoir bien respecter les consignes de bases en arduino...
//definition entrées et sorties
/*
* D2=entrée sonde
* D3=buzzer tone
* D4=entree interrupteur
* D5=relais
*/
#define sonde 2
#define buzzer 3
#define inter 4
#define relais 5
//pinmode
pinMode(sonde, INPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer, LOW);
pinMode(inter, INPUT);
pinMode(relais, OUTPUT);
digitalWrite(relais, LOW);
//declaration variable
int tempssondepleine=0;
int tempssondevide=0;
int etiquetteremonte=0;
int echenillagecasse=0;
void setup() {
// put your setup code here, to run once:
digitalWrite(buzzer, LOW); // ON DESACTIVE LE BUZZER a valider
digitalWrite(relais, LOW); // ON DESACTIVE LE RELAIS
}
void loop() {
// put your main code here, to run repeatedly:
tempssondepleine=5000; // 5 SECONDE
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
if digitalread(sonde)==LOW; //si rien devant la sonde
{
timersondepleine=time + tempssondepleine; //ON RAFRAICHIT TIMERSONDEPLEINE
}
if digitalread(sonde)==HIGH && time > timersondepleine; // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
{
etiquetteremonte=HIGH;
}
else
{
etiquetteremonte=LOW;
}
//DEFINITION TIMER SI L ECHENILLAGE CASSE
tempssondevide=10000; //10 SECONDE
if digitalread(sonde)==HIGH; //SI QUELQUE CHOSE DEVANT LA SONDE
{
timersondevide=time + tempssondevide; //ON RAFRAICHIT TIMERSONDEVIDE
}
if digitalread(sonde)==LOW && time > timersondevide; // SI RIEN EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 10 SECONDE
{
echenillagecasse=HIGH;
}
else
{
echenillagecasse=LOW;
}
if digitalRead(inter)== HIGH; // si l'inter est en position marche
{
if echenillagecasse==HIGH || etiquetteremonte==HIGH // SI LES ETIQUETTES REMONTE PENDANT PLUS DE 5 SECONDES OU QUE L ECHENILLAGE CASSE PENDANT PLU DE 10 SECONDE
{
digitalWrite(relais)= HIGH; //on active la sortie relais
tone (buzzer,900);
}
}
else
{
digitalWrite(buzzer, LOW) // ON DESACTIVE LE BUZZER a valider
digitalWrite(relais, LOW) // ON DESACTIVE LE RELAIS
}
}
alors voici, une correction, il manquait des majuscules sur les digitalRead, et j 'ai mis les delcarations dans le setup
ça passe mieux, mais ça bloque encore
//definition entrées et sorties
/*
* D2=entrée sonde
* D3=buzzer tone
* D4=entree interrupteur
* D5=relais
*/
void setup() {
// put your setup code here, to run once:
#define sonde 2
#define buzzer 3
#define inter 4
#define relais 5
//pinmode
pinMode(sonde, INPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer, LOW);
pinMode(inter, INPUT);
pinMode(relais, OUTPUT);
digitalWrite(relais, LOW);
//declaration variable
int tempssondepleine=0;
int tempssondevide=0;
int etiquetteremonte=0;
int echenillagecasse=0;
digitalWrite(buzzer, LOW); // ON DESACTIVE LE BUZZER a valider
digitalWrite(relais, LOW); // ON DESACTIVE LE RELAIS
}
void loop() {
// put your main code here, to run repeatedly:
int tempssondepleine=5000; // 5 SECONDE
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
if digitalRead(sonde)==LOW; //si rien devant la sonde
{
timersondepleine=time + tempssondepleine; //ON RAFRAICHIT TIMERSONDEPLEINE
}
if digitalRead(sonde)==HIGH && time > timersondepleine; // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
{
etiquetteremonte=HIGH;
}
else
{
etiquetteremonte=LOW;
}
//DEFINITION TIMER SI L ECHENILLAGE CASSE
tempssondevide=10000; //10 SECONDE
if digitalRead(sonde)==HIGH; //SI QUELQUE CHOSE DEVANT LA SONDE
{
timersondevide=time + tempssondevide; //ON RAFRAICHIT TIMERSONDEVIDE
}
if digitalRead(sonde)==LOW && time > timersondevide; // SI RIEN EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 10 SECONDE
{
echenillagecasse=HIGH;
}
else
{
echenillagecasse=LOW;
}
if digitalRead(inter)== HIGH; // si l'inter est en position marche
{
if echenillagecasse==HIGH || etiquetteremonte==HIGH // SI LES ETIQUETTES REMONTE PENDANT PLUS DE 5 SECONDES OU QUE L ECHENILLAGE CASSE PENDANT PLU DE 10 SECONDE
{
digitalWrite(relais)= HIGH; //on active la sortie relais
tone (buzzer,900);
}
}
else
{
digitalWrite(buzzer, LOW) // ON DESACTIVE LE BUZZER a valider
digitalWrite(relais, LOW) // ON DESACTIVE LE RELAIS
}
}
Oui, il s'agit de ce qu'on appelle la portée des variables. Une variable définie dans une fonction n'est pas citée à l'extérieur de cette fonction. Une variable globale est déclarée avant le setup (damned, grilled!)
merci c est bon, ba dit donc j en avais ecris des conneries....
//definition entrées et sorties
/*
* D2=entrée sonde
* D3=buzzer tone
* D4=entree interrupteur
* D5=relais
*/
#define sonde 2
#define buzzer 3
#define inter 4
#define relais 5
//declaration variable
int tempssondepleine=0;
int tempssondevide=0;
int etiquetteremonte=0;
int echenillagecasse=0;
int timersondepleine=0;
int timersondevide=0;
unsigned long time;
void setup() {
// put your setup code here, to run once:
//pinmode
pinMode(sonde, INPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer, LOW);
pinMode(inter, INPUT);
pinMode(relais, OUTPUT);
digitalWrite(relais, LOW);
digitalWrite(buzzer, LOW); // ON DESACTIVE LE BUZZER a valider
digitalWrite(relais, LOW); // ON DESACTIVE LE RELAIS
}
void loop() {
// put your main code here, to run repeatedly:
time = millis();
tempssondepleine=5000; // 5 SECONDE
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
if (digitalRead(sonde)==LOW) //si rien devant la sonde
{
timersondepleine=time + tempssondepleine; //ON RAFRAICHIT TIMERSONDEPLEINE
}
if (digitalRead(sonde)==HIGH && time > timersondepleine) // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
{
etiquetteremonte=HIGH;
}
else
{
etiquetteremonte=LOW;
}
//DEFINITION TIMER SI L ECHENILLAGE CASSE
tempssondevide=10000; //10 SECONDE
if (digitalRead(sonde)==HIGH) //SI QUELQUE CHOSE DEVANT LA SONDE
{
timersondevide=time + tempssondevide; //ON RAFRAICHIT TIMERSONDEVIDE
}
if (digitalRead(sonde)==LOW && time > timersondevide) // SI RIEN EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 10 SECONDE
{
echenillagecasse=HIGH;
}
else
{
echenillagecasse=LOW;
}
if (digitalRead(inter)== HIGH) // si l'inter est en position marche
{
if (echenillagecasse==HIGH || etiquetteremonte==HIGH) // SI LES ETIQUETTES REMONTE PENDANT PLUS DE 5 SECONDES OU QUE L ECHENILLAGE CASSE PENDANT PLU DE 10 SECONDE
{
digitalWrite(relais, HIGH); //on active la sortie relais
tone (buzzer,900);
}
}
else
{
digitalWrite(buzzer, LOW); // ON DESACTIVE LE BUZZER a valider
digitalWrite(relais, LOW); // ON DESACTIVE LE RELAIS
}
}
alors ça compile oui, ça fonctionne non... et je comprend pas pourquoi, c est pourtant un truc simple
en gros, si j'ai un truc plus de xxx secondes non stop devant la sonde, j active la sortie relais et je tone
si j ai strictement rien pendant plus de xxx secondes pareil
si j ai un coup un truc, un coupe rien, je laisse le relais et le buzzer eteint.....
//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
int tempssondepleine=0;
int tempssondevide=0;
int etiquetteremonte=0;
int echenillagecasse=0;
int timersondepleine=0;
int timersondevide=0;
unsigned long time;
void setup() {
// put your setup code here, to run once:
//pinmode
pinMode(sonde, INPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer, HIGH);
pinMode(inter, INPUT);
pinMode(relais, OUTPUT);
digitalWrite(relais, HIGH);
digitalWrite(buzzer, HIGH); // ON DESACTIVE LE BUZZER a valider
digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
delay(5000);
}
void loop() {
// put your main code here, to run repeatedly:
time = millis();
//DEFINITION TIMER SI LES ETIQUETTES REMONTE DANS L ECHENILLAGE
tempssondepleine=5000; // 5 SECONDE
if (digitalRead(sonde)==LOW) //si rien devant la sonde
{
timersondepleine=time + tempssondepleine; //ON RAFRAICHIT TIMERSONDEPLEINE
}
else if (digitalRead(sonde)==HIGH && time > timersondepleine) // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
{
etiquetteremonte=HIGH;
}
else
{
etiquetteremonte=LOW;
}
//DEFINITION TIMER SI L ECHENILLAGE CASSE
tempssondevide=10000; //10 SECONDE
if (digitalRead(sonde)== HIGH) //SI QUELQUE CHOSE DEVANT LA SONDE
{
timersondevide=time + tempssondevide; //ON RAFRAICHIT TIMERSONDEVIDE
}
else if (digitalRead(sonde)==LOW && time > timersondevide) // SI RIEN EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 10 SECONDE
{
echenillagecasse=HIGH;
}
else
{
echenillagecasse=LOW;
}
if (digitalRead(inter)== HIGH) // si l'inter est en position marche
{
if (echenillagecasse== HIGH || etiquetteremonte== HIGH) // 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);
}
}
else
{
digitalWrite(buzzer, HIGH); // ON DESACTIVE LE BUZZER
digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
}
}
HIGH c'est 5V
Tu dois définir ta variable mesurant le temps en unsigned long. Le nom time pouvant être réservé, choisis autre chose. Je prends en général chrono
unsigned long chrono =millis () ;
Ensuite ta gestion du temps est bizarre. Ton test vérifie que 5 secondes se sont écoulées depuis le lancement du programme. Il sera donc vrai tout le temps à partir de ces 5 secondes. Est-ce bien ce que tu veux ?
Édit : après lecture plus approfondie, c'est un peu plus complexe que je l'avais cru au départ...
Explique nous ce que doit faire ton code, sinon on ne peut t'aider que pour la syntaxe...
//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 10000; //10 SECONDES
bool etiquetteremonte=false;
bool echenillagecasse=false;
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
}
if (digitalRead(sonde)==HIGH && chrono > timersondepleine) // SI UNE ETIQUETTE EST DEVANT LA SONDE NON STOP PENDANT PLUS DE 5 SECONDE
{
etiquetteremonte=true;
Serial.print("\nEtiquetteRemonte\n");
}
else
{
etiquetteremonte=false;
}
//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=true;
Serial.print("\nCasse\n");
}
else
{
echenillagecasse=false;
//Serial.print("false");
}
if (digitalRead(inter)== HIGH) // si l'inter est en position marche
{
if (echenillagecasse== true || etiquetteremonte== true) // 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);
}
else
{
digitalWrite(buzzer, LOW); // ON DESACTIVE LE BUZZER
digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
}
}
else
{
digitalWrite(buzzer, LOW); // ON DESACTIVE LE BUZZER
digitalWrite(relais, HIGH); // ON DESACTIVE LE RELAIS
}
}