Led et buzzer

Bonjour a tous,

Je suis débutant et j'ai de la peine a trouver réponse a mon problème !
Je vous explique en deux mots mon problème :

j'ai deux capteur, un de niveau et l'autre de température !
Je veux que tant que les deux capteur sont fermer, une led vert fonctionne, en cas de panne, une led rouge s'allume et la verte s'éteint !
Jusqu'ici tous va bien, cela fonctionne ! Mais quand je met le buzzer en parallèle de la led rouge, sur une autre sortie bien sur, je veux quand quand il y a la panne, le buzzer sonne que 5sec par exemple puis se coupe mais la led rouge reste allumée pour autant que le contacte est ouvert !
j'ai fais avec tone(12,800,5000); mais bien évidement, ça tourne en boucle ! Je ne trouve pas la réponse pour stopper la fonction !!!
Merci de votre précieuse aide !

Abysse01

abysse01:
Bonjour a tous,

Je suis débutant et j'ai de la peine a trouver réponse a mon problème !
Je vous explique en deux mots mon problème :

j'ai deux capteur, un de niveau et l'autre de température !
Je veux que tant que les deux capteur sont fermer, une led vert fonctionne, en cas de panne, une led rouge s'allume et la verte s'éteint !
Jusqu'ici tous va bien, cela fonctionne ! Mais quand je met le buzzer en parallèle de la led rouge, sur une autre sortie bien sur, je veux quand quand il y a la panne, le buzzer sonne que 5sec par exemple puis se coupe mais la led rouge reste allumée pour autant que le contacte est ouvert !
j'ai fais avec tone(12,800,5000); mais bien évidement, ça tourne en boucle ! Je ne trouve pas la réponse pour stopper la fonction !!!
Merci de votre précieuse aide !

Abysse01

bonjour
publie ton code (entre balises # )

#define PIN2 2 // Alimentation du relais principal, si problème sur capteur, le relais est déactivé
#define PIN3 3 // Capteur de niveau d'eau, coupe le relais principal et allume la LED rouge de panne et lance le buzzer
#define PIN4 4 // Thermique installé sur la dry cell, coupe le relais principal si la dry cell chauffe à plus de 60°c
#define PIN5 5 // Contact sur le relais de controle de l'ampérage, si trop de courant env +23A, le relais principal coupe
#define PIN6 6 // LED rouge panne capteur niveau d'eau
#define PIN7 7 // LED rouge panne thermique dry cell
#define PIN8 8 // LED rouge panne relais de controle de courant
#define PIN9 9 // libre
#define PIN10 10 // LED verte, systeme fonctionne sans panne, affichage dans le véhicule
#define PIN11 11 // LED rouge, panne du système, affichage dans véhicule

int valPIN2 = 0; // variable qui contiendra la valeur binaire du capteur "PIN2"
int valPIN3 = 0; // variable qui contiendra la valeur binaire du capteur "PIN3"
int valPIN4 = 0; // variable qui contiendra la valeur binaire du capteur "PIN4"
int valPIN5 = 0; // variable qui contiendra la valeur binaire du capteur "PIN5"
int valPIN6 = 0; // variable qui contiendra la valeur binaire de la LED "PIN6"
int valPIN7 = 0; // variable qui contiendra la valeur binaire de la LED "PIN7"
int valPIN8 = 0 ; // variable qui contiendra la valeur binaire de la LED "PIN8"
int valPIN9 = 0; // variable qui contiendra la valeur binaire de la LED "PIN9"
int valPIN10 = 0; // variable qui contiendra la valeur binaire de la LED "PIN10"
int valPIN11 = 0; // variable qui contiendra la valeur binaire de la LED "PIN11"

const int sensorPin = A0; // pin that the sensor is attached to
const int ledPin = 13; // pin that the LED is attached to

int sensorValue = 0; // the sensor value
int sensorMin = 1023; // minimum sensor value
int sensorMax = 540; // maximum sensor vale

void setup () {
pinMode (PIN2, OUTPUT); // sortie, alimentation bobine relais principal
pinMode (PIN3, INPUT); // Entrée du capteur de niveau
pinMode (PIN4, INPUT); // Entrée du thermique
pinMode (PIN5, INPUT); // entrée du contact du relais de controle de tenion
pinMode (PIN6, OUTPUT); // sortie LED rouge panne capteur niveau d'eau
pinMode (PIN7, OUTPUT); // sortie LED rouge panne temperature dry cell
pinMode (PIN8, OUTPUT); // Sortie LED rouge relais de controle de tension
pinMode (PIN9, OUTPUT); // libre
pinMode (PIN10, OUTPUT); // Sortie LED verte controle système dans véhicule
pinMode (PIN11, OUTPUT); // Sortie LED rouge panne controle système dans véhicule

// calibrate during the first five seconds
while (millis() < 5000) {
sensorValue = analogRead(sensorPin);

// record the maximum sensor value
if (sensorValue > sensorMax) {
sensorMax = sensorValue;
}

// record the minimum sensor value
if (sensorValue < sensorMin) {
sensorMin = sensorValue;
}

}
Serial.begin(9600); // ouverture du port de lecture serie

}

void loop (){ //boucle infinie
valPIN3 = digitalRead(PIN3); //récup valeurs binaires
valPIN4 = digitalRead(PIN4); //récup valeurs binaires
valPIN5 = digitalRead(PIN5); //récup valeurs binaires

Serial.println(valPIN3); // lecture valeur PIN3
Serial.println(valPIN4); // lecture valeur PIN4
Serial.println(valPIN5); // lecture valeur PIN5
sensorValue = analogRead(0); // lis la valeur sur la broche A0
Serial.println(sensorValue);
delay(100); // delais entre chaque lecture

if (valPIN3 == HIGH && valPIN4 == HIGH && valPIN5 == HIGH) { //si les deux capteurs sont activés, on effectue l'action 1

digitalWrite(PIN2, HIGH); // Relais principal activé
digitalWrite(PIN10, HIGH); // LED verte dans véhicule activé
digitalWrite(PIN11, LOW); // LED rouge de panne dans véhicule éteint

}
else { //sinon on effectue la 2
digitalWrite(PIN2, LOW); // Relais principal éteint
digitalWrite(PIN10, LOW); // LED verte dans véhicule éteint
digitalWrite(PIN11, HIGH); // LED rouge de panne dans véhicule activé

}

if (valPIN3 == LOW){ // Contact flotteur si ouvert, on allume la LED Rouge sur PIN6
digitalWrite (PIN6, HIGH); // LED Rouge PINE6 allumée
}
else { // Contact flotteur fermer, la LED est éteinte
digitalWrite(PIN6, LOW); // LED Rouge éteinte
}

if (valPIN4 == LOW){ // Contact thermique ouvert, on allume la LED rouge sur PIN7
digitalWrite (PIN7, HIGH); // LED Rouge PIN7 allumée
}
else { // Contact thermique fermer, La LED est éteinte
digitalWrite(PIN7, LOW); // LED Rouge éteinte
}

if (valPIN5 == LOW){ // Contact du relais de controle de courant, on allume la LED rouge sur PIN8
digitalWrite (PIN8, HIGH); // LED Rouge allumée
}

else { // Contact relais fermé, La LED est éteinte
digitalWrite(PIN8, LOW); // LED Rouge éteinte
}

// read the sensor:
sensorValue = analogRead(sensorPin);

// apply the calibration to the sensor reading
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

// in case the sensor value is outside the range seen during calibration
sensorValue = constrain(sensorValue, 0, 255);

// fade the LED using the calibrated value:
analogWrite(ledPin, sensorValue);

}

ATTENTION, il y a des bouts de code qui ne sont pas encore développer, il s'agit de tous ce qui a des commentaires en anglais !!!

Merci d'avance

Salut,

Attention , je n'ai jamais utilisé, mais si je suis la référence de la fonction tone() (http://arduino.cc/en/Tutorial/Tone) il semblerais que pour stopper le buzzer tu dois utiliser l'instruction :

noTone( 8 ); <== j'imagine que le 8 doit correspondre au n° du pin utilisé.

Je pense donc que la partie de ton code qui s'occupe du buzzer, devrait ressembler à cela :

tone(.........);   //On fait sonner le Buzzer (j'ai mis des pointillés dans la fonction car je ne sais pas ce que tu as mis)     
delay(5000);      //On laisse sonner 5 secondes
noTone('numero du pin ou se trouve ton buzzer');    //Et on coupe le Buzzer !

A faire confirmer par un vétéran de l'Arduino :wink:

Cordialement

Maskim

Merci pour ta réponse, mais malheureusement ça ne coupe pas !
Vu que l'on es dans le loop, ça coupe pu recommence tout de suite !
Il me semble qu'il faut mettre en pause le loop ou qqch comme ça pour que le buzzer reste couper !

Interruption temporelle avec millis() et un flag, genre :

boolean Erreur;
long Temps;
int Delai=5000:
...

 if (valPIN3 == LOW){          // Contact flotteur si ouvert, on allume la LED Rouge sur PIN6, je suppose que le déclenchement vient de la
    digitalWrite (PIN6, HIGH);  // LED Rouge PINE6 allumée
Temps=millis();
Erreur=1;
Tone(12,800,5000);
  }
  else {                        // Contact flotteur fermer, la LED est éteinte
    digitalWrite(PIN6, LOW);    // LED Rouge éteinte
  }

if(millis()-Temps>Delai && Erreur==1) {
notone(12);
Erreur=0;
}

Merci pour cette réponse !
ça ne fonctionne pas tout a fait comme je voudrai !
Je précise une chose !
C'est quand la LED sur PIN11 qui s'allume que le buzzer doit fonctionner 5 secondes ! Mais attention, 5 seconde même que le contact du flotteur ou de température etc... reste ouvert !!! C'est à dire que je veux quand une panne se déclare sur un des capteur, la led rouge PIN11 et le Buzzer LED12 fonctionne mais que le buzzer ne fonctionne que 5sec alors que la LED rouge PIN11 reste allumée jusqu'à ce que la panne soit résolue !!
Simple comme ça a dire, mais je vois que c'est pas si simple a poser en code !!
Encore merci de votre aide !!

Oups oui je me suis gourré sur le placement de la réinitialisation de Erreur à 0 :

boolean Erreur;
long Temps;
int Delai=5000:
...

 if (valPIN3 == LOW){          // Contact flotteur si ouvert, on allume la LED Rouge sur PIN6, je suppose que le déclenchement vient de la
    digitalWrite (PIN6, HIGH);  // LED Rouge PINE6 allumée
Temps=millis();
Erreur=1;
Tone(12,800,5000);
  }
  else {                        // Contact flotteur fermer, la LED est éteinte
    digitalWrite(PIN6, LOW);    // LED Rouge éteinte
Erreur=0; // Mieux !
  }

if(millis()-Temps>Delai && Erreur==1) {
notone(12);
}

Super, cela fonctionne mais par contre, le buzzer ne se coupe pas après 5 sec !
il coupe 5sec après que la panne sois à zéro !
Moi je voudrai qu'il se coupe 5sec après le début de la panne même si elle est encore active sur la LED PIN11 !

boolean Erreur;
long Temps;
int Delai=5000:
...

 if (valPIN3 == LOW){          // Contact flotteur si ouvert, on allume la LED Rouge sur PIN6, je suppose que le déclenchement vient de la
    digitalWrite (PIN6, HIGH);  // LED Rouge PINE6 allumée
If(Erreur==0){
Temps=millis();
Tone(12,800,5000);
Erreur=1;
}
  }
  else {                        // Contact flotteur fermer, la LED est éteinte
    digitalWrite(PIN6, LOW);    // LED Rouge éteinte
Erreur=0; // Mieux !
  }

if(millis()-Temps>Delai && Erreur==1) {
notone(12);
}

Je te remercie du fond du coeur !
ça fonctionne comme je le voulais !
Es-ce que j'ose abuser en te posant un autre problème ???

Bah au pire y'en aura un autre pour répondre xD

Voilà, j'ai une transfo d'intensité !
Je veux que quand il y a plus de 20A, il active la pin13 qui m'active un relais qui me coupe mon installation !

Le code en anglais plus haut, ne fonctionne pas !

As-tu une idée de comment faire ?
Petite précision, pour ne pas que ça coupe puis recommence, comme l'histoire du buzzer, je veux que ça coupe le relais donc passer par la PIN13 !
si te faut d'autre précision, je suis dispo !
Encore merci !!!!

Qu'est-ce qui réactive ton relais ?

Le temps !
Si plus de tant d'ampère (25A), le relais est activé x temps !
Puis reviens a la normal, mais si plus que 25A, on recoupe x temps

void loop() {

// Si le bouton est enfoncé,
if ( digitalRead(pinBtn) == HIGH ) {

// Alors on active la temporisation
tempoActive = 1;
tempoDepart = millis();

}

// Si la temporisation est active,
if ( tempoActive ) {

// Et si il s'est écoulé 3 secondes,
if (( millis() - tempoDepart ) >= 3000 ) {

lcd.noBacklight();

digitalWrite(led,HIGH);
//digitalWrite(Dio_buzzer,HIGH);
tone(Dio_buzzer,880); //play the note "A5" (LA5)
delay (300);
tone(Dio_buzzer,698); //play the note "F6" (FA5)

lcd.backlight();

// Alors on affiche un petit message
Serial.println(" MIRAGE DES OEUFS,18 eme Jour!");
lcd.setCursor(0, 0);
lcd.print(" MIRAGE DES OEUFS, 18 eme JOUR!");
delay(10000);
lcd.clear();
// Et on désactive la temporisation pour ne pas afficher ce message une seconde fois
tempoActive = 0;
if ( digitalRead(pinBt),HIGH ){noTone(10); }

}
//if ( digitalRead(pinBt),HIGH ){noTone(10);

}
}