Arduino環境モニタリング
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 |
必要なツールとマシン
|
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
はじめに
いくつかの環境クリックセンサーが手元にあったので、それらをArduino MKR1000に接続し、WolkAbout IoTPlatformで視覚化することにしました。アイデアは、1分ごとに測定を行い、15分ごとに結果を公開することでした。センサー読み取り値の公開が失敗した場合(ネットワークの混雑またはその他の問題が原因)、結果はデバイスのフラッシュメモリに保持される必要があります。 1日に最大96回の書き込みが可能であるため、フラッシュメモリが間違った状態になる可能性を最小限に抑えます(Arduinoは10,000回の書き込みサイクルを保証します)。
ハードウェアのセットアップ
環境クリックセンサーは、I2C通信ピン(つまり、MKR1000では11と12)、Vcc、およびアースに接続されています。
<図>
ソフトウェアのセットアップ
このプロジェクトを可能にするためにいくつかのライブラリを使用しました。これらはすべて、Arduino IDEのライブラリマネージャーからインストールするか、添付ファイルにリストされているGitHubリポジトリから.zipアーカイブをダウンロードしてArduinoIDEに追加することでインストールできます。必要なライブラリは次のとおりです。
- WiFi101
- Adafruit統合センサードライバー
- AdafruitBME680ライブラリ
- RTCZero
- FlashStorage
- WolkConnect
必要なライブラリがすべてインストールされたら、先に進んで環境モニタリングの内容をコピーします。 添付ファイルからArduinoIDEにスケッチします。
循環バッファの構造を実装し、それを使用して測定結果を保存します。 FlashStorageライブラリを使用してその構造をフラッシュメモリに格納する方法の実装もあります。データの時限読み取りと公開は、RTCZeroライブラリを使用して実現されます。最初に、WiFiに接続した後、PingをWolkAbout IoT Platformに送信して、センサーの読み取り値に適切なタイムスタンプを付けることができるように、RTCライブラリに供給される現在のエポックを取得します。
アラーム割り込みは、実行する必要のあるタスク(読み取りと公開)のフラグを変更し、残りの作業はループ関数で処理されます。ここでは、読む必要があるか公開する必要があるかを確認します。消費電力を最小限に抑えるために、WiFiはMKR1000と同様に低電力モードに設定されています。環境クリックのセンサーは、読み取りが要求されるまで自動的に低電力になります。
スケッチに加える必要のある変更には、33行目と34行目にWiFiクレデンシャルを入力することが含まれます。
const char * ssid ="<* YOUR SSID *>";
const char * wifi_pass ="<* YOUR WIFI PASSWORD *>";
また、WolkAbout IoTPlatformからデバイスのクレデンシャルを入力します。
これらの資格情報を取得するには、最初にデバイスタイプを使用してデバイスを作成する必要があります。
このプロジェクトのデバイスタイプ、 Environment click-deviceType.json、 プロジェクトの添付ファイルで利用できるので、そのコピーを作成します。 WolkAbout IoT Platformにログインするか、アカウントを作成して、デバイスを開きます。 管理 アプリケーション。
<図>デバイスを選択します タイプ 管理 タブをクリックし、 + を押します。 署名して アップロードを選択します オプション、デバイスタイプのローカルコピーに移動します。
デバイスタイプが利用可能になったので、 作成をクリックしてデバイスタイプを作成できます。 デバイス 。
ここでは、デバイスに名前を付け、 接続タイプを設定する必要があります MQTT デフォルトの作成のチェックボックスをオンにします セマンティック (後でダッシュボードにウィジェットを作成するために必要です)。
保存を押します デバイスの資格情報が記載されたフォームが表示されます。この情報を好きなように保存してから、ArduinoIDEのスケッチに入力してください:
const char * device_key ="device_key";
const char * device_password ="device_password";
これで、このスケッチを確認してボードにアップロードできますが、受信したセンサーデータを表示する方法を作成する必要があります。
このデータを表示するには、 視覚化に切り替えます および監視 WolkAbout IoT Platformのセクションで、 +ダッシュボードの追加を押して新しいダッシュボードを作成します ダッシュボードの名前を入力し、スコープをデバイス名に設定します。次に、 追加を押して、ダッシュボードへのウィジェットの追加を開始できます。 ウィジェット。
<図>トレンドを選択します
<図>次に、 温度を選択します デバイスから。
<図>圧力に対してこのプロセスを繰り返します および 湿度 。タイプ Reading の別のウィジェットを作成します 高度を選択します ガス用の別のカードウィジェットを作成します 抵抗 。ウィジェットは好きなように並べ替えることができます。
デバイスから受信する予定の個々のセンサー読み取り値全体のウィジェットを追加すると、次のダッシュボードでデバイスからデータを受信できるようになります。
したがって、先に進んで、選択した環境にデバイスを展開し、状態をリモートで監視します。
<図>
結論
ArduinoMKR1000とEnvironmentClickをWolkAboutIoTプラットフォームに接続することで、リモートで監視する場所の環境条件を報告するためのエネルギー効率の高い方法を作成しました。このソリューションは、WolkAbout IoT Platformのルールエンジンを使用して拡張できます。これにより、特定の値が定義したしきい値を超えた場合に、さまざまなタイプの通知を受信できます。
ルールエンジンおよびその他のWolkAboutIoTプラットフォームの機能の詳細については、ユーザーガイドページにアクセスしてください。
コード
- 環境モニタリングスケッチ
- 環境click-deviceType.json
環境モニタリングスケッチ Arduino
このスケッチをArduinoIDEにインポートし、WiFi資格情報とデバイス資格情報を編集します#include#include #include #include #include #include #include #include "WolkConn.h" #include "MQTTClient.h" / *保存するoutbound_message_tの数* /#defineSTORAGE_SIZE 32#define SEALEVELPRESSURE_HPA(1013.25)/ *送信メッセージを永続化するための循環バッファ* / typedef struct {boolean valid;アウトバウンドメッセージ_tアウトバウンドメッセージ[STORAGE_SIZE]; uint32_tヘッド; uint32_tテール;ブール値が空です。 booleanfull;}メッセージ;静的メッセージデータ; / *接続の詳細* / constchar * ssid ="ssid"; const char * wifi_pass ="wifi_pass"; const char * device_key ="device_key"; const char * device_password ="device_password "; const char * hostname =" api-demo.wolkabout.com "; int portno =1883; WiFiClient espClient; PubSubClient client(espClient); / * WolkConnect-Arduinoコネクタコンテキスト* / static wolk_ctx_t wolk; / *フラッシュストレージの初期化* / FlashStorage(flash_store、Messages); / * i2cセンサー通信を開始します* / Adafruit_BME680bme; RTCZero rtc; bool read; / *センサーを毎分読み取ります。このパラメーターを変更する場合は、<60 * / const byte readEvery =1; bool publish; / * 10分ごとに公開するようにしてください。このパラメーターを変更する場合は、<60 * / const byte publishEvery =10; byte publishMin; / *フラッシュストレージとカスタム永続性の実装* / void _flash_store(){data.valid =true;であることを確認してください。 flash_store.write(data);} voidへの増加ポインター(uint32_t *ポインター){if((*ポインター)==(STORAGE_SIZE-1)){(*ポインター)=0; } else {(*ポインタ)++; }} void _init(){data =flash_store.read(); if(data.valid ==false){data.head =0; data.tail =0; data.empty =true; data.full =false; }} bool _push(outbound_message_t * Outbound_message){if(data.full){increase_pointer(&data.head); } memcpy(&data.outbound_messages [data.tail]、outbound_message、sizeof(outbound_message_t));増加ポインタ(&data.tail); data.empty =false; data.full =(data.tail ==data.head); trueを返します;} bool _peek(outbound_message_t * Outbound_message){memcpy(outbound_message、&data.outbound_messages [data.head]、sizeof(outbound_message_t)); trueを返します;} bool _pop(outbound_message_t * Outbound_message){memcpy(outbound_message、&data.outbound_messages [data.head]、sizeof(outbound_message_t));増加ポインタ(&data.head); data.full =false; data.empty =(data.tail ==data.head); return true;} bool _is_empty(){return data.empty;} void init_wifi(){if(WiFi.status()!=WL_CONNECTED){while(WiFi.begin(ssid、wifi_pass)!=WL_CONNECTED){delay(1000 ); }}} void setup_wifi(){delay(10); if(WiFi.status()!=WL_CONNECTED){int numAttempts =0; while(WiFi.begin(ssid、wifi_pass)!=WL_CONNECTED){numAttempts ++; if(numAttempts ==10){Serial.println( "WiFiに到達できませんでした!");壊す; } delay(1000); }}} void setup(){pinMode(LED_BUILTIN、OUTPUT); digitalWrite(LED_BUILTIN、LOW); / *循環バッファ構造を初期化します* / _ init(); init_wifi(); wolk_init(&wolk、NULL、NULL、NULL、NULL、device_key、device_password、&client、hostname、portno、PROTOCOL_JSON_SINGLE、NULL、NULL); wolk_init_custom_persistence(&wolk、_push、_peek、_pop、_is_empty); / *問題が発生した場合にオンボードLEDが点灯します* / if(!bme.begin()){digitalWrite(LED_BUILTIN、HIGH); } / *センサーの初期化* / bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320、150); // 320 * C、150ミリ秒delay(200);読み取り=true;公開=true; / *サーバーから現在のエポックを取得します* / wolk_connect(&wolk); delay(100); wolk_update_epoch(&wolk); while(!(wolk.pong_received)){wolk_process(&wolk); digitalWrite(LED_BUILTIN、HIGH); delay(1000); } digitalWrite(LED_BUILTIN、LOW); wolk_disconnect(&wolk); rtc.begin(); rtc.setEpoch(wolk.epoch_time); rtc.setAlarmTime(rtc.getHours()、(rtc.getMinutes()+ readEvery)%60、rtc.getSeconds()); rtc.enableAlarm(rtc.MATCH_MMSS); rtc.attachInterrupt(alarmMatch); publishMin =(rtc.getMinutes()+ publishEvery)%60; WiFi.lowPowerMode();} void loop(){/ *割り込みルーチンを可能な限り短くするために、ルーチンは実行するタスクのみを設定しますread =trueは、センサーの読み取りを実行する必要があることを意味しますpublish =trueは、読み取り値はプラットフォームに公開するか、接続が利用できない場合はフラッシュに保持する必要があります* / if(read){read =false; if(!bme.performReading()){digitalWrite(LED_BUILTIN、HIGH); } wolk_add_numeric_sensor_reading(&wolk、 "T"、bme.temperature、rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk、 "H"、bme.humidity、rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk、 "P"、bme.pressure / 100.0、rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk、 "GR"、bme.gas_resistance、rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk、 "A"、bme.readAltitude(SEALEVELPRESSURE_HPA)、rtc.getEpoch()); / *新しいアラームを設定* / int alarmMin =(rtc.getMinutes()+ readEvery)%60; rtc.setAlarmMinutes(alarmMin); delay(100); } if(publish){publish =false; setup_wifi(); wolk_connect(&wolk); if(!wolk.is_connected){_ flash_store(); } delay(100); if(wolk_publish(&wolk)==W_TRUE){_ flash_store(); } / *新しい公開時間を設定* / publishMin =(rtc.getMinutes()+ publishEvery)%60; delay(100); wolk_disconnect(&wolk); delay(100); } delay(100); } / *時限割り込みルーチン* / voidalarmMatch(){read =true; if(publishMin ==rtc.getMinutes()){publish =true; }}
環境click-deviceType.json JSON
WolkAbout IoTPlatformでデバイスを作成するために使用されるデバイスタイプ[{"name": "Environment click"、 "description": "MikroElektronikaのボード上のBME680センサーのデバイスタイプEnvironment Click"、 "guid": " def68ff6-63c5-4f9c-a066-bcc944b7bd2d "、" deviceType ":" STANDARD "、" protocol ":" JSON "、" connectivityType ":null、" firmwareUpdateType ":null、" feeds ":[{" name ":"温度 "、"説明 ":null、"参照 ":" T "、"単位 ":{"名前 ":" CELSIUS "、"ガイド ":" 7c805d10-a879-11e9-83cd-0a0027000005 "}}、{" name ":" Humidity "、" description ":null、" reference ":" H "、" unit ":{" name ":" HUMIDITY_PERCENT "、" guid ":" 7c8080a3-a879-11e9-83cd-0a0027000005 "} }、{"name": "Pressure"、 "description":null、 "reference": "P"、 "unit":{"name": "MILLIBAR"、 "guid": "7c807980-a879-11e9-83cd -0a0027000005 " }}、{"name": "Gas Resistance"、 "description":null、 "reference": "GR"、 "unit":{"name": "OHM"、 "guid": "7c805890-a879-11e9 -83cd-0a0027000005 "}}、{" name ":" Altitude "、" description ":null、" reference ":" A "、" unit ":{" name ":" METRE "、" guid ":" 7c805a59 -a879-11e9-83cd-0a0027000005 "}}]、" actuators ":[]、" alarms ":[]、" configs ":[]、" attributes ":[{" name ":" CONNECTIVITY_TYPE "、" dataType ":" ENUM "、" validationRegex ":" ^(MQTT | HTTP)$ "、" options ":[" MQTT "、" HTTP "]、" defaultValue ":" MQTT "、" required ":true、" readOnly ":true}、{" name ":" FIRMWARE_UPDATE_ENABLED "、" dataType ":" BOOLEAN "、" validationRegex ":" ^(true | false)$ "、" options ":null、" defaultValue ":null、"必須":false、" readOnly ":true }、{"name": "FIRMWARE_VERSION"、 "dataType": "STRING"、 "validationRegex":null、 "options":null、 "defaultValue":null、 "required":false、 "readOnly":true}、 {"name": "FILE_DIRECT_DOWNLOAD_ENABLED"、 "dataType": "BOOLEAN"、 "validationRegex": "^(true | false)$"、 "options":null、 "defaultValue":null、 "required":false、 " readOnly ":true}、{" name ":" FILE_URL_DOWNLOAD_ENABLED "、" dataType ":" BOOLEAN "、" validationRegex ":" ^(true | false)$ "、" options ":null、" defaultValue ":null、"必須」:false、「readOnly」:true}]}]
WolkAbout環境モニタリング
このリポジトリには、このプロジェクトで使用されているArduinoスケッチが含まれていますhttps://github.com/Wolkabout/Wolk-Arduino-Environment-MonitoringArduino WiFi101シールド
Arduino WiFi101シールド用のWifiライブラリhttps://github.com/arduino-libraries/WiFi101Adafruit統合センサードライバー
すべてのセンサーに必要な統合センサーライブラリhttps://github.com/adafruit/Adafruit_SensorAdafruitBME680ライブラリ
環境に使用されるライブラリクリックしてセンサーの読み取り値を取得https://github.com/adafruit/Adafruit_BME680Arduino用RTCライブラリ
SAMD21ベースのボード用のRTCライブラリhttps://github.com/arduino-libraries/RTCZeroArduino用のFlashStorageライブラリ
ATSAMD21のフラッシュメモリにデータを保存する便利な方法https://github.com/cmaglie/FlashStorageWolkConnect-Arduino
WolkAboutIoTプラットフォームへの簡単な接続を提供するArduinoライブラリ。https://github.com/Wolkabout/WolkConnect-Arduino 回路図
製造プロセス