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 :

Capteur CO2 - LaFabrique


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    février 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Capteur CO2 - LaFabrique
    Bonjour à tous,

    J’essaie de construire un détecteur de CO2 avec ce matériel : https://www.seeedstudio.com/Grove-Ca...or-MH-Z16.html

    J’ai un module grove pour le brancher et faire des essais mais je n’arrive pas à le faire fonctionner. J’utilise le petit programme qui est déjà fait sur cette page : https://wiki.seeedstudio.com/Grove-CO2_Sensor/

    Que signifie cette ligne ? SoftwareSerial s_serial(2, 3); // TX, RX.
    Sur quels ports dois-je brancher le détecteur ?

    Ai-je un problème de bibliothèque ?

    Merci pour votre aide.

    PhyZik

  2. #2
    Responsable Arduino et Systèmes Embarqués

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    11 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 11 371
    Points : 49 315
    Points
    49 315
    Billets dans le blog
    18
    Par défaut
    Bonsoir,

    Citation Envoyé par PhyZik Voir le message
    Que signifie cette ligne ? SoftwareSerial s_serial(2, 3); // TX, RX.
    Sur quels ports dois-je brancher le détecteur ?
    Instanciation d'un port série logiciel sur D2 (TX) et D3 (RX) (la bibliothèque SoftwareSerial est déjà installée en standard dans l'EDI Arduino).
    Si tu as un grove base shield, ça doit concerner le connecteur où il y a marqué D2 à première vue.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    février 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse rapide mais j'ai bien branché le capteur sur le port D2 et le moniteur série affiche ce message:
    Nom : 1.jpg
Affichages : 60
Taille : 15,0 Ko

    Pas de lecture de la température et du CO2....

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    août 2005
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 875
    Points : 1 715
    Points
    1 715
    Par défaut
    Bonsoir,

    Il semble y avoir un problème de configuration (vitesse ?) du moniteur série (qui ne correspond pas a celle du sensor).

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    février 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette aide mais je n'ai pas les compétences pour comprendre cette réponse. Pouvez-vous détailler ?
    PhyZik

  6. #6
    Membre émérite

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    1 428
    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 : 1 428
    Points : 2 598
    Points
    2 598
    Par défaut
    La console semble correcte (à 115200 bauds) puisque l’on voit le message d’invite et les premiers résultats.

    Le code d’exemple de lecture de la réponse du capteur est assez mauvais - si le capteur n’a pas fini de répondre en 10ms ça peut afficher n’importe quoi (mais vous ne devriez quand même pas voir de hiéroglyphes).

    Vous avez une première réponse (les 9 nombres que vous voyez) puis la ligne suivante est louche.

    Il faudrait re-écrire l’écoute du port série de manière asynchrone et un peu plus robuste mais avant cela pouvez vous:

    - décrire comment tout est branché
    - comment alimentez vous l’arduino et le capteur
    - modifiez le bout de code suivant pour afficher un message d’erreur de lecture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if(dataRecieve())
        {
            Serial.print("Temperature: ");
            Serial.print(temperature);
            Serial.print("  CO2: ");
            Serial.print(CO2PPM);
            Serial.println("");
        } else Serial.println("erreur de lecture.");

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    février 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci Jay M,

    Voilà les réponses :
    - tout est branché sur le port usb de mon ordinateur. Le capteur est sur le port D2 du grove.
    - j'ai fait la modification proposée et le moniteur série affiche :
    Nom : 1.jpg
Affichages : 41
Taille : 23,9 Ko

    Avec une suite de hiéroglyphes qui ne se termine pas...

  8. #8
    Membre émérite

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    1 428
    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 : 1 428
    Points : 2 598
    Points
    2 598
    Par défaut
    Ok donc ça fonctionne un peu (il réussit à lire des données une fois sur deux mais elles sont erronées) et ensuite au bout d’un moment ça fait n’importe quoi

    Vous pouvez partager une photo du montage ?

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    février 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je viens de trouver un autre code qui semble fonctionner.
    J'ai même réussi à faire afficher le taux de CO2 et le température sur un afficheur LCD.
    Une diode s'allume dès qu'un certain taux de CO2 est atteint et un buzzer sonne l'alerte.

    Je ne comprend pas tout dans ce code, surtout la boucle bool mais bon ça marche...

    Merci pour votre aide.

    PhyZik



    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    #include <SoftwareSerial.h>
    #include <Wire.h>
    #include "rgb_lcd.h"                          // Bibliothèque pour faire fonctionner l'afficheur LCD
    rgb_lcd afficheur;                            // Création de l'objet afficheur 
     
     
     
    const int pinRx = 8;
    const int pinTx = 7;
     
    SoftwareSerial sensor(pinTx,pinRx);
     
    unsigned char flg_get = 0;              // if get sensor data
     
    const unsigned char cmd_get_sensor[] = {
    0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
     
     
    bool sendCmdGetDta(int *gas_strength, int *temperature)
    {
        for(int i=0; i<sizeof(cmd_get_sensor); i++)
        {
            sensor.write(cmd_get_sensor[i]);
        }
     
        long cnt_timeout = 0;
        while(!sensor.available())              // wait for data
        {
            delay(1);
            cnt_timeout++;
            if(cnt_timeout>1000)return 0;       // time out
        }
        int len = 0;
        unsigned char dta[20];
        while(sensor.available())
        {
            dta[len++] = sensor.read();
        }
     
        if((9 == len) && (0xff == dta[0]) && (0x86 == dta[1]))      // data ok
        {
            *gas_strength = 256*dta[2]+dta[3];
            *temperature = dta[4] - 40;
            return 1;
        }
        return 0;
    }
     
     
     
     
    void setup()
    {
        Serial.begin(115200);
        sensor.begin(9600);
        pinMode(3,OUTPUT);                        // diode sur le port D3
        pinMode(4,OUTPUT);                       // Buzzer sur le port D4
        afficheur.begin(16, 2);                   // initialisation de l'objet afficheur
        afficheur.setRGB(255,255,255);            // couleur de fond de l'afficheur : Blanc = R + V + B
    }
     
     
    void loop()
    {
            flg_get = 0;
            int gas, temp;
     
            if(sendCmdGetDta(&gas, &temp))          // get data ok
            {
                Serial.print("gas_strength = ");
                Serial.println(gas);
                Serial.print("\ttemperature = ");
                Serial.println(temp);
            }
            else
            {
                Serial.println("get data error");
            }
     
     
    //Afficheur
      afficheur.clear();                            // Remise à zéro de l'afficheur
      afficheur.print("Tx CO2: ");                  // Affichage sur l'écran "Taux de CO2:"
      afficheur.print(gas);                         // Affichage de la valeur
      afficheur.print("ppm");                       // ppm
      afficheur.setCursor(0,1);                     // On se met sur la ligne du bas à gauche
      afficheur.print("Temp: ");                    // Affichage sur l'écran "Temp: "
      afficheur.print(temp);                        // temp
      afficheur.print(" C");                        // °C
     
     
              if (gas > 1500)
    {
                digitalWrite(3, HIGH);                // Allume la diode sur le port D3
                digitalWrite(4, HIGH);                // Allume le buzzer sur le port D4
                afficheur.setRGB(255,0,0);            // Le fond d'écran de l'afficheur est rouge
     
    }
              else
    {
                digitalWrite(3, LOW);                     // Eteint la diode sur le port D3
                digitalWrite(4, LOW);                     // Eteint le buzzer sur le port D4
                afficheur.setRGB(255,255,255);            // Le fond d'écran de l'afficheur est blanc
    }
     
     
        delay(1000);
    }
     
     
     
    void serialEvent()
    {
        while (Serial.available())
        {
            char c = Serial.read();
            if(c == 'g')flg_get = 1;
        }
    }

  10. #10
    Membre émérite

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    1 428
    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 : 1 428
    Points : 2 598
    Points
    2 598
    Par défaut
    Ce code est un peu mieux car il y a un timeout pour l’écoute du port série mais pas de vérification du checksum (coherence de la lecture) et un risque sur la réception toujours car pas traité de manière asynchrone.

    Ça devrait suffire cependant en première approche si c’est juste un petit démonstrateur et pas un élément réellement utilisé pour de la sécurité

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    février 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Effectivement, c'est pour une démonstration auprès des élèves du lycée.

    Mais comment améliorer la "vérification du checksum (coherence de la lecture) et un risque sur la réception toujours car pas traité de manière asynchrone".

    Des sources ou idées ?

    Merci

  12. #12
    Membre émérite

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    1 428
    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 : 1 428
    Points : 2 598
    Points
    2 598
    Par défaut
    si vous regardez cette bibliothèque , ils traitent à la fois un timeout sur le port série et le checksum
    ça me semble mieux

    ça a l'air d'être fait pour ce module qui ressemble au votre
    Nom : co2.png
Affichages : 27
Taille : 113,7 Ko

    mais notez que la commande qu'ils émettent pour obtenir une lecture c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {0xFF,0x01,0x9C,0x00,0x00,0x00,0x00,0x00,0x63}
    alors que dans leur code de démo Grove utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
    donc il se peut qu'il faille un peu adapter la bibliothèque

    faudrait trouver la doc exacte de votre module pour voir le format des commandes

Discussions similaires

  1. [VBA-E] Récupérer les données d'un capteur en USB
    Par $p00ky dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/05/2006, 15h29
  2. Capteur InfraRouge sur port com
    Par PoOky dans le forum Composants VCL
    Réponses: 12
    Dernier message: 12/01/2006, 15h31
  3. Utiliser le C pour récuperer données d'un capteur
    Par Malek_BAKLOUTI dans le forum C
    Réponses: 12
    Dernier message: 05/10/2005, 10h40
  4. comment récupérer l'état d'un capteur?
    Par r0d dans le forum Périphériques
    Réponses: 8
    Dernier message: 17/08/2005, 20h13

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