LED qui clignote sans raison lorsque le buzzer retentit

Bonjour.

J'ai écris un programme Arduino (MEGA 2560) qui gère les données envoyées par 4 capteurs : Un capteur de température et d'humidité (DHT11 ), un capteur de gaz (MQ2), un capteur de flamme, et un capteur de présence.

L'ensemble fonctionne plutôt bien sauf le LED de climatisation venti_clim qui, sans raison se met à clignoter à la fréquence du buzzer

En gros la LED venti_clim clignote ( 1 seconde environ pour la période du clignotement) lorsque un capteur ( gaz, flamme ou présence ) est actif.

On dirait que cette LED venti_clim est cadencée au même moment que le buzzer car elle s'allume ( clignote ) lorsque le buzzer est en train de retentir .

Dans un premier temps j'ai cru que le problème venait de mon câblage et J'ai même changé la PIN de la LED venti_clim mais le problème persiste.

Svp quelqu'un peut-il m'aider à comprendre ce qui ne va pas dans mon code ?

Voici le code ci-dessous :

#include <DFRobot_DHT11.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

DFRobot_DHT11 DHT;
#define DHT11_PIN 2

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27



/*----------------------------------------declaration des PIN----------------------------------------*/
const int capteur_GAZ = A3; //capteur de GAZ
const int capteur_intru = 4; //capteur de presence
const int capteur_flamme = A7; //capteur de flamme
const int buzzer = 10 ; // module sonore
const int venti_clim = 22 ; //climatiseur
const int venti_evacuation = 9 ; // ventillateur évacuation des fuites de GAZ
const int ledR=12;
const int ledV=13;
/*----------------------------------------declaration des PIN----------------------------------------*/

/*----------------------------------------variables de gestion du systeme----------------------------*/
//------------variables de gestion DHT11
int temp_valeur;
int hum_valeur;
int temp_status = 0 ; 
//------------variables de gestion capteur de GAZ
float gaz_valeur;
int gaz_status = 0; 
unsigned long temps_gaz = millis();
//------------variables de gestion capteur d'intrusion
//enum {inactive,active} etat_alarme = active;
//enum {non,oui} intru_status = non;
int intru_status = 0 ;
int intru_valeur=0;
unsigned long temps_intru = millis();
//------------variables de gestion capteur de flamme
int flamme_valeur;
int flamme_status =0 ;

unsigned long temps_flamme = millis();

//------------variables de gestion capteur de flamme
 bool aff_aucun = true;
 bool aff_gaz = true;
 bool aff_intru = true;
 bool aff_flamme = true;
 bool aff_gaz_intru = true;
 bool aff_gaz_flamme = true;
 bool aff_intru_flamme = true;
 bool aff_gaz_intru_flamme = true;

/*----------------------------------------variables de gestion du systeme----------------------------*/

/*----------------------------------------Déclaration des fonctions----------------------------------*/
void lire_DHT11();
void lire_gaz();
void lire_intru();
void lire_flamme();
void capteur_actif();
void capteur_inactif();
void affichage_lcd();
void activation_affichage();
/*----------------------------------------Déclaration des fonctions----------------------------------*/ 

void setup() {
//---------configuration des PINS en E/S

pinMode(capteur_GAZ,INPUT);
pinMode(capteur_intru,INPUT);
pinMode(capteur_flamme,INPUT);
pinMode(venti_evacuation,OUTPUT);
pinMode(venti_clim,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(ledR,OUTPUT);
pinMode(ledV,OUTPUT);


//---------Initialisation de la communication serie
Serial.begin(9600);


//---------Initialisation de l'afficheur LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);

}

void loop() {
 lire_DHT11();
 Serial.println(digitalRead(venti_clim));
 lire_gaz();
 lire_intru();
 lire_flamme();
 affichage_lcd();

}


/*--------------------------fonction pour lire le capteur de temperature--------------------------*/
void lire_DHT11(){

    DHT.read(DHT11_PIN);
    temp_valeur = DHT.temperature;
    hum_valeur = DHT.humidity;
   if ( temp_valeur > 27 ){
    //temp_status = 1; 
    digitalWrite(venti_clim, HIGH);
    }
   else{
   // temp_status = 0;
    digitalWrite(venti_clim, LOW);
    }
  }
/*--------------------------fonction pour lire le capteur de temperature--------------------------*/

/*--------------------------fonction pour lire le capteur de gaz----------------------------------*/
void lire_gaz(){
  gaz_valeur = ((analogRead(capteur_GAZ)*5.00)/1023.00);
  if ( gaz_valeur > 1.00 ){ 
    gaz_status = 1;
    temps_gaz = millis();
    digitalWrite(venti_evacuation,HIGH);
    capteur_actif();
    }
  else{
    gaz_status = 0;
    digitalWrite(venti_evacuation,LOW);
    }
  }
/*--------------------------fonction pour lire le capteur de gaz-----------------------------------*/

/*--------------------------fonction pour lire le capteur de d'intrusion---------------------------*/
void lire_intru(){

intru_valeur = digitalRead(capteur_intru);

      if ( intru_valeur == LOW){
        intru_status = 1; 
        capteur_actif();
        }
      else {
        intru_status = 0;
        }
      }
/*--------------------------fonction pour lire le capteur de d'intrusion---------------------------*/

/*--------------------------fonction pour lire le capteur de flamme--------------------------------*/
void lire_flamme(){
  
    flamme_valeur = analogRead(capteur_flamme);
      if ( flamme_valeur < 100 ){
        flamme_status = 1; 
        temps_flamme = millis();
        capteur_actif();       
        }
      else{
        flamme_status = 0;
        }
      }
/*--------------------------fonction pour lire le capteur de flamme--------------------------------*/
 
/*--------------------------fonctions gerer l'etat du buzzer et des LED de signalisation-----------*/
 void capteur_actif(){
      digitalWrite(ledR,HIGH);
      digitalWrite(ledV,LOW);
      tone(buzzer, 200, 700); // on doit améliorer le code du buzzer pour produire un bon son (sirène de police)
  }
  
void capteur_inactif(){
      digitalWrite(ledR,LOW);
      digitalWrite(ledV,HIGH);
      noTone(buzzer);
  }
/*--------------------------fonctions gerer l'etat du buzzer et des LED de signalisation-----------*/

/*---------------------------------fonction gerer l'afficheur LCD---------------------------------*/
void affichage_lcd(){
    
    if(gaz_status == 0 && intru_status == 0 && flamme_status == 0){ 
    capteur_inactif() ;
    activation_affichage();
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("temperature : ");
      lcd.setCursor(17,0);
      lcd.print(temp_valeur);
      lcd.setCursor(3,1);
      lcd.print("humidite : ");
      lcd.setCursor(14,1);
      lcd.print(hum_valeur);
    }
    else if(gaz_status == 1 && intru_status == 0 && flamme_status == 0 &&  aff_gaz == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_gaz = false ; 
    }
    else if(gaz_status == 0 && intru_status == 1 && flamme_status == 0 && aff_intru == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Intrusion !!");
      activation_affichage();
      aff_intru = false ;  
    }
    else if(gaz_status == 0 && intru_status == 0 && flamme_status == 1 && aff_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Incendie !!");
      activation_affichage();
      aff_flamme = false ; 
    }

    else if(gaz_status == 1 && intru_status == 1 && flamme_status == 0 && aff_gaz_intru == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      lcd.setCursor(3,2);
      lcd.print("!! Intrusion !!");
      activation_affichage();
      aff_gaz_intru = false ;  
    }
    
    else if(gaz_status == 1 && intru_status == 0 && flamme_status == 1 && aff_gaz_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_gaz_flamme = false ;   
    }
    else if(gaz_status == 0 && intru_status == 1 && flamme_status == 1 && aff_intru_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_intru_flamme = false ;   
    }
    else if(gaz_status == 1 && intru_status == 1 && flamme_status == 1 && aff_gaz_intru_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_gaz_intru_flamme = false ;  
    }
    
  }
/*---------------------------------fonction gerer l'afficheur LCD---------------------------------*/

void activation_affichage(){
 aff_aucun = true;
 aff_gaz = true;
 aff_intru = true;
 aff_flamme = true;
 aff_gaz_intru = true;
 aff_gaz_flamme = true;
 aff_intru_flamme = true;
 aff_gaz_intru_flamme = true;
}

Bonjour fullproject

Si tu déconnectes le buzzer, est-ce que la LED clignote toujours au momernt où le buzzer devrait fonctionner?
Si elle ne clignote plus, tu as un problème d'alimentation, est-elle commune pour la LED et le buzzer, si oui, est-elle assez forte pour les deux, d'où vient-elle?

Eventuellement, fais une photo en gros plan de ton montage.

A+
Cordialement
jpbbricole

La lecture du DHT11 ne serait-elle pas perturbée lorsque le buzzer est actif?

hello

led inconnue au bataillon, avons nous le bon code?

tu es certain?

hello
la pin 22 doit etre la commande de la clim

moi je lis dans le post #1

d'ou ma question, car dans le code il n'y a que deux leds, une verte et l'autre rouge.

J'ai déconnecté le buzzer mais la LED clignote toujours au momment où le buzzer devrait fonctionner.

Pour l'alimentation, j'utilise le port USB de mon PC.

pour ce qui est du câblage (physique) , c'est un peu touffu sur la plaque à essais. Et si je vous envoyais un câblage dans le logiciel proteus ?

Ton code pour les LED à l'air correcte, donc oui un schéma réel serait le bien venue :slight_smile:

quand le buzzer est acctif, le DHT11 continue de lire les valeurs (température et humidité) car bien que l'écran LCD naffiche pas ces valeurs, il suffit que je provoque une augmentation ( petite flamme près du DHT11) de la température au dessus de 27°C et la ledR s'allume, ce qui est souhaité.

J'ai déconnecté le buzzer mais la LED à continué de clignoter au momment où le buzzer est sensé s'allumer.

Sur la pin 22 (venti_clim) j'ai connecté une LED qui représente le climatiseur.

Dans mon câblage il y a 4 LED dont une rouge (ledR), une verte ( ledV) et 2 autres ( climatiseur et ventilateur d'évacuation des fuites de gaz).

Bon, du coup, c'est laquelle qui clignote?

La led connectée à la pin 22 (venti_clim) est celle qui clignote.

@fdufnews
@terwal
@jpbbricole
@dfgh

Cette led qui clignote anormalement s'allume et reste allumer lorsque la température est supérieure à 27°C, et s'éteint lorsque la température redevient inférieure à 27°C.

Donc en gros le problème de clignotement ne survient que lorsqu'un capteur est actif (quand le buzzer retentit).

Et même lorsqu'un des capteurs est actif ( c'est à dire que cette led est en train de clignoter) , si je provoque une augmentation de la température ( supérieure à 27°C), cette LED là va s'allumer et rester allumer jusqu'à ce que la température redevienne inférieure à 27°C.

Voici le schéma de câblage ci dessous :

SCHEMA DE CABLAGE.pdf (197,0 Ko)

Bon pas sûre que cela t'aide, mais tu as regardé si la broche n'est pas aussi utilisé par d'autre fonction ?
Si tu change de broche tu as le même problème ?

Bonsoir fullproject.

Il faut mettre des print dans ton programme, dans void lire_DHT11():

Serial.println("venti_clim HIGH");
la même chose pour LOW.
Si, dans le moniteur, tu vois ces textes au rythme du clignotement intempestif, tu as un problème de programme, si non, un problème électrique.

Cordialement
jpbbricole

1 Like

J'ai regardé plusieurs fois et je ne vois cette broche là dans aucune autre fonction mis à par dans lire_DHT11.

Oui oui, j'ai changé de broche plusieurs fois mais le problème persiste.

J'ai mis des Serials.print dans la fonction lire_DHT11 et ces textes apparaissent au rythme du clignotement intempestif.

Donc le problème viendrait de mon programme, mais je ne sais à quel niveau du programme se trouve le problème.

Si cela fait la même chose, c'est forcément que c'est ton programme.
Du coup c'est quoi la valeur lu pendant le clignotement et en dehors?

Bonjour fullproject

J'ai, un peu, fouillé ton programme, sans trouver de vice caché :wink:

Essaies de mettre la valeur à la main, en ajoutant sous:

temp_valeur = DHT.temperature;
temp_valeur = 28;

comment se comporte la LED?

A+
Cordialement
jpbbricole