Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino MKR Fox 1200 | 1 | Sigfox通信モジュール内蔵 |
| ブレッドボード | 1 | |
| ジャンパーワイヤー | 1式 | |
| CNY70 反射型フォトセンサー | 1 | メーターの回転円盤検出用 |
| 抵抗 221Ω | 1 | CNY70 LED側 |
| 抵抗 10kΩ | 1 | CNY70 トランジスタ側プルアップ |
| 抵抗 100Ω | 1 | ステータスLED用 |
| 可変抵抗器 | 1 | センサー感度調整用 |
| プッシュスイッチ 12mm | 1 | 操作ボタン |
| LED(汎用) | 1 | ステータス表示用 |
使用ソフトウェア・サービス
- Arduino IDE
- Sigfox クラウド(バックエンド)
- ThingSpeak API(データ可視化)
このプロジェクトについて
1. 概要
このチュートリアルでは、古い誘導式電力メーターをインターネットに接続するデバイスを作ります。対象は最も古いタイプながら今も使われている、回転円盤(アルミ製)のあるメーターです。円盤の周囲に反射塗料が塗られ、一部分に黒い線があります。この黒い線が通過するたびに1回転とみなされ、このプロジェクトでは120回転=1kWhとして計算します。
2. 使用マイコン・IoTネットワーク
Arduino MKRFOX1200を使用します。内蔵のSigfoxモジュールでLPWAN(低電力広域ネットワーク)に接続します。SigfoxはISMバンド(868MHz)を使用し、1日あたり最大140メッセージ(ペイロード12バイト)をアップリンクできます。メッセージはSigfoxクラウドに蓄積され、コールバック機能で任意のエンドポイント(ThingSpeak等)へ転送可能です。
ThingSpeak: IoTデータ可視化プラットフォーム。Sigfoxのコールバック先として受信データをグラフ表示します。

対象メーターはこのタイプです(回転円盤に黒ストライプがあるもの)。
3. 実装手順
- 配線: 回路図通りに全パーツを接続。電源はUSBモバイルバッテリーやPCのUSBポートでOK。
- コード書き込み: ページ下部のコードをArduino IDEで書き込み。
- ThingSpeakチャネル作成:
- ThingSpeakでアカウント登録
- チャネル1作成:フィールド1を「Consumption(消費量)」に設定
- チャネル2作成:チャネル1ベースでMATLAB Analysisを有効化、以下のコードを設定
readChannelID = チャネル1のID; readAPIKey = 'チャネル1のRead API Key'; writeChannelID = チャネル2のID; writeAPIKey = 'チャネル2のWrite API Key'; data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table'); analyzedData = data; analyzedData.('Consumption') = (data.('Consumption') + 現在の積算値_Wh)/1000; thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey); - Sigfoxコールバック設定:
- Sigfoxバックエンドにログイン
- コールバック追加:
- TYPE: DATA UPLINK
- CHANNEL: URL
- CUSTOM PAYLOAD CONFIG:
status::uint:32:little-endian - URL PATTERN:
https://api.thingspeak.com/update?api_key=チャネル1のWriteAPIKey&field1={customData#status} - HTTP METHOD: GET

4. デバイス設置とロジック

CNY70センサーをメーターのガラス面に両面テープで固定。円盤の中心に合わせます。デバイスのボタンを2回押すとキャリブレーションモードになり、反射部でLED点灯、黒線で消灯すれば正常。さらに1回押すと測定開始。30分ごとに消費電力量をSigfoxで送信。分解能は25Wh(3回転ごと)です。
5. 最終的な出力

以上で、ThingSpeakの美しいグラフでリアルタイムに電力消費量を確認できるようになります。
コード
#include <SigFox.h>
int DIODE = 13;
int BTN = 12;
int BTN_state = 0, BTN_prev = 0, BTN_NR_OF_PRESS = 0;
int CALC = 0;
unsigned long i = 0;
uint32_t CONSUMPTION = 0;
boolean SHINE = false, KARDAN = false;
void setup() {
pinMode(DIODE, OUTPUT);
pinMode(BTN, INPUT);
Serial.begin(9600);
if (!SigFox.begin()) Serial.println("Sigfox module unavailable.");
}
void loop() {
int senzor = analogRead(A3);
BTN_state = digitalRead(BTN);
if (BTN_state != BTN_prev) {
if (BTN_state == HIGH) BTN_NR_OF_PRESS++;
}
BTN_prev = BTN_state;
// キャリブレーションモード(ボタン3回押しで終了)
if (BTN_NR_OF_PRESS % 3 == 0) {
if (senzor > 300 && senzor < 950) digitalWrite(DIODE, HIGH);
else digitalWrite(DIODE, LOW);
}
// 回転検出ロジック
if (senzor < 1020 && SHINE == false) SHINE = true;
if (senzor > 1020 && SHINE == true && BTN_NR_OF_PRESS == 4) {
CALC++; SHINE = false;
}
if (CALC % 3 == 0 && CALC != 0 && KARDAN == false) {
KARDAN = true; CONSUMPTION += 25; // 25Wh加算
}
if (CALC % 3 != 0) KARDAN = false;
// 30分ごと送信(ボタン4回押しで送信モード)
if (BTN_NR_OF_PRESS % 4 == 0) {
digitalWrite(DIODE, LOW);
if (SHINE == false) {
for (millis(); (millis() - i) > 1800000; ) {
i = millis();
SigFox.debug();
SigFox.beginPacket();
SigFox.write(CONSUMPTION);
SigFox.endPacket();
}
}
}
}
回路図

製造プロセス
- スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- アナログ3ピンで4×3キーパッドを接続 - Arduinoピン節約テクニック
- Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
- 自動レンジ切替対応 静電容量メーター (10pF〜10µF) - Arduino Nano で簡単自作
- 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
- Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
- Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保
- RGB 32バンド オーディオスペクトラムビジュアライザー - Arduino LEDマトリックスプロジェクト
- Arduino UNOで作る精密反応速度テスター