CO2センサヌにBlynkを䜿甚した実際の経隓。 パヌト1

みなさんこんにちは。 これは、カテゎリESP8266 + Blynk = ♡の別の蚘事です。 広告ずしおではなく、Blynkプラットフォヌムの開発者ぞのオマヌゞュず、私以倖の誰かに圹立぀かもしれない個人的な経隓ずしおのみずっおください。



開始する



このプロゞェクトのアむデアは、アリに察するDYIの熱意の䞭で、 MQ-135空気質センサヌが賌入された数幎前に生たれたした。 仕様によるず、このセンサヌは空気䞭のNH3、​​NOx、アルコヌル、ガ゜リン、煙、CO2などの物質の存圚に反応し、アナログ出力で空気の質を掚定したす[はい、チュヌニング抵抗ずキャリブレヌション方法があるこずを知っおいたすが、耇雑すぎる]。



テストでは、センサヌがあらゆる皮類の有害な「臭い」化合物に完党に反応し、出力レベルがかなり急激に倉化するこずが瀺されおいたす。 状況は、目に芋えない敵、぀たり二酞化炭玠CO2の定矩により悪化したした。 この二酞化物の害ず明癜な遍圚に぀いお倚くのこずが蚀われおいたすが、繰り返しはしたせん。









したがっお、私にずっお、MQ-135センサヌは圹に立たないこずが刀明したした。なぜなら、人が混雑しおいる郚屋ず新鮮な空気の空気の質の倧きな違いに「気付かない」からです。 しかし、呌び出しはすでに受け入れられおいたので、数回のむタレヌションの埌、 MH-Z19 IRセンサヌを備えたOpenWindAirボヌドの最埌の珟圚のバヌゞョンが誕生したした [完璧ではない、はい]。 結果のハヌドりェアずそのハヌドりェア機胜の詳现に぀いおは、蚘事ESPのデヌタ収集システムをご芧ください。 パヌトI



䜏宅の建物の二酞化炭玠のレベルを枬定するタスクでは、センサヌは理想的で最適な゜リュヌションであるこずが刀明したした配達付きアリで1200ルヌブル。



Blynk-鉄、クラりド、電話の接続を支揎



Blynkプラットフォヌムに぀いおは、たずえばここで既に倚くの良いこずが蚀われおいたす 。 プラットフォヌムの機胜は、その思慮深さず䜿いやすさに驚くばかりです。 そのため、ESP8266の開発環境を遞択しおプログラムを䜜成するずきが来たずき、遞択はすぐにArduino IDEずBlynkラむブラリに委ねられたした。



テストスケッチBlynkSimpleEsp8266を実行しおも、問題は発生したせんでした。 ただし、機胜がより耇雑になり、機胜が匷化されるに぀れお、いく぀かの困難に盎面する必芁がありたした。これに぀いお詳しく説明したいず思いたす。









゜フトりェアアヌキテクチャ



Arduino IDE環境でESP8266甚の゜フトりェアを開発する䞻な利点は、1぀のスケッチでたったく異なるラむブラリを組み合わせるこずができ、ほずんど䜕も持たないこずです。



TKが開発される前は、論文が策定され、次の点が含たれおいたした。



1. CO2センサヌMH-Z19を䞀定の間隔で読み取り、3぀の緑、黄、赀LEDを䜿甚しお結果を衚瀺する必芁がありたす。 制限は、 GOST 30494-2011 䜏宅および公共の建物。郚屋の埮気候パラメヌタをほが考慮しお遞択されたした。最倧900 PPM-緑、901〜1400 PPM- 黄色 、1401 PPM- 赀を超えおいたす。 たた、ビヌプ音のしきい倀が1100 PPMに蚭定されおいるビヌプ音もありたすが、Blynkで完党に蚭定たたは無効化できたす。 デバッグ䞭に、MH-Z19が実際に枬定される代わりに、グリッチしお最倧倀蚭定された制限に応じお1000、2000、3000たたは5000 PPMを䞎えるこずがあるこずが刀明したした。 これにより、結果の凊理がやや耇雑になり、ナヌザヌぞの誀ったメッセヌゞに぀ながる可胜性があり、ナヌザヌの神経を保護する必芁がありたす。 たた、誀っお枬定された2000 PPM居䜏区の野生倀を、ナヌザヌが座っおセンサヌに吞い蟌んだずきの状況から区別するための絶察的に正しい耇数の枬定を陀く方法はありたせん。 この問題をカモフラヌゞュするために2぀の手段が取られたした枬定限界は2000 PPMに蚭定されデバむスは䜏宅の敷地内で䜿甚され、1400を超えるものはすべおレッドゟヌンであるず想定されたす、最埌の10の枬定結果の平均が远加されたした。 その結果、単䞀の誀怜知2000 PPMでは、平均グラフに倧きなサヌゞは発生したせん。 ただし、必芁に応じお、Blynkを䜿甚しおセンサヌの枬定制限を調敎し、実際の平均CO2倀ではないを確認できたす。



2. Adafruit DHTセンサヌラむブラリを䜿甚しお、枩床/湿床センサヌ AM2302 を操䜜したした。 2぀の小さな倉曎が行われたしたAM2302の再読み取りの远加最初に読み取られない堎合がありたすおよび枩床ず湿床の倀の補正係数が導入されたした。 内蔵センサヌを䜿甚する堎合、倖郚センサヌゞャンパヌで遞択を䜿甚する堎合、デバむス内郚の空気は倖郚より15「也燥」し、倖郚より2°C1°F暖かくなるこずが実隓的に確立されおいたす-枬定結果を修正しないでください無効にするこずができたす。



3.ナヌザヌは、远加の゜フトりェアやフラッシュなしで、デバむスを構成WiFiぞの接続、認蚌トヌクンの指定などできる必芁がありたす。 最も最適な゜リュヌションは、 WiFiManagerラむブラリを䜿甚するこずでした 。これにより、ESPがアクセスポむントモヌドになり、 Captiveポヌタルを介しおWiFi蚭定やその他のパラメヌタヌをUSBフラッシュドラむブに保存できたす。









将来的には、起動時に、ラむブラリは保存されたWiFiポむントぞの接続を詊み、障害が発生した堎合、アクセスポむントずキャプティブポヌタルモヌドに戻りたす。 たた、ナヌザヌが突然Blynkを䜿甚したくない堎合、たたはWiFiルヌタヌがない堎合、OpenWindAirは起動せず、APモヌドでのみ起動し、タむムアりトで再起動したす。



この絶望的な状況から抜け出す方法は、BlynkたたはMQTTサヌバヌに接続するためのれロ以倖の蚭定がただある堎合、開始時に接続ず再起動を詊みたす。



if (!wifiManager.autoConnect("OpenWind - tap to config")){ if (mqtt_server[0] != '\0' || blynk_token[0] != '\0'){ Serial.println("Failed to go online for Blynk and MQTT, restarting.."); ESP.restart(); } else{ Serial.println("Failed to go online, offline mode activated"); online = false; }
      
      







4. Blynkにはむンタヌネット接続が必芁ですサヌバヌがロヌカルでない堎合。したがっお、WiFi接続の可甚性を制埡する必芁がありたす。 珟時点でWiFiManagerラむブラリはWiFiに再接続できず、アパヌト内のラむトが「点滅」しおルヌタヌが再起動した堎合、再起動するだけでESP8266をWiFiに埩元できたす。 そのため、60秒連続しお接続しないずデバむスが再起動する単玔なタむマヌを远加する必芁がありたした。



 if (WiFi.status() != WL_CONNECTED && online){ if (!wifilost_flag){ wifilost_timer_start = uptime; wifilost_flag = true; } if (((uptime - wifilost_timer_start) > wifilost_timer_max) && wifilost_flag){ Serial.print("\n\rWiFi connection lost, restarting.."); wifilost_flag = false; ESP.restart(); } }
      
      





5. Blynkを䜿甚する代わりに、ナヌザヌはMQTTプロトコルを介しお蚌蚀をPeople's Monitoringサヌバヌたたは他の同様のサヌビスに送信するこずを遞択できたす。 これらの目的のために、 PubSubClientラむブラリが遞択されたした。このラむブラリは、最も理解しやすいC蚀語で曞かれおおり、明確な䟋を持っおいる唯䞀のArduino IDEディレクトリにあるものからです。



6.頻繁ではなく、それほど耇雑ではありたせんが特に組み蟌みCP2102を䜿甚 、デバむスをフラッシュしたすが、このプロセスを可胜な限り単玔化したいず思っおいたす。 ArduinoOTAラむブラリを䜿甚するず、新しいバむナリを簡単にダりンロヌドしおフラッシュできたす。 OTAは、デバむスのボタンたたは電話を介しおリモヌトでアクティブ化できたす。 ただし、いく぀かの驚きがありたしたが、異なるファむルシステムサむズSPIFFSのESP8266-12Eモゞュヌルを賌入したこずがわかりたした。



Flash









ESP8266-12Eの倖郚的に区別できないモゞュヌルは、サむズが1 MBたたは3 MBのファむルシステムを持぀こずができ、異なるファヌムりェアArduino IDEのビルドオプションが必芁です。 したがっお、起こりうる問題を回避するために、ロヌド時に実際のメモリサむズを確認し、OTAアップグレヌド時にサヌバヌ䞊の適切なバむナリを芁求する必芁がありたすただ実行されおいたせん。 たたは、少し簡単な方法で1 MBの小さい公称倀でSPIFFSのすべおのファヌムりェアを収集できたす。これらは、倧量のメモリを搭茉したESP8266-12Eで動䜜するためです。



このようなチェックのために、SDKにはIDEで実際のメモリず遞択されたメモリのサむズを決定できる䟿利な機胜がありたす。



 String realSize = String(ESP.getFlashChipRealSize()); String ideSize = String(ESP.getFlashChipSize()); bool flashCorrectlyConfigured = realSize.equals(ideSize); if(flashCorrectlyConfigured){ Serial.println("flash correctly configured, SPIFFS starts, IDE size: " + ideSize + ", match real size: " + realSize); } else{ Serial.println("flash incorrectly configured, SPIFFS cannot start, IDE size: " + ideSize + ", real size: " + realSize); }
      
      





7.異なる゜フトりェアバヌゞョンで混乱しないように、たたそれらを盞互に区別しないように、Arduino IDEのarduino-1.8.5 \ hardware \ platform.txtファむルをわずかに曞き換えお、コンパむル䞭にbatファむルを起動し、珟圚のスケッチのコピヌを䜜成したす結果のバむナリ、およびバヌゞョン番号も自動的にむンクリメントしたす。



 recipe.hooks.sketch.prebuild.0.pattern=D:\arduino-1.8.5\hardware\increment.bat {build.path} {build.source.path} {build.project_name}
      
      





したがっお、各アセンブリ/ファヌムりェアの埌に、バむナリで配線されたバヌゞョン番号ず同じ番号のスケッチのコピヌがありたす。 たた、スケッチのあるフォルダヌをDropboxに入れるず、その堎しのぎのバヌゞョン管理システムが埗られたす。



Arduino IDEおよびbatファむルの自動むンクリメントバヌゞョンを蚭定する手順は、githubに投皿されおいたす。



8.組み蟌みのUSB-UARTアダプタヌがあるためWindowsおよびLinuxのCP2102のドラむバヌに問題はありたせん、タヌミナル9600の速床を介しお枬定結果の出力を远加しないこずは䞍可胜でした。 20秒に1回、枬定結果ず゚ラヌメッセヌゞが衚瀺されたす。



Reading MHZ19 sensor: ok

Reading DHT22 sensor: ok

===================================================



Humidity: 36.20%

Temperature: 27.20C \ 83.56F

C02: 1153 ppm

C02 average: 462 ppm

ADC: 99

UpTime: 0 days, 0 hours, 3 minutes, 45 seconds.

Time: 16:25:56 20/3/2018

===================================================








Enterボタンを抌すず、システム情報を含むメッセヌゞを取埗できたす。

======SYSTEM-STATUS================================

Device name: OpenWindAir

Software version: 0.1.235

FreeHeap: 33824

ChipId: 13704617

FlashChipId: 1405167

FlashChipSize: 4194304

FlashChipSpeed: 40000000

CycleCount: 2204474679

Time: 16:27:6 20/3/2018

UpTime: 295

======BLYNK-STATUS=================================

Blynk token: 65a99f9e363a421c8b22d5b0162cce27

Blynk connected: 1

Notify level: 1100

Beep: 1

CO2 limit: 2000

Temperature correction: 1

======NETWORK-STATUS===============================

WiFi network: adakta2

WiFi status: 3

RSSI: -70

MAC: 18FE34D11DA9

IP: 192.168.0.152

Online: 1

======MQTT-STATUS==================================

MQTT server:narodmon.ru

MQTT port:1883

MQTT login:login

MQTT key:key

MQTT topics:

/OpenWindAir/h

/OpenWindAir/t

/OpenWindAir/f

/OpenWindAir/ppm

/OpenWindAir/status

======END-of-STATUS================================








最も䞍快な問題



開発䞭に盎面しなければならなかった最も䞍愉快なこずは、枬定結果をMQTTサヌバヌずBlynkに送信しおいるずきに、デヌタの䞀郚が倱われ、サヌバヌに到達しない堎合です。 刀明したように、MQTTサヌバヌに接続しおデヌタを送信するのに数秒かかる堎合があり、この間にBlynkラむブラリはサヌバヌずの接続を倱い、その結果、サヌバヌぞの再接続を手動で開始しないず、倚くの時間ず結果の䞀郚がかかる枬定倀が倱われたす。 WiFiクラむアント_blynkWifiClientのステヌタスのチェックを远加し、接続がない堎合は、匷制停止_blynkWifiClient.stopを実行しおから、Blynkサヌバヌに再接続する必芁がありたした。



 if (WiFi.status() == WL_CONNECTED){ wifilost_flag = false; if (blynk_token[0] != '\0'){ if (Blynk.connected() && _blynkWifiClient.connected()){ Blynk.run(); } else{ Serial.print("\n\rReconnecting to blynk.. "); Serial.print(Blynk.connected()); if (!_blynkWifiClient.connected()){ _blynkWifiClient.stop(); Return _blynkWifiClient.connect(BLYNK_DEFAULT_DOMAIN, BLYNK_DEFAULT_PORT); } Blynk.connect(4000); Serial.print(Blynk.connected()); } }
      
      





おわりに



これは私の最初の蚘事ですが、Habréぞの登録から7幎が経過したした。 非垞に厳しく刀断せず、govnokodに泚意を払っおはいけたせん。govnokodは、これたでのずころ私が話す唯䞀のプログラミング蚀語です。



githubのリポゞトリにあるプロゞェクト党䜓を知るこずができたす。



CO2センサヌが存圚しおも、私および私の家族が再び息苊しい郚屋にいるこずはできたせん。 しかし、最も重芁なこずは、圌は、前者を支持しお、暑い人ず吹いおいる人私でしたのキャンプ間の氞遠の戊争を止めたした。



次に、Qlyコヌドがスキャンされ、Blynkアプリケヌション AppSore 、 Android を䜿甚しお、過去3か月間に私の堎所にどんな埮気候があったかを調べるこずができたす。



プロゞェクトは機胜しおいたす。䜕も壊さないでください。



All Articles