基于Arduino MKR Fox 1200构建可靠Sigfox千瓦时电表
元器件与物料
- Arduino MKR Fox 1200 × 1
- 面包板(通用) × 1
- 跳线(通用) × 1
- CNY70反射传感器 × 1
- 电阻 221Ω × 1
- 电阻 10kΩ × 1
- 电阻 100Ω × 1
- 旋转电位器(通用) × 1
- SparkFun 12mm按钮开关 × 1
- LED(通用) × 1
应用与在线服务
- Arduino IDE
- Sigfox网络
- ThingSpeak API
项目概述
1. 核心概念
本教程助您将老式感应式电表接入互联网。此类电表最古老但仍在使用:转盘周圈涂反光漆,带一条黑色条纹。每看到黑条通过即表示转盘转一圈。本项目中,120圈对应1 kWh电量消耗。
2. 微控制器、物联网网络与其他组件
采用Arduino MKRFOX1200,内置Sigfox连接(即网络层)。Sigfox是LPWAN网络,支持万物联网。工作于ISM 868MHz频段,每日上行140条消息(每条12字节载荷)。Sigfox还允许自定义消息处理:所有消息存储于Sigfox云,可通过定义回调等方式检索。
ThingSpeak: 物联网数据可视化平台。本项目中作为Sigfox回调目标,接收数据后即时以图表展示用电量。
使用哪款电能表? 即下图所示最老式感应式电表:

3. 硬件连接
- 按接线图连接所有元件。 不展开原理说明,不明处可提问。别忘供电:USB移动电源或笔记本USB口均可。

- 编写代码。 页面底部附有代码,不明处可提问。
- 创建ThingSpeak通道与分析。 注册https://thingspeak.com/,创建通道1:命名、描述、Field 1设为Consumption。基于通道1创建通道2(名称不同),在通道2选Matlab Analysis并写入代码:
readChannelID = TYPE_CHANNEL1_ID_HERE;
readAPIKey = 'TYPE_CHANNEL1_READ_API_KEY_HERE';
writeChannelID = TYPE_CHANNEL2_ID_HERE;
writeAPIKey = 'TYPE_CHANNEL2_API_KEY_HERE';
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
analyzedData.('Consumption') = (data.('Consumption') + YOUR_CURRENT_CONSUMPTION_STATUS_IN_WH)/1000;
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
- 创建Sigfox回调。 假设您已在后台注册MKRFOX1200,跳过注册教程。登录https://backend.sigfox.com/,进入回调区创建:
- TYPE: DATA UPLINK
- CHANNEL: URL
- CUSTOM PAYLOAD CONFIG: status::uint:32:little-endian
- URL PATTERN:
https://api.thingspeak.com/update?api_key=EXPLAINED1&field1={customData#status} - USE HTTP METHOD: GET
*EXPLAINED1 替换为通道1 ThingSpeak WriteApiKey
4. 设备安装与逻辑
完成最难部分。用双面胶将CNY70传感器贴于电表玻璃上——对准转盘中心(见图Installation)。按设备按钮两次校准:传感器读反光部分时二极管亮,读黑条时灭。校准成功后再按一次按钮。设备开始读取用电量,每30分钟通过Sigfox上传一次,读取精度设为25 Wh(本例中每3圈)。

5. 最终效果
完成上述步骤后,您将在ThingSpeak看到精美的用电量图表:

代码
#include <SigFox.h>
int DIODE = 13;
int BTN = 12;
int BTN_state = 0;
int BTN_prev = 0;
int BTN_NR_OF_PRESS = 0;
int CALC = 0;
unsigned long i = 0;
uint32_t CONSUMPTION = 0;
boolean SHINE = false;
boolean 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;
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;
}
if (CALC % 3 != 0) {
KARDAN = false;
}
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();
}
}
}
}
原理图
MKRFOX1200与CNY70等元件连接原理图
制造工艺
- 智能缺水报警器 – DIY植物土壤湿度监测装置
- 意大利语单词时钟:Arduino Nano + NeoPixel 144 灯珠 + LCD + RTC 打造
- 仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值
- 蓝牙温度监测仪:Arduino Nano + NTC 热敏电阻 + HC-06 无线传输
- DIY 自动量程电容表 (10 pF – 10 μF) – Arduino Nano 简易制作
- 非接触手势门锁:APDS-9960 + Arduino 实现安全门禁
- Arduino Nano 多功能伴侣套件 —— 电阻/电容测量、二极管测试、RTC时钟一体化
- Arduino Micro/Leonardo USB MIDI 适配器套件 —— 完整元件清单与固件指南
- 为Arduino构建隔离模拟输入电路
- RGB 32 频段音频频谱可视化器:Arduino Nano 驱动 WS2812B 8×32 LED 矩阵
- 两个电阻自制 Arduino UNO 视频输出线(RCA/TVout)
- Arduino UNO 精准视觉反应时间测试仪