نظرة عامة على جهاز استشعار CO2 بالأشعة تحت الحمراء MH-Z19

مؤخرا مستوى الأدوات شعبية تظهر CO 2 ، وكذلك المواد التي تروي رصد CO 2 يمكن تحويلها إلى جهاز كمبيوتر متصلة بشبكة من أجهزة الاستشعار. أريد أن أظهر حل المشكلة من ناحية أخرى.

على عكس مستشعرات CO 2 القديمة ، لا تتطلب MH-Z19 جهدًا محددًا أو طاقة عالية ويمكنها نقل البيانات عبر UART و 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, )


ليس الأمر أنني لم أثق في PWM ، ولكن من الأفضل الحصول على البيانات رقميًا ومع المجموع الاختباري. يتيح لك UART الاستعلام عن مستويات CO 2 وإجراء نوعين من المعايرة. نترك المعايرة إلى Garrus وننظر في طلب البيانات. للقيام بذلك ، بسرعة 9600 (8 بت ، توقف - 1 ، تماثل - لا شيء) ، تحتاج إلى إرسال البايت التسعة التالية:
• 0xFF - بداية أي أمر
• 0x01 - المستشعر الأول (إنه واحد فقط)
• 0x86 - أمر
• 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 - بيانات
• 0x79 - المجموع الاختباري.

سيعود شيء من هذا القبيل:
• 0xFF - بداية أي إجابة
• 0x86 - الأمر
• 0x01 ، 0xC1 - قيمة عالية ومنخفضة (256 * 0x01 + 0xC1 = 449)
• 0x3C ، 0x04 ، 0x3C ، 0xC1 - تقول الوثائق أن شيئًا مثل 0x47 ، 0x00 ، 0x00 ، 0x00 يجب أن يأتي ، ولكن في الواقع ليس واضحًا ما.
• 0x7B - المجموع الاختباري.

يتم حساب المجموع الاختباري على النحو التالي: يتم أخذ 7 بايت من الاستجابة (جميعها باستثناء الأول والأخير) ، مضافًا ، مقلوبًا ، متزايد بنسبة 1: 0x86 + 0x01 ... + 0xC1 = 0x85 ، 0x85 xor 0xFF = 0x7A ، 0x7A + 1 = 0x7B.

وفقًا للوثائق ، يستغرق المستشعر حوالي ثلاث دقائق للدخول إلى وضع التشغيل. في المرة الأولى بعد تشغيله ، سينتج إما 5000 صفحة في الدقيقة أو 400 صفحة في الدقيقة. بعد اللحام الدؤوب بشكل خاص ، يمكن أن يصل إلى عدة ساعات.

ويتفاعل جهاز استشعار للتغير في تركيز CO 2مع تأخير حوالي دقيقة. إذا كنت يتجاوز 5000ppm تركيز (على سبيل المثال، كنت دقيقة بشكل مكثف في وجهه التنفس)، لبعض الوقت وقال انه سوف نعطيه معلومات كاذبة، تتفهم مستوى CO 2 - حتى حصلت 80ppm حتى.

لا ينعكس هذا في الوثائق ، ولكن لا يجب أن تطلب بيانات UART أكثر من كل 10 ثوانٍ ، وإلا يبدأ المستشعر في إعطاء شيء غريب.

حان الوقت للصور. قم بتوصيل المستشعر بـ Arduino Uno عبر Software Serial، TX / RX in A0 / A1، 5V power، ground in Gnd:



رسم مستعار يُضاف فيه التحقق من المجموع الاختباري
#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);
}


يذهب كل قياس على فترات 10 ثوان. توقفت القيم عن القفز عندما انتقلت بعيدًا عن المستشعر.


الآن دعنا نجعل المستشعر متحركًا. للقيام بذلك ، تحتاج إلى جهاز مع OTG وتطبيق مثل DroidTerm .
هناك دقة: من أجل إنشاء اتصال ، تحتاج إلى إعادة تشغيل Arduino.


بعد التأكد من عمل كل شيء ، سنقوم بإزالة Arduino ، واستبداله بـ FTDI FT232RL.


يجب تشغيل المستشعر بعد التوصيل حتى لا تكون هناك مشاكل في الاتصال.
أستخدم RealTerm لإرسال البيانات الثنائية عبر منفذ COM :


قد يكون من المفيد إضافة إدارة الطاقة عبر DTR حتى يمكن إعادة تشغيل المستشعر.

روابط مفيدة:
دليل مستشعر MH-Z19 مخطط اتصال
ورمز لـ PWM
مقارنة
بجهاز استشعار آخر. مقالة عن GT حول MH-Z19 و ESP8266.

لدي جهاز استشعار واحد فقط ولا أرغب في تفكيك ما قمت به من قبل ، لذا أقترح أن تختار.

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


All Articles