IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Projet de détection de fumée


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Points : 1
    Points
    1
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Zimkae
    Citation Envoyé par Zimkae Voir le message
    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
    Pour afficher une valeur numérique sur l'affichage LCD, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	lcd.write(String((rs));                                                       // Afficher la valeur de RS sur l'écran
    Citation Envoyé par Zimkae Voir le message
    - 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.
    Le problème vient de la déclaration de ton port analogique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const byte MQ_PIN = 0;                                               // Port de sortie analogique A0
    En fait tu déclares, donc lis le port digital 0 qui est aussi le port de réception du port série.
    Pour déclarer un port analogique, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const byte MQ_PIN = A0;
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Merci beaucoup
    Bonjour, tout d'abord merci pour avoir jété un oeil à mon problème ; actuellement je suis en cours donc je n'ai pas les composants pour retester le programme modifié mais je testerai ce soir.
    Merci beaucoup, je vous recontacte dès que possible.

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 725
    Points : 5 415
    Points
    5 415
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Pour afficher une valeur numérique sur l'affichage LCD, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	lcd.write(String((rs));                                                       // Afficher la valeur de RS sur l'écran
    Salut,

    Pas la peine de faire appel à la classe String qui va générer l'ajout de plein de code et usage mémoire. il suffit de faire pour imprimer la valeur
    Le problème vient de la déclaration de ton port analogique:...
    Non, la fonction analogRead() est intelligente, elle sait qu'on veut parler à un port analogique et donc elle se débrouille suivant si on lui donne 0 ou A0. Dans les 2 cas elle va lire A0. (je vous laisse regarder dans le code source comment ils font). Cela dit c'est une bonne pratique de mettre A0 pour que l'on ne se pose pas cette question

    Ce qu'il se passe quand vous débranchez le capteur c'est que la pin A0 n'est plus reliée à rien du tout. On dit qu'elle flotte. c'est donc une antenne sensible aux ondes électromagnétiques et elle vous donnera des valeurs plus ou moins aléatoires.

    pour vous en convaincre, branchez juste un fil dans la pin A0, laissez l'autre bout "en l'air" et faites tourner ce code avec le moniteur série ouvert à 115200 bauds:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void setup() {
      Serial.begin(115200);
    }
     
    void loop()
    {
      Serial.println(analogRead(A0));
      delay(100);
    }
    Vous verrez que les valeurs fluctuent fortement en fonction de si vous approchez votre main ou bougez le fil.


    --> Comment avez vous branché votre GROVE MQ2 ? les masses sont-elles bien reliées ?
    Nom : grove.png
Affichages : 181
Taille : 300,2 Ko
    il y a 3 pins à relier sur les 4 du modules Grove --> 5V, GND et le signal sur A0. celle qui est nommée NC ne doit pas être connectée.

    En tournant le potentiomètre marqué R1 avec un petit tournevis en croix (en plastique pour éviter les courts circuits) vous ajustez la sensibilité du module, donc influez sur la tension que vous allez recevoir sur A0.

    il y a un wiki en ligne chez Grove avec du code d'exemple pour calibrer et extraire une information pertinente du capteur. jouez un peu avec leur code

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Il fonctionne !!
    Bonjour,

    Merci de vos réponses, en effet le lcd.print n'était pas une fonction connue pour moi ; Pour ce qui est du seuil, il fallait effectivement tourner légèrement le potentiomètre puis lors de l'approche d'un peu de fumée la LED s'allume et le message s'affiche.

    Super, merci à vous 2

    PS : dernière petite Question, lorsque j'introduis un sous programme dans une condition (if), j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((float MQPpm))>470){       //Condition
    Sous programme en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float MQPpm
     
    return (pow(10,( ((log(rs/9.83)-0.53)/-0.4))*200))    // Formule pour calculer le nombre de ppm calculée par mes soins
    Message d'erreur :

    expected primary-expression before 'float'
    Je ne comprends pas car sur certains forums, il est stipulé qu'il faut juste enlever les parenthèses ou en rajouter, or chez moi, cela ne fonctionne pas.
    C'est pourquoi je demande à des gens qui s'y connaissent car je ne vois pas mes professeurs avant 1 semaine.

    Merci d'avance

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 725
    Points : 5 415
    Points
    5 415
    Par défaut
    un "sous programme" on appelle cela une fonction. il y a une syntaxe à respecter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float MQPpm()
    {
      return pow(10, ((log(rs / 9.83) - 0.53) / -0.4) * 200.0); // Formule pour calculer le nombre de ppm calculée par mes soins
    }
    et pour l'appeler aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (MQPpm() > 470) {
        // condition vraie
    } else {
        // condition fausse
    }
    vous devriez suivre un petit tuto sur le langage C, ça vous aiderait beaucoup.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2020
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Syntaxe
    En effet, j'ai souvent ignoré cette partie du programme car elle a fonctionné dès le début, mais merci d'avoir mis un nom sur ces choses là. Je vais aller consulter quelque petites vidéos et petits projets pour ce langage, merci beaucoup, je testerai prochainement 🙂

Discussions similaires

  1. Détection d'incendie ou de fumée
    Par tbrjerome dans le forum OpenCV
    Réponses: 10
    Dernier message: 05/05/2010, 11h56
  2. projet en java de détection de fichiers plagiés via le Web
    Par sabil el houda dans le forum Applets
    Réponses: 3
    Dernier message: 25/03/2010, 16h14
  3. Projet de détection d'AP wifi
    Par Korangar dans le forum Réseau
    Réponses: 3
    Dernier message: 02/03/2009, 23h51
  4. Recherche algorithme détection de fumée
    Par Bzc.Bzh dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 28/04/2008, 15h44
  5. Détection de forme pour projet scolaire
    Par vicentedelasvega dans le forum Langage
    Réponses: 4
    Dernier message: 28/03/2008, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo