아두이노 MKR Fox 1200으로 신뢰성 높은 시그폭스 kWh 미터 만들기
부품 및 소모품
| 부품 | 수량 |
| 아두이노 MKR Fox 1200 | 1 |
| 브레드보드 | 1 |
| 점퍼 와이어 | 1 |
| CNY70 반사형 광센서 | 1 |
| 221Ω 저항 | 1 |
| 10kΩ 저항 | 1 |
| 100Ω 저항 | 1 |
| 로터리 포텐셔미터 | 1 |
| 스파크펀 푸시버튼 12mm | 1 |
| LED | 1 |
앱 및 온라인 서비스
- 아두이노 IDE
- 시그폭스 (Sigfox)
- 씽스피크 (ThingSpeak) API
프로젝트 소개
1) 요약
이 튜토리얼은 오래된 유도식 전력량계를 인터넷에 연결하는 장치를 만드는 방법입니다. 회전 디스크에 반사 페인트와 검은 줄무늬가 있으며, 검은 줄이 지나갈 때마다 1회전 완료. 본 프로젝트에서는 120회전 = 1kWh입니다.
2) 마이크로컨트롤러, IoT 네트워크 등
아두이노 MKRFOX1200 사용. 내장 시그폭스(Sigfox) 모듈로 LPWAN 통신. ISM 대역 868MHz, 일일 업링크 140회(페이로드 12바이트) 가능. 시그폭스 클라우드에 메시지 저장 후 콜백으로 원하는 목적지 전송 가능.
ThingSpeak: IoT 데이터 시각화 플랫폼. 시그폭스 콜백 목적지로 설정해 수신 즉시 차트 표시.
3) 실전 작업
- 배선도대로 모든 부품 연결 (USB 파워뱅크 또는 노트북 USB로 전원 공급).
- 코드 작성 및 업로드 (하단 코드 참조).
- ThingSpeak 채널 생성: 채널 1(소비량 필드), 채널 2(채널 1 기반, MATLAB Analysis로 누적 소비량 계산). 분석 코드 예시 제공.
- 시그폭스 콜백 생성: 백엔드 로그인 → 콜백 섹션 → DATA UPLINK, URL 채널, 커스텀 페이로드 설정(
status::uint:32:little-endian), URL 패턴(https://api.thingspeak.com/update?api_key=채널1_WriteAPIKey&field1={customData#status}), HTTP GET 방식.
4) 장치 설치 및 로직
CNY70 센서를 전력량계 유리 중앙(회전 디스크 중심)에 양면 테이프로 부착. 버튼 2회 눌러 캘리브레이션: 반사면 감지 시 LED 점등, 검은 줄 감지 시 소등. 캘리브레이션 후 버튼 1회 더 눌러 측정 시작. 30분마다 소비량 전송 (정밀도 25Wh, 즉 3회전마다).
5) 최종 결과
ThingSpeak에서 아름다운 차트로 실시간 전기 에너지 소비량 확인 가능.
코드
Sigfox kWh 전기 에너지 전력량계 (아두이노)
#include
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;
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;
if (BTN_NR_OF_PRESS % 4 == 0) { // 측정 모드
digitalWrite(DIODE, LOW);
if (SHINE == false) {
for (millis(); (millis() - i) > 1800000;) { // 30분마다
i = millis();
SigFox.debug();
SigFox.beginPacket();
SigFox.write(CONSUMPTION);
SigFox.endPacket();
}
}
}
}
회로도
MKRFOX1200, CNY70, 저항, 버튼, LED 연결 회로도 이미지 제공