Présentation du capteur de CO2 infrarouge MH-Z19

Récemment, des gadgets montrant le niveau de CO 2 ont été populaires, ainsi que des articles expliquant comment un moniteur de CO 2 peut être transformé en capteur connecté à un ordinateur. Je veux montrer la solution au problème d'autre part.

Contrairement aux anciens capteurs de CO 2 , le MH-Z19 ne nécessite pas de tension spécifique ni de puissance élevée et peut transmettre des données via UART et PWM.



  • Hd — , Hd 7 LOW. .
  • SR —
  • Tx — — 3.3
  • Rx — 3.3 ( 5, )
  • Vo — 3.3, 10

  • PWM, : 1004, 2 HIGH, — LOW, «» CO2 0 — 5000ppm ( 2000ppm ).
    Cppm = 5000 * (Thigh — 2ms)/(Thigh + Tlow — 4ms)
    , PWM — , 3.3.
  • AOT —
  • Gnd —
  • Vin — 3.6 — 5.5 ( 3.3, )


Ce n'est pas que je ne faisais pas confiance à PWM, mais il vaut mieux obtenir les données en numérique et avec une somme de contrôle. UART vous permet d'interroger les niveaux de CO 2 et d'effectuer deux types d'étalonnage. Nous laissons l'étalonnage à Garrus et considérons la demande de données. Pour ce faire, à une vitesse de 9600 (8 bits, arrêt - 1, parité - aucune), vous devez envoyer les neuf octets suivants:
• 0xFF - le début de toute commande
• 0x01 - le premier capteur (il n'en est qu'un)
• 0x86 - commande
• 0x00, 0x00, 0x00, 0x00, 0x00 - données
• 0x79 - somme de contrôle.

Quelque chose comme ça va revenir:
• 0xFF - le début de toute réponse
• 0x86 - commande
• 0x01, 0xC1 - valeur haute et basse (256 * 0x01 + 0xC1 = 449)
• 0x3C, 0x04, 0x3C, 0xC1 - la documentation indique que quelque chose comme 0x47, 0x00, 0x00, 0x00 devrait venir, mais en réalité, on ne sait pas quoi.
• 0x7B - la somme de contrôle.

La somme de contrôle est calculée comme suit: 7 octets de la réponse sont pris (tous sauf le premier et le dernier), ajoutés, inversés, augmentés de 1: 0x86 + 0x01 ... + 0xC1 = 0x85, 0x85 xor 0xFF = 0x7A, 0x7A + 1 = 0x7B.

Selon la documentation, le capteur met environ trois minutes pour entrer en mode de fonctionnement. La première fois après l'avoir allumé, il produira 5000 ppm ou 400 ppm. Après une soudure particulièrement diligente, elle peut atteindre plusieurs heures.

Le capteur réagit à un changement de concentration de CO 2avec un retard d'environ une minute. Si vous dépassez une concentration de 5000 ppm (par exemple, vous avez beaucoup respiré pendant une minute), cela donnera de fausses données pendant un certain temps, sous-estimant le niveau de CO 2 - c'est ainsi que j'ai même obtenu 80 ppm.

Cela ne se reflète pas dans la documentation, mais vous ne devez pas demander de données UART plus souvent que toutes les 10 secondes, sinon le capteur commence à émettre quelque chose d'étrange.

Il est temps pour les photos. Connectez le capteur à l'Arduino Uno via le logiciel série, TX / RX en A0 / A1, alimentation 5 V, masse en Gnd:



Esquisse empruntée dans laquelle la vérification de la somme de contrôle est ajoutée
#include <SoftwareSerial.h>;

SoftwareSerial mySerial(A0, A1); // A0 -  TX , A1 -  RX

byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
unsigned char response[9];

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() 
{
  mySerial.write(cmd, 9);
  memset(response, 0, 9);
  mySerial.readBytes(response, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response[i];
  crc = 255 - crc;
  crc++;

  if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));
  } else {
    unsigned int responseHigh = (unsigned int) response[2];
    unsigned int responseLow = (unsigned int) response[3];
    unsigned int ppm = (256*responseHigh) + responseLow;
    Serial.println(ppm);
  }
  delay(10000);
}


Chaque mesure est effectuée à des intervalles de 10 secondes. Les valeurs ont cessé de sauter lorsque je me suis éloigné du capteur.


Rendons maintenant le capteur mobile. Pour ce faire, vous avez besoin d'un appareil avec OTG et d'une application comme DroidTerm .
Il y a une subtilité: pour établir une connexion, vous devez redémarrer l'Arduino.


Après vous être assuré que tout fonctionne, nous allons supprimer l'Arduino et le remplacer par le FTDI FT232RL.


Le capteur doit être alimenté après la connexion afin qu'il n'y ait aucun problème avec la connexion.
J'utilise RealTerm pour envoyer des données binaires via le port COM :


il peut être utile d'ajouter la gestion de l'alimentation via DTR afin de redémarrer le capteur.

Liens utiles:
Manuel du capteur MH-Z19 Schéma de connexion
et code pour PWM
Comparaison avec un autre capteur.
Article sur GT à propos de MH-Z19 et ESP8266.

Je n'ai qu'un seul capteur et je n'aime vraiment pas démonter ce que j'ai fait, alors je vous suggère de choisir.

Source: https://habr.com/ru/post/fr391157/


All Articles