Projet de détection de fumée
Bonjour à tous, je suis en terminale et j'ai un projet à faire, dans l'une de mes expériences que je me suis imposé, je dois allumer une LED lorsque le détecteur de fumée (MQ2 GasSensor) détecte une trop grande quantité de fumée. L'affichage du calcul de 2 résistances ainsi que des étapes du programme se fait grâce à un écran LCD 16x2 GROVE branché évidemment sur un port I2C.
J'ai donc branché le module GROVE MQ2 sur la broche A0 de ma carte Arduino (la tension envoyée par le détcteur varie de 0 à 5V selon la quantité de fumée reçue) et effectué les branchements nécessaires pour le bon fonctionnement de la LED (testés précédemment à l'aide d'un programme avec un bouton poussoir). Ainsi, la LED est censée s'allumer seulement lorsque la tension reçue en A0 est différente de 0V.
Malheureusement je rencontre 2 erreurs lorsque je fais fonctionner mon programme :
- La première : L'affichage de la valeur de rs et R0 sur l'écran ne fonctionne pas, lorsque l'étape d'affichage est la suivante "lcd.write(rs) ou (R0);' L'écran LCD affiche 4 barres horizontales superposées et non la valeur calculée
- La seconde : Même lorsque je débranche le détecteur du dispositif, la LED s'allume sans cesse, comme si la condition de tension était remplie.
Pour vérifier si elle s'allumait bien à cause de la condition, j'ai fais afficher un message sur l'écran et ainsi, la condition de tension est bien remplie alors qu'aucune tension n'est envoyée, je pense que cette erreur provient de la commande AnalogRead que je ne maîtrise pas du tout.
Voilà ci-dessous le programme en question :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| const byte MQ_PIN = 0; // Port de sortie analogique A0
const byte RL = 5; // Résistance RL nécessaire, ici 50kOhm
const float R0_propre = 9.83; // Coefficicent permettant de calculer R0, valeur constructeur
const byte Nbr_de_mesures_calibrage = 50; // Nombre de mesures pour le Calibrage
const byte Int_Calibrage = 500; // Temps en Millisecondes entre chaque mesures pour le Calibrage
const byte Nbr_de_mesures = 5; // Nombre de mesures à effectuer pour le test
const byte Int_mesures = 500; // Temps en Millisecondes entre chaque mesures du test
#include <Wire.h> // Déclaration de l'écran
#include "rgb_lcd.h" // ""
rgb_lcd lcd;
float R0 = 10; // Initialisation de la valeur de R0 à 10kOhm (valeur qui va changer)
float rs = 0; // Initialisation de la valeur de rs à 0kOhm
void setup() {
lcd.begin(16, 2); // Taille de l'écran
Serial.begin (9600); // 9600 bauds
lcd.setCursor(0, 0);
lcd.write("Calibrage..."); // Afficher "Calibrage" sur l'écran
R0 = MQCalibration(MQ_PIN); // Appel du sous-Programme MQCalibration
lcd.write("Calibrage fini"); // Afficher "Calibrage effectué" sur l'écran
lcd.setCursor(0, 0);
lcd.write(" "); // Réinitialise l'écran
lcd.setCursor(0, 0);
lcd.write("R0="); // Afficher "R0" sur l'écran
lcd.write(R0); // Afficher la valeur de R0 sur l'écran
lcd.write("kOhm"); // Afficher "kOhm" sur l'écran
delay(2000);
lcd.setCursor(0, 0);
lcd.write(" "); // Réinitialise l'écran
pinMode(4, OUTPUT); // Broche de sortie 4 (LED)
digitalWrite(4, LOW); // Initialisation de la LED
}
void loop()
{
lcd.setCursor(0, 0);
lcd.write(" "); // Réinitialise l'écran
rs = MQMesures(MQ_PIN); // Appel du sous-Programme MQMesures
lcd.setCursor(0, 0);
lcd.write("RS="); // Afficher "RS" sur l'écran
lcd.write(rs); // Afficher la valeur de RS sur l'écran
lcd.write("kOhm"); // Afficher "kOhm" sur l'écran
{
if (analogRead(MQ_PIN)<0); // Condition d'activation de la LED : Si Tension différente de 0
lcd.setCursor(0, 1);
lcd.write("Camarchepas");
digitalWrite(4, HIGH); // Activation de la LED
delay(3000);
digitalWrite(4, LOW); // Désactivation de la LED
lcd.setCursor(0, 1);
lcd.write(" "); // Réinitialise l'écran
}
delay(5000);
}
float MQCalibration(int MQ_PIN) // Sous-Programme MQCalibration
{
int N; // Déclaration de la variable N
float val = 0; // Déclaration de la variable val
for (N=0;N<Nbr_de_mesures_calibrage;N++)
{
val += MQCalculResistance(analogRead(MQ_PIN)); // Addition de toutes les valeurs de MQCalculResistnnce
delay(Int_Calibrage);
}
val /= Nbr_de_mesures_calibrage; // Calcul de la moyenne
val /= R0_propre; // Valeur de R0
return val;
}
int MQMesures(int MQ_PIN) // Sous-Programme MQMesures
{
int i; // Déclaration de la variable i
float rs = 0; // Initialisation de la valeur de RS
for (i=0;i<Nbr_de_mesures;i++)
{ rs += MQCalculResistance(analogRead(MQ_PIN)); // Addition de toutes les valeurs de RS
delay(Int_mesures);
}
rs /= Nbr_de_mesures; // Calcul de la moyenne
return rs;
}
float MQCalculResistance(int courant) // Sous-Programme MQCalculResistance
{
return ( ((float)RL*(1023-analogRead(MQ_PIN))/analogRead(MQ_PIN)));
} |
Merci à tous pour vos futures réponses, en espérant que celles-ci soient rapides et surtout instructives :)