MKR FOX 1200を使った電池駆動の気象観測ステーションの構築
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino MKR Fox 1200 | 1 |
| SparkFun Atmospheric Sensor Breakout - BME280 | 1 |
| TSL2561 デジタル光度センサー | 1 |
| HTU21D 湿度・温度センサー | 1 |
使用するアプリとオンラインサービス
- Arduino Web Editor
- ThingSpeak API
- Sigfox
プロジェクト概要
注意: このチュートリアルは古い可能性があります。最新版はこちらを参照してください。
このプロジェクトでは、MKR FOX 1200と複数のI2Cセンサーを組み合わせて、シンプルな電池駆動の気象観測ステーションを作成します。
使用するセンサー
- オンボード温度センサー(低精度、±1°C)
- HTU21D I2Cセンサー(湿度測定用)
- Bosch BMP280(気圧と高精度温度測定用)
- TSL2561 光センサー(照度測定用)
ハードウェアセットアップ
ハードウェア接続は非常にシンプルです。すべてのセンサーはI2Cインターフェースを使用し、3.3Vで動作します。
MKR FOX 1200から必要な配線は4本のみです:GND、3.3V、SDA(ピン11)、SCL(ピン12)。各センサーは固有のI2Cアドレスを持つため、同じ4本の配線を並列に共有できます。関連ライブラリと関数がそれぞれを識別してくれます。
プロジェクト全体は、直列に接続した単3または単4アルカリ電池2本(3V)で駆動でき、基板上のネジ端子ブロックに接続します。
Sigfoxメッセージの最適化
Sigfoxネットワークは1日最大140メッセージまで送信可能です。データをコンパクトなバイナリ形式で送信するために読み取りを最適化します。
データのパッキングは重要です。送信可能な最大メッセージサイズは12バイトです。float型は4バイトを占有するため、読み取り値をより小さな表現にパックする必要があります。
float形式は非常に広い範囲(3.402823e+38まで)を表現できますが、その全データ空間は不要です。設置場所に基づいた安全な範囲を決定し、バックエンドで元の表現に復元します。
クラウドサービスの設定
2つのクラウドサービスを使用します:
- Sigfoxバックエンド
- ThingSpeak
FirstConfigurationの例で提供されるPACとIDを使用して、ボードをSigfoxバックエンドに登録します(以前のプロジェクトで既に行っている場合はスキップ可能)。
両サービスを相互に通信できるよう設定し、データを正しい形式で解釈させます。両方に登録し、ThingSpeakでいくつかのチャンネルを作成します。設定内容は以下の画像を参照してください。

最初に設定するチャンネルは生データを受信するもの(readChannelID)、2つ目は再スケーリングされたデータを収集するもの(writeChannelID)です。
Arduino Create Editorを使用してスケッチをアップロードします。デフォルトのスケッチでは、フィールド展開前にすべてのインフラストラクチャを広範囲にテストできます。
バックエンドインフラのセットアップが正しいと確信したら、以下を宣言してください:
oneshot = false
スケッチはシリアルポートを待機するため、すぐに起動しません。代わりにSigfoxバックエンドを開き、コールバックを設定します:
- DEVICE TYPE → LIST → ボードを右クリック → Edit
- 左側メニューのCALLBACKSをクリック
- 右上のNewボタンをクリック
- Custom callbackを選択
関連設定は以下の通りです。コールバックを以下のように設定してください:
- TYPE:
DATA/UPLINK - Channel:
URL - Http method:
GET
Custom Payloadとして設定:
status::uint:8 temp1::int:16:little-endian temp2::int:16:little-endian press::uint:16:little-endian hum::uint:16:little-endian light::uint:16:little-endian lastMsg::uint:8
これはスケッチでパックした構造を表します。各フィールドに変数を割り当て、HTTPコールバックで参照できるようにします。
URL Patternとして設定:
https://api.thingspeak.com/update?api_key=XXXXXXXXXXXX&field1={customData#temp1}&field2={customData#press}&field3={customData#temp2}&field4={customData#hum}&field5={customData#light}&field6={customData#status}&field7={customData#lastMsg}
設定完了後、ウィンドウは以下のようになります:

api_keyを、ThingSpeakでChannel1のWrite API Keyとして提供されるものに変更してください。

保存して終了。シリアルポートを開き、最初のメッセージ送信を観察できます。
生データからグラフへ
設定したルートでデータがThingSpeakバックエンドに送られますが、まだ生データ形式です。ThingSpeakの分析ツールを使用して以下のスニペットで変換します:
% TODO - データ読み取り用チャンネルIDに置き換え: readChannelID = [];
% TODO - Read API Keyを以下に入力: readAPIKey = 'T6UK7XO6A4H2AGT7';
% TODO - データ書き込み用チャンネルIDに置き換え: writeChannelID = [];
% TODO - Write API Keyを以下に入力: writeAPIKey = 'XU4TGY261P6B5USN';
%% データ読み取り %%
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% データ分析 %%
INT16_t_MAX = 32767;
UINT16_t_MAX = 65536;
analyzedData.('Temperature1') = data.('Temperature1') / INT16_t_MAX * 120 ;
analyzedData.('Temperature2') = data.('Temperature2') / INT16_t_MAX * 120 ;
analyzedData.('Pressure') = data.('Pressure') / UINT16_t_MAX * 200000 ;
analyzedData.('Light') = data.('Light') / UINT16_t_MAX * 100000 ;
analyzedData.('Humidity') = data.('Humidity') / UINT16_t_MAX * 110 ;
%% データ書き込み %%
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% アクションのスケジュール: React → 10分ごと
独自のチャンネルIDに置き換えることで、生データを実際の値に変換できます。Reactを使用して10分ごとに分析アクションをスケジュールすることを忘れずに、そうしないと実行されません!



ついに美しいグラフが完成しました。


コード
WeatherMonitor
完全なコードはArduino Web Editorで確認できます。
製造プロセス
- Raspberry Piで気象観測ステーションを構築し、日次天気データをメール送信
- Weather Monitor:Raspberry Pi自作気象ステーション+Dropboxアップロード
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- K30 CO2センサで室内空気質をリアルタイム監視する
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- コンパクト気象ステーション:Arduino Nano & ESP8266 + BMP280 + OLED/Nokia LCD
- デジタル身長計の自作:Arduino Nanoとレーザー距離センサーで成長記録
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- ESP32で作るIoT環境モニター:温湿度・気圧・CO2をWebダッシュボードで可視化
- シャープGP2Y1010AU0Fセンサーで作る高精度空気質モニター
- Arduino Nano製ウェザーステーション:気圧・温湿度・UV・時計表示付き