• Post category:Fort
  • Commentaires de la publication :0 commentaire
  • Dernière modification de la publication :février 25, 2023
  • Temps de lecture :8 min de lecture

Capteur MQ9 Stabilisation Mesure et Alarme avec LCD arduino

Niveau APPRENTISSAGE :   ► Fort

 

 

    Prérequis :

Matériel :

  • 1 x Carte Arduino Uno
  • 1 x LCD 20×4
  • 1 x Module I2C
  • 1 x Capteur MQ9
  • Fils de connexion
  • 1 x Breadboard

Version IDE :

Bibliothèque :

 

 

Vidéo de démonstration :

 

Schéma de câblage :

 

 

Download Code :

  Capteur MQ9 Stabilisation Mesure et Alarme avec LCD arduino

 

Code :

// Inclure le code de la bibliothèque:
#include <LiquidCrystal_I2C.h>
// Initialiser la bibliothèque avec les dimensions de l'interface
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Capteur MQ-9
// réglage de la broche de connexion
#define pinA A0

int ledPinVert = 8;
int ledPinRouge = 9;

// variables de mesure
float sensor_volt;
float RS_air;
float R0;
float sensorValue;
float RS_gas;
float ratio;

unsigned long currentTime = 0;
unsigned long previousTime = 0;
boolean StabilisationMQ9;
char buffer[20] = "";
char buffer2[5] = "";
char buffer3[5] = "";

void setup() {
Serial.begin(9600);
pinMode(ledPinVert, OUTPUT);
digitalWrite(ledPinVert, LOW);
pinMode(ledPinRouge, OUTPUT);
digitalWrite(ledPinRouge, LOW);
// Initialisation de l'interface LCD
lcd.init();
// Active le rétro-éclairage du LCD
lcd.backlight();
}

void loop() {
currentTime = millis();
//Programme stabilisation
if (StabilisationMQ9 == 0) {
if ((currentTime - previousTime) > 600000) {
StabilisationMQ9 = 1;
//previousTime = currentTime;
}
// boucle pour récupérer 100 mesures
sensorValue = 0;
for (int x = 0; x < 100; x++) {
// à chaque exécution on ajoute une nouvelle valeur à la variable
// de l'entrée analogique
sensorValue = sensorValue + analogRead(pinA);
delay(1);
}
// obtient la valeur moyenne
sensorValue = sensorValue / 100.0;
// calcul de la valeur de la tension d'entrée
sensor_volt = sensorValue / 1024 * 5.0;
// calcul de la résistance de l'air
RS_air = (5.0 - sensor_volt) / sensor_volt;
// calcul de la constante R0 - ratio 9.9:1 lu sur le graphique
R0 = RS_air / 9.9;
// affichage des données mesurées sur LCD
lcd.setCursor(0, 0);
lcd.print("--Stabilisation--MQ9");
dtostrf(sensor_volt, 2, 2, buffer2);
sprintf(buffer, "Tens. entree: %5sV", buffer2);
lcd.setCursor(0, 1);
lcd.print(buffer);
dtostrf(R0, 4, 2, buffer2);
sprintf(buffer, "Constante R0 : %5s", buffer2);
lcd.setCursor(0, 2);
lcd.print(buffer);
// affichage des données mesurées sur console
Serial.println("Stabilisation en cour");
Serial.print("Tension d'entrée: ");
Serial.print(sensor_volt);
Serial.println("V");
Serial.print("Constante R0 : ");
Serial.println(R0);
Serial.println("------------------");
digitalWrite(ledPinVert, HIGH);
delay(500);
digitalWrite(ledPinVert, LOW);
delay(500);
}
//Programme mesure
else {
// lire la valeur de la broche analogique
sensorValue = analogRead(pinA);
// calcule la tension d'entrée
sensor_volt = (float)sensorValue / 1024 * 5.0;
// calcul de la résistance actuelle
RS_gas = (5.0 - sensor_volt) / sensor_volt;
// calcule le rapport de lecture du graphique
ratio = RS_gas / R0;
// affichage des données mesurées sur LCD
lcd.setCursor(0, 0);
lcd.print(" -- Mesure -- MQ9");
dtostrf(sensor_volt, 2, 2, buffer2);
sprintf(buffer, "Tens. entree: %5sV", buffer2);
lcd.setCursor(0, 1);
lcd.print(buffer);
dtostrf(R0, 5, 2, buffer2);
dtostrf(ratio, 5, 1, buffer3);
sprintf(buffer, "R0:%5s Rs/R0:%5s", buffer2, buffer3);
lcd.setCursor(0, 2);
lcd.print(buffer);
// affichage des données mesurées sur console
Serial.println("Stabilisation ok");
Serial.print("Tension d'entrée: ");
Serial.println(sensor_volt);
Serial.print("Constante R0 : ");
Serial.println(R0);
Serial.print("Rapport de Rs/R0: ");
Serial.println(ratio);
Serial.println("------------------ ");
// si le ratio est inférieur à 1,5,
// on calcule l'estimation de la concentration en CO
if (ratio < 1.5) {
digitalWrite(ledPinRouge, HIGH);
digitalWrite(ledPinVert, LOW);
// recalcul des données chargées, de la plage 0-700
// à la concentration 200-10000
ratio = ratio * 100;
int ppm = map(ratio, 150, 79, 200, 1000);
sprintf(buffer, "Alarme CO : %d ppm", ppm);
lcd.setCursor(0, 3);
lcd.print(buffer);
Serial.print("Concentration approximative de CO : ");
Serial.print(ppm);
Serial.println(" ppm.");
} else {
digitalWrite(ledPinRouge, LOW);
digitalWrite(ledPinVert, HIGH);
lcd.setCursor(0, 3);
lcd.print(" ");
}
Serial.println();
delay(1000);
}
}

 

 

 


 

Laisser un commentaire