ماذا مرة أخرى؟ كم يمكنك؟نعم ، سنتحدث اليوم مرة أخرى عن مستشعر ثاني أكسيد الكربون Winsen MH-Z19 المحبوب بالكامل. لا ، لن يكون هناك تكرار.

* تقريبا
كما لاحظت ، تظهر
قصص الرعب حول مخاطر تركيزات ثاني أكسيد الكربون العالية في الغرفة بانتظام على صفحات هذا المورد. وعلى الرغم من أن الادعاءات بأن التركيزات فوق 1000 جزء في المليون تحمل الجحيم والموت مبالغ فيها قليلاً (تقول
ويكيبيديا أن بعض التأثيرات تبدأ على الأقل بنسبة 1 ٪ ، أي 10000 جزء في المليون ، في حين أن المستشعر يحتوي على نطاق كامل يبلغ 5000 جزء في المليون) - يمكن لثاني أكسيد الكربون تعمل كمؤشر لوجود أشياء سيئة أخرى بسبب التهوية غير الكافية. لذلك ، قررت أيضًا الانضمام إلى عالم رائع من قياس ثاني أكسيد الكربون وحصلت على جهاز الاستشعار المذكور.
أول شيء بالطبع ربطته مع اردوينو. لقد نسخت (مع التغييرات الضرورية) الرمز من
المقالة ، ظهرت الأرقام العزيزة على الشاشة.
ولكن بينما نسختها ، تسللت دودة من الشك إلى روحي - لماذا أعطى هذا المستشعر تسعة بايت ، وثاني بايتين فقط يمثل ثاني أكسيد الكربون منها؟ ربما يريد أن يخبرني بشيء آخر؟
قادني بحث على الإنترنت إلى مثل هذه
الصفحة المثيرة للاهتمام . يختبر المؤلف MH-Z19 ويكشف رد فعله على الأوامر غير الموثقة (والموثقة). لم يجرب جميع الفرق حتى الآن ، لذلك لا يزال هناك مجال لدورنا في المرح. هذا ما سنفعله.
بادئ ذي بدء ، سنتعامل مع الفريق "الكلاسيكي" 0x86 (أو ببساطة 134) ، حيث نحصل على تركيز ثاني أكسيد الكربون. تقارير Revspace:
عادةً ما يبدو الرد على الأمر 0x86 كما يلي:
0xFF CM HH LL TT SS Uh Ul CS
أين
CM هو الأمر المتكرر
HH / LL هي قيمة CO2 جزء في المليون ، الجزء العالي / المنخفض
TT هي درجة الحرارة بالدرجات المئوية ، زائد 40. على سبيل المثال ، عندما تكون درجة الحرارة 25 درجة مئوية ، ثم TT = 0x41
SS هو نوع من بايت الحالة ، هذا البايت لديه مجموعة بت واحدة فقط!
أه / Ul بعض القيمة غير المعروفة ، ربما تتعلق بالضغط؟ بعد تشغيل المستشعر ، يبدأ عند 15000 بالضبط ، ثم يستقر عادةً على حوالي 10500.
Cs هو المجموع الاختباري
أي أن استجابة المستشعر لهذا الأمر تحتوي أيضًا على درجة الحرارة T (التي تم إزاحتها بمقدار 40 درجة) وقيمتي وجهة غير معروفتين - واحد بايت S و 2 بايت U.S يأخذ قيم درجتين ، و U عندما يبدأ المستشعر ، ينخفض من 15000 إلى أكثر بقليل من 10 000
كيف نفهم ماذا تعني الأرقام S و U؟ بالطبع ، تحتاج إلى رسم رسم بياني! في أي موقف غير مفهوم ، ارسم رسمًا بيانيًا.
التفاصيل الفنية الباهتةولرسم رسم بياني ، سيكون من الجيد دفع قراءات المستشعر إلى جهاز كمبيوتر. وهو ما فعلته مع Serial.println (). في كل خمس ثوان ، يقوم اردوين باستطلاع المستشعر وكتابة قراءاته على USB-UART ، كل ما تبقى هو قراءتها على الكمبيوتر وحفظها في ملف. أفعل هذا (في Linux) مثل هذا:
rlwrap cat | cu -l /dev/ttyACM0 > sensor_$(date '+%Y%m%d_%H%M%S').log
لا ترفسنعم ، أعلم أنه يمكنك القيام بالقطط / dev / ttyACM0> .. ، ولكن لسبب ما لا يعمل هذا دائمًا بالنسبة لي ، وأحيانًا ينتهي هذا الأمر على الفور بصمت. يعجبني أيضًا الأمر المعطى (rlwrap cat | cu -l / dev / ttyACM0) لأنه يسمح لك بالتواصل بسهولة مع وحدة التحكم الدقيقة في الوضع التفاعلي (على الرغم من أنه ليس ضروريًا في هذه الحالة). بالتأكيد هناك أدوات أفضل لهذا الغرض ، ولكن للأسف ، لا أعرفها.
في نافذة طرفية أخرى ، يمكنك مشاهدة هذا الملف في الوقت الفعلي:
tail -f sensor_.log
اتضح مثل هذه الورقة من الأرقام:
... 1188 62 64 42 38 10790 1188 62 64 42 38 10790 1190 62 64 42 38 10790 1191 62 64 42 38 10790 1192 62 64 42 38 10790 1193 62 64 42 38 10790 1195 62 64 42 38 10790 ...
يحتوي كل سطر على CO2 و T و S و U (يتم تكرار U مرتين - كبايتين ورقم ثنائي البايت ، لا تسأل عن السبب).
الآن يمكنك بناء الرسوم البيانية. سأفعل هذا مع ipython --pylab.
y = map(lambda a: map(int, a.split()), open("sensor1.log", "r").readlines())
إذن ، الرسم البياني لثاني أكسيد الكربون:

من حيث المبدأ ، يبدو أن ذلك صحيح. حزينة انفجارات دورية فقط. يبدو أن هذا يرجع إلى أن المستشعر يرقد ببساطة على الطاولة ، وبأقل نسيم ، تُفقد قراءاته.
درجة الحرارة:

اللحظة التي فتحت فيها النافذة مرئية بوضوح. محاور بمقدار 1 - 2 درجة ، وهو ليس سيئًا لفرصة غير موثقة. ومع ذلك ، إذا تذكرنا مبدأ مستشعر
NDIR ، يمكننا أن نفهم أنه لا ينبغي للمرء أن يتوقع دقة كبيرة من مقياس الحرارة المدمج. تقيس هذه الأدوات امتصاص الضوء في نطاق الأشعة تحت الحمراء البعيدة ، وتستخدم لمبة Ilyich القديمة الجيدة لتوليد هذا الضوء ، ويمكنك حتى رؤية من خلال النوافذ كيف تضيء كل خمس ثوانٍ (يتم التقاط مثل هذه اللحظة على KDPV). يستهلك هذا المصباح الكثير من الطاقة ، ونتيجة لذلك ، يسخن المستشعر بأكمله ، ومدى تسخينه يعتمد على الملاءمة اللحظية لتدفقات الهواء.
نقترب من الأكثر إثارة للاهتمام. قيمة S:

لا يقول أي شيء؟ أنا أيضًا. مع الحزن ، نرسم CO2 و S على نفس الرسم البياني ونزيد قليلاً:

أجل! الآن كل شيء واضح! عندما يكون كل شيء على ما يرام ، يكون S 64 ، وعندما يبدأ مستشعر CO2 في النقانق ، ينخفض إلى 4. وبالتالي ، يمكنك استخدام S لمعرفة مدى شعور المستشعر ومدى دقة قراءاته.
لا يزال هناك ، كما يقول المظليون ، القيمة القصوى U:

لسوء الحظ ، فإن خدعة التراكب لا تفعل الكثير هنا. من الواضح فقط ، كما وعدت ، أن في البداية تساوي 15000 ، ثم تنخفض إلى أكثر بقليل من 10000 (لكنها يمكن أن تنخفض قليلاً بعد فترة طويلة). ومرة في اليوم تتكرر الدورة.
ولكن عندما قمت بتوصيل طاقة المستشعر ليس بـ 5 ، ولكن بـ 3.3 فولت من اردوينو ، تغير الوضع:

3.3 فولت على اردوينو مأخوذة من رقاقة LP2985 ، وهي مثبت خطي 160 مل أمبير. والمصباح ، بالحكم من خلال المقالات على الإنترنت ، يأكل بنفس القدر. عند النظر إلى المستشعر ، من الملاحظ أن المصباح الكهربائي المزود بمصدر الطاقة هذا يشتعل في وقت أطول من خمسة فولت. وقيمة U أعلى مرة ونصف.
تظهر الفرضية التالية - يحدد المستشعر تلقائيًا الوقت المستغرق لإضاءة المصباح للحصول على ما يكفي من إشعاع الأشعة تحت الحمراء ، وإذا لم يكن هناك ما يكفي من التيار ، فإنه يحرق المصباح لفترة أطول. وتعكس قيمة U فقط وقت حرق المصباح (أو بعض القيم الأخرى ذات الصلة ، على سبيل المثال ، الطاقة المستهلكة).
لاختبار هذا الافتراض ، نقوم بتشغيل جهاز الاستشعار من بطارية ليثيوم أيون ، والتي من الواضح أنها يمكن أن تنتج تيارًا أكبر بكثير:

في الواقع ، يقع U أحيانًا تحت 10000! ومع ذلك ، من الواضح أن هذا ليس برهانًا مطلقًا ، وبعد 24 ساعة يصبح كل شيء عكس ذلك تقريبًا. لذا تبقى الفرضية مجرد فرضية ، لكنني لم أتوصل إلى أي شيء أفضل.
حدث: عزيزي
unvp حل اللغز من القيمة U. أعطيه الكلمة:
من الواضح أن قيمة U هي القيمة الدنيا للامتصاص المقاس لـ IR CO2 يوميًا ، في بعض وحدات القياس الداخلية.
لا شيء يمكن إضافته ، باستثناء أن الجدول الزمني:

لماذا لم أفكر في هذا بنفسي؟ كل شيء بسيط. رسمت رسمًا بيانيًا لأربع قيم دفعة واحدة واستقرت على هذا. ولكن كان من الضروري رسم كميتين (كما في الصورة أعلاه) ، ثم لن تتداخل القمامة الدخيلة في وجه الحجم S مع الإدراك. لا تكرر أخطائي.
ربما سأضيف هذا: هل ترى خطوة أكبر من 1000 جزء في المليون في 48 ساعة؟ يتم معايرة هذا المستشعر تلقائيًا. في هذه الحالة ، انخفضت قيمة U مقارنة بما كانت عليه قبل المعايرة. في حين أنه من الواضح أن التركيز الفعلي لثاني أكسيد الكربون خلال هذه الفترة زاد فقط. الاستنتاج من هذا بسيط للغاية - القيمة U ليست قيمة امتصاص "أولية" للغاية ، ولكن تم حسابها بالفعل معدلة للمعايرة الحالية ، على ما يبدو تمثل بعض الاختلاف في الحد الأدنى من القراءات في دورات المعايرة الحالية والسابقة.
بشكل عام ، في رأيي ، المعايرة التلقائية (على الأقل في الشكل الذي يتم تنفيذه في MH-Z19) هي شر. يقول Revspace أنه يمكن تعطيله باستخدام الأمر 0x79: ABC logic on / off.
/ UPDحسنًا ، مع ترتيب فريق واحد. حان الوقت للذهاب إلى أبعد من ذلك ، ثم تقترب المقالة من النهاية ، ولم يتم اختبار 255 فريقًا آخر!
في
مقالة revspace ، تنتهي قائمة الأوامر التي تم اختبارها
على النحو التالي :
الأمر 0x89-0x8F
لم يتم إرجاع أي استجابة ، ولكن يبدو أن الأمر 0x8d يعيد تعيين المستشعر.
الأمر 0x99 (النطاق)
...
بالإضافة إلى ذلك ، لا يتم التحقق من الفرق ذات الأرقام الأقل. وبالتالي ، لا يزال أكثر من نصف العدد الإجمالي للفرق غير المعروفة بقليل.
بدون مزيد من اللغط ، قررت إعطاء الأوامر بشكل عشوائي (بتعبير أدق ، شبه عشوائي). وهذا ما حصلت عليه:
... Command: 255 1 47 0 0 0 0 0 208 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 17 0 0 0 0 0 238 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 45 0 0 0 0 0 210 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 5 0 0 0 0 0 250 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 88 0 0 0 0 0 167 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 245 0 0 0 0 0 10 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 107 0 0 0 0 0 148 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 214 0 0 0 0 0 41 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 136 0 0 0 0 0 119 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 7 0 0 0 0 0 248 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 153 0 0 0 0 0 102 Response: 255 153 1 0 0 0 0 0 102 CRC: 102102 CO2/t/s/u: 256 0 0 0 Command: 255 1 146 0 0 0 0 0 109 Response: 0 0 0 0 0 0 0 0 0 CRC: 00 CO2/t/s/u: 0 0 0 0 Command: 255 1 72 0 0 0 0 0 183 Response: 96 249 2 211 215 212 17 215 204 CRC: 159204 CO2/t/s/u: 723 215 212 4567 Command: 255 1 51 0 0 0 0 0 204 Response: 93 151 80 143 212 255 255 255 217 CRC: 185217 CO2/t/s/u: 20623 212 255 -1 Command: 255 1 98 0 0 0 0 0 157 Response: 16 136 252 75 66 50 48 48 13 CRC: 9313 CO2/t/s/u: -949 66 50 12336 Command: 255 1 65 0 0 0 0 0 190 Response: 10 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 243 0 0 0 0 0 12 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 13 0 0 0 0 0 242 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 35 0 0 0 0 0 220 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 229 0 0 0 0 0 26 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 95 0 0 0 0 0 160 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 48 0 0 0 0 0 207 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 209 0 0 0 0 0 46 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 200 0 0 0 0 0 55 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 ...
هنا Command هو ما تم إرساله إلى المستشعر (رقم الأمر نفسه هو الرقم الثالث من البداية) ، الاستجابة هي ما أجاب عنه المستشعر ، لا يمكنك النظر إلى الباقي (CRC هو المجموع الاختباري المحسوب / الفعلي ، CO2 / t / s / u هي نتيجة التفصيل استجابة المستشعر لأربعة أرقام ، كما لو كانت تستجيب لأمر "افتراضي").
كما ترون ، ليس كثيرًا. علاوة على ذلك ، من وقت ما ، رفض المستشعر تمامًا إعطاء أي شيء آخر غير الأصفار. آخر شيء حصلت عليه من المستشعر هو:
Command: 255 1 134 0 0 0 0 0 121 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 130 0 0 0 0 0 125 Response: 242 98 200 201 207 216 178 130 33 CRC: 50 33 CO2/t/s/u: -14135 207 216 -19838 Command: 255 1 134 0 0 0 0 0 121 Response: 204 91 151 80 143 212 255 255 236 CRC: 93 236 CO2/t/s/u: -26800 143 212 -1 Command: 255 1 200 0 0 0 0 0 55 Response: 181 156 252 77 79 68 66 85 83 CRC: 241 83 CO2/t/s/u: -947 79 68 16981 Command: 255 1 134 0 0 0 0 0 121 Response: 13 10 0 0 0 0 0 0 0 CRC: 246 0 CO2/t/s/u: 0 0 0 0 Command: 255 1 216 0 0 0 0 0 39 Response: 0 0 0 0 0 0 0 0 0 CRC: 0 0 CO2/t/s/u: 0 0 0 0
ثم الأصفار. حاولت إدخال الأوامر بالتتابع ، بدءًا من 0x8e - أصفار مرة أخرى. حاولت أن أعطي الأمر "القياسي" 0x86 - الأصفار. هل قتلت المستشعر؟ في الحقيقة ، جميع الشروط لهذا موجودة - أقوم بإدخال أوامر قليلة غير موثقة ، لذلك أقوم أيضًا بتوصيل واجهة المستشعر مباشرة بـ arduine بجهد 5 فولت ، على الرغم من أن ورقة البيانات تنص صراحة على أنها مصممة لـ 3.3 فولت.
بادئ ذي بدء ، جربت الوصفة القديمة الجيدة لأي enikeyshchik - أطفئها وأعد تشغيلها مرة أخرى. أي أنه أخرجها ووضعها في المستشعر بالإضافة إلى الطاقة مع عمل كل شيء آخر. أنتج المستشعر تقريبًا نفس المنتج في المقطع الأخير المقتبس (ولكن بأرقام مختلفة قليلاً). نعم ، هذا يعني أن المستشعر لم يمت تمامًا ويقول شيئًا في كل حذاء ، خمنت الدقائق.
ثم أعطيت دماغي أكثر قليلاً وخمنت حتى قبل حقيقة واحدة - تلك الأصفار التي رأيناها أعلاه ليست إجابة المستشعر على الإطلاق. في الواقع ، المستشعر صامت ، ويرسم برنامجي ما أعطته وظيفة Arduin لتلقي n بايت (على سبيل المثال الأصفار). وإذا كان في كل مرة قبل الاستقبال للتأكد من وجود شيء ما ، اتضح أنه لا يوجد شيء لقبوله. باستثناء الحالات التي تم فيها إعادة تشغيل جهاز الاستشعار للتو.
اتضح أن المستشعر توقف تمامًا عن قبول أي أوامر. على ما يبدو ، 5 فولت على الواجهة التسلسلية لم تذهب سدى. نعم ، لم يسأل المقال بطريقة أو بأخرى. شكرا لكم جميعا على اهتمامكم. نختلف ، لا يوجد شيء للنظر فيه.
أوه انتظر ...
ترى هذه الأرقام في النهاية؟
13 10
لا يشبه أي شيء؟
بالطبع ، هذا
تغذية خط قديمة جيدة! بعبارة أخرى ، 0x0D 0x0A - هذه هي الطريقة لترجمة سلسلة ، على سبيل المثال ، على Windows (وعلى Unix من الأسهل القيام بذلك - 0x0A ، لأن بعض الملفات تفقد فواصل الأسطر عند فتحها في دفتر ملاحظات Windows).
إذن ربما يريد المستشعر أن يخبرنا شيئًا بلغة بشرية؟ ومع ذلك ، إذا كانت هذه اللغة صينية ، فلن تساعدني كثيرًا. لذا دعونا نأمل أن تكون هذه لغة مفهومة أكثر ، ونفك شفرة الرسالة وفقًا لجدول
ASCII :
print reduce(lambda a, b: a + b, map(lambda a: chr(int(a)), "255 255 255 250 24 220 207 254 77 79 68 66 85 83 13 10".split())) MODBUS
تلقى ما يصل إلى ستة أحرف. وإليك ما قاله نفس المستشعر عند التحميل قبل ذلك بقليل:
print reduce(lambda a, b: a + b, map(lambda a: chr(int(a)), "96 249 2 211 215 212 17 215 204 93 151 80 143 212 255 255 255 217 16 136 252 75 66 50 48 48 13 10 ".split())) ` ] P KB200
الفرق واضح - تغير خط KB200 إلى سطر MODBUS. البقية - يبدو أنه ليس نصًا على الإطلاق ، ولا حتى الأحرف الصينية - إذا كان ذلك فقط لأن معظمها يتغير من وقت لآخر.
إذن ماذا يقول لنا المستشعر؟ بناء على طلب KB200 ، ينتج عن البحث على الإنترنت لوحة مفاتيح ، وجهاز عينات أساسي ، ومكواة ، وطاولة تغيير ، ووحدة تحكم للتحكم في كاميرات PTZ ، وخلاط ، باستثناء واحدة صلعاء. حسنًا ، ولكن ليس من الواضح كيفية تطبيق هذه المعرفة على قضيتنا. حسنًا ، دعنا نبحث عن MODBUS. هذه المرة
ويكيبيديا نفسها في خدمتنا:
Modbus هو بروتوكول اتصال مفتوح يعتمد على بنية السيد والعبد. يستخدم على نطاق واسع في الصناعة لتنظيم الاتصالات بين الأجهزة الإلكترونية. يمكن استخدامه لنقل البيانات عبر خطوط الاتصال التسلسلي RS-485 ، RS-422 ، RS-232 ، وكذلك شبكة TCP / IP (Modbus TCP).
تقترح الفرضية نفسها نفسها - بعد أحد الأوامر غير الموثقة ، تحول المستشعر إلى بروتوكول Modbus والآن يبلغنا بذلك باستخدام الطرق المتاحة. نظرًا لعدم وجود خيارات أخرى متوقعة ، سنقوم باختبار مباشر لهذه الفرضية ، أي دعونا نحاول الاتصال بالمستشعر عبر Modbus.
على الإنترنت ، تم العثور على
تطبيق Modbus لاردوينس. لكن هذا حظ سيئ - اردوينو ليوناردو غير مدعوم ، لكن لدي صدفة وحشية فقط ليوناردو.
ولكن ، كما أدركت قريبًا ، هذا حتى للأفضل. بروتوكول Modbus بسيط مثل ثلاث بنسات. وإلى جانب مشابه مؤلم للبروتوكول "الأصلي" MH-Z19. فلماذا تسحب أي أشياء سيئة من الإنترنت وتفهمها بشكل مؤلم عندما يمكنك تنفيذ كل ما تحتاجه في دقيقتين (حسنا ، ساعتان) بنفسك؟
لذا ، في وقت سابق ، طلبنا من القراءات من المجس إصدارها على النحو التالي:
0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79
أو بالأرقام العشرية:
255, 1, 134, 0, 0, 0, 0, 0, 121
حيث 255 هو الرقم السحري ، 1 هو عنوان المستشعر ، 134 هو الأمر ، 121 هو بايت المجموع الاختباري.
وكيف سيبدو في مودبوس؟ لن يكون هناك تطابق تام ، ولكن يمكنك القيام بذلك على سبيل المثال:
1, 4, 0, 0, 0, 4, 213, 197
1 - عنوان المستشعر.
4 - رقم الفريق. يمكن عد الأوامر في Modbus على الأصابع ، وحتى الآن سوف نهتم فقط باثنين منهم - 3 و 4. لأسباب مخفية في ظلام القرون ، يُطلق عليها "قراءة سجلات متعددة للتسجيل وقراءة سجلات الإدخال" ، ولكن في الواقع أنها تعطي أوامر لقراءة معين عدد الأرقام مزدوجة البايت في عنوان معين. يقرأ الأمر 3 الأرقام المتاحة للقراءة / الكتابة ، ويقرأ الأمر 4 فقط.
0 ، 0 هو العنوان الذي سنقرأه (في هذه الحالة ، 0). إذا قمت بتعيين نفس العنوان مع فريق من 3 أو 4 ، فسنحصل على نتائج مختلفة بشكل عام.
0 ، 4 - عدد الأرقام التي نريد قراءتها (في هذه الحالة 4). هناك لحظة مضحكة هنا. على الرغم من أنه يمكنك تحديد هذا الرقم حتى 65535 ، في الواقع ، يسمح لك البروتوكول بقراءة ما لا يزيد عن 125 رقمًا في المرة الواحدة. وكل ذلك لأن الاستجابة تشير إلى عدد بايتات المعلومات المرسلة ، ولا يستغرق الأمر سوى بايت واحد (والأرقام ثنائية البايت). بالإضافة إلى ذلك ، كما أفهمها ، يقتصر طول الاستجابة نفسها على 255 بايت.
213 ، 197 - بايتان من المجموع الاختباري (
CRC16 ). بشكل عام ، هذه هي أصعب لحظة في تنفيذنا بأكمله. في الحقيقة ، لم أتطرق حتى إلى كيفية النظر فيه ، ولكن ببساطة نسخ الرمز
من هنا . نظرًا لوجود بحر من CRC16s مختلفة ، يجب على المرء أن يقترب بمسؤولية من اختيار الوظيفة. يمكنك التحقق مما إذا كانت وظيفة معينة مناسبة لـ Modbus ، على سبيل المثال ،
هنا .
هذا ، في الواقع ، كل ما نحتاج إلى معرفته عن Modbus. على الأقل لبداية.
على الرغم من أنك قد خمنت منذ فترة طويلة أن نداءي إلى MH-Z19 على Modbus كان ناجحًا ، لكن دعنا نتظاهر بأن المؤامرة استمرت. حتى الآن ، لا نعرف حتى ما هو عنوان المستشعر الخاص بنا (على الرغم من أنه "في الأصل" هو 1 ، فإنه بعيد عن حقيقة أنه هو نفسه في Modbus). لذلك ، تحتاج إلى تكرار الأمر بعناوين مختلفة (ولا يوجد سوى 255 منهم) ومعرفة ما سيرد عليه جهاز الاستشعار لدينا:
... Command: 254 4 0 3 0 1 213 197 CRC: 213 197 Response: Command: 255 4 0 3 0 1 212 20 CRC: 212 20 Response: Command: 0 4 0 3 0 1 192 27 CRC: 192 27 Response: Command: 1 4 0 3 0 1 193 202 CRC: 193 202 Response: Command: 2 4 0 3 0 1 193 249 CRC: 193 249 Response: 1 132 2 194 193 Command: 3 4 0 3 0 1 192 40 CRC: 192 40 Response: Command: 4 4 0 3 0 1 193 159 CRC: 193 159 Response: ...
يبدو أن العنوان هو 2. أكرر عدة أوامر بالعنوان 2 - لا توجد إجابة. أغير العنوان إلى 1 - هناك إجابة! وبالتالي ، فإن عنوان المستشعر هو نفسه - 1.
ولماذا حصل المقطع 2 على العنوان 2؟ هنا مرة أخرى ، يزحف هندسي الشفرة. بعد إصدار الأمر ، أتحقق مما إذا كان هناك أي بايت لتلقيه. ولكن نظرًا لأنني أفعل ذلك على الفور ، لا يتوفر للمستشعر الوقت لإرسال أي شيء ، لذلك لا يقبل البرنامج استجابة المستشعر إلا في الدورة التالية. كما ترى في السجل المحدد - الرقم الأول في الإجابة هو 1 ، وهو يشير فقط إلى عنوان المستشعر. لقد تحايلت على هذه المشكلة بمجرد إضافة تأخير قدره 50 مللي ثانية قبل تلقي رد.
ضع في اعتبارك استجابة المستشعر لأمرنا:
1 132 2 194 193
1 - كما اكتشفنا بالفعل - عنوان المستشعر.
132 - رمز الأمر ورمز الخطأ. إذا لم يكن هناك خطأ ، فسيكون هذا الرقم هو نفس الأمر الذي تم إرساله - أي 4. ولكن حدث خطأ ، كما هو موضح من خلال أهم بت تم تعيينه على 1 ، لذلك أصبح الرقم 4 + 128 = 132. لذلك ، بالمناسبة ، لا يمكن أن يحتوي أمر في Modbus على رقم أكبر من 127 - لمثل هذا الأمر ، سيكون رمز النجاح هو نفسه رمز الخطأ.
2 - رمز الخطأ. يقول بالضبط ما الخطأ الذي حدث. كما تقول ويكيبيديا ، 02 - عنوان البيانات المحدد في الطلب غير متاح. لذا ، لا يوجد سمكة في هذا العنوان ولا يوجد شيء يمكن صيده. سنحاول عناوين أخرى.
194 193 - CRC16.
الآن ، أخيرًا ، حان الوقت لخدش مساحة عنوان المستشعر لفهم مكان الأسماك. فعلت ذلك ببساطة - لقد أرسلت أمرًا لقراءة رقم واحد بعنوان جديد كل 0.1 ثانية. نظرًا لأن العناوين هي 65536 ، تكتمل هذه العملية خلال ساعتين تقريبًا. النتائج بإيجاز على النحو التالي:
الأمر 1 (قراءة الملفات) - الخطأ 2 مع أي عنوان.
الأمر 2 (قراءة المدخلات المتقطعة) - مع أي خطأ في العنوان 2.
الأمر 4 (قراءة إدخال التسجيلات) - الخطأ 2 مع أي عنوان.
الفريق 3 (قراءة سجلات الملكية المتعددة) - يعطي النجاح في العناوين من 0 إلى 289.
يبدو أن أوامر كتابة القيم (على سبيل المثال ، 6) تعمل ، ولكن يبدو أن القيمة المسجلة سرعان ما تم استبدالها بما كانت عليه. لكني لم أتحقق من هذه المشكلة عن كثب.
لذا ، تضيق دائرة البحث - نحتاج إلى أرقام في الأمر 3 والعناوين من 0 إلى 289. يمكن الحصول على فكرة العالم الداخلي الغني للمستشعر من هذه السطور:
Command: 1 3 0 0 0 64 68 58 CRC: 68 58 Response: 1 3 128 0 0 0 255 0 1 0 1 0 255 0 255 0 255 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 158 124 Command: 1 3 0 64 0 64 69 238 CRC: 69 238 Response: 1 3 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 165 Command: 1 3 0 128 0 64 69 210 CRC: 69 210 Response: 1 3 128 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 73 82 0 153 0 8 0 17 0 177 0 19 0 19 0 196 0 18 0 20 0 214 0 18 0 21 0 232 0 18 0 22 0 250 0 5 0 24 0 255 0 5 0 18 1 4 0 3 0 23 1 7 0 25 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 1 0 0 0 5 0 0 0 0 0 0 0 0 0 0 137 122 Command: 1 3 0 192 0 64 68 6 CRC: 68 6 Response: 1 3 128 165 165 0 165 0 0 255 255 255 255 255 255 255 255 0 15 3 232 0 100 0 90 0 0 0 63 128 0 0 255 0 15 0 5 0 10 0 5 0 5 0 30 0 15 0 0 0 20 0 40 0 60 0 80 0 100 0 0 0 5 0 5 3 232 255 255 255 255 165 165 0 165 0 0 16 3 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 163 198
صحيح ، تم حفظ الأرقام في الأرشيف فقط إلى العنوان 255. هنا ، مرة أخرى ، 1 3 هو العنوان والأمر ، 128 هو عدد وحدات البايت المنقولة ، وحدتا بايت في النهاية هما CRC ، وكل شيء آخر هو محتويات الذاكرة.
من بين كل هذه الروعة ، من الواضح أننا مهتمون بتلك العناوين التي تتغير محتوياتها بمرور الوقت. وهنا اتضح لي المستشعر خبران لي - جيد وسيئ. جيد - هناك مثل هذه العناوين. والشر - هناك اثنان فقط - 261 و 264. قارن مع "الحياة الماضية" ، عندما أعطيت أربعة أرقام في أمر واحد في وقت واحد! لقد قمت بالفعل بتدوير شفتي - اعتقدت أنني سأحصل على جميع المتغيرات الداخلية. حسنًا ، اثنان اثنان.
حان الوقت لبناء الرسوم البيانية مرة أخرى!
القيمة في العنوان 261:

يبدو أن تركيز ثاني أكسيد الكربون. يمكن رؤيته عندما حاولت التنفس على المستشعر. صحيح أن القيمة الدنيا تكمن بشكل ملحوظ أقل من "المرجع" 400 جزء في المليون ، لذا فإن المعايرة تترك الكثير مما هو مرغوب فيه. بطريقة أو بأخرى ، يتم إعلان إحياء المستشعر.
القيمة عند 264:
تقريبًا ، على مقياس مختلف فقط ومقلوب.وكلا الكميتين على نفس الرسم البياني:
ينشأ سؤال طبيعي - ربما تكون إحدى هذه الكميات هي القيمة "الأولية" التي تأتي من ADC والتي يحولها المستشعر إلى تقدير ثاني أكسيد الكربون باستخدام طريقة الرقيق؟ إذا كان الأمر كذلك ، فإن هذا يفتح فرصًا كبيرة لإعادة معايرة وتحسين دقة المستشعر ، وربما لاستخدامه لأغراض أخرى. الجواب على هذا السؤال (وبعض الأسئلة الأخرى) سنحاول الوصول إليه في السلسلة التالية.يتم قبول التعليقات والاقتراحات - وإلا فإن السخرية من MH-Z19 في المقالة التالية. صحيح ، لن أعد بشيء.