Modbus·MKR WiFi 1010·RS485로 가정용 전력량 모니터링 시스템 구축
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 MKR WiFi 1010 |
1 |
MKR 폼팩터, WiFi 내장 |
| 아두이노 MKR 485 실드 |
1 |
RS485/RS422 변환, 7-24V 벅 컨버터 내장 |
| USB-A to 마이크로 USB 케이블 |
1 |
|
| USB 전원 어댑터 |
1 |
MKR 485 실드 벅 컨버터로 7-24V 입력 가능 |
| 트위스트 단일 쌍 쉴드 케이블 (전화선 타입) |
1 |
RS485 통신용, 1.2km 장거리 전송 가능 |
필요 도구
- 디지털 멀티미터 (필수: 작업 전 무전압 확인용)
- 전기공용 가위
- 소형 일자 드라이버 (MKR 485 단자대용)
- 중형 십자 드라이버
앱 및 온라인 서비스
- Home Assistant (홈 오토메이션 플랫폼)
- 아두이노 웹 에디터 (또는 아두이노 IDE)
- MQTT 브로커 (Home Assistant 연동용)
프로젝트 개요
스마트 홈을 진지하게 생각한다면 월간 요금(전기, 가스 등)부터 시작해야 합니다. "지구에도, 지갑에도, 비즈니스에도 좋다"는 말처럼 오픈소스 하드웨어로 지속가능한 홈 환경을 구축해봅시다. 본 프로젝트는 간단하고 안전한 솔루션으로, MQTT로 데이터를 노출해 어떤 홈 오토메이션 소프트웨어와도 쉽게 연동됩니다 (여기선 Home Assistant 예시).
시스템 개요
전력량 측정을 위해 파인더(Finder) 에너지 미터를 선택했습니다. DIN 레일 장착형으로 가정용 분전함에 딱 맞고, RS485 Modbus 인터페이스를 탑재해 산업 표준 프로토콜로 아두이노와 통신하기 쉽습니다. 아두이노 공식 MKR 485 실드와 두 라이브러리로 프로토콜 디코딩이 간단합니다. 메인 보드는 MKR 폼팩터 공유 및 WiFi 내장의 MKR WiFi 1010을 사용했습니다.
하드웨어 설치 (⚠️ 안전 필독)
경고! 국가별 전기 공사 규정을 확인하고 극히 주의하세요. 감전 위험이 치명적입니다. 모르면 전기기사에게 의뢰하세요.
- 분전함 차단기 내려서 전원 차단 → 멀티미터로 단자간 전압 없음 이중 확인
- 에너지 미터를 분전함 내 DIN 레일에 장착
- 메인 차단기에서 나온 활선(갈색/검정/회색)과 중성선(파란색)을 미터 입력단에 연결 (EU 색상 규약 준수)
- 미터 출력을 기존 회로(부하 측)에 연결
- RS485 통신선 연결: 트위스트 페어 케이블로 미터 A/B/COM 단자 ↔ MKR 485 실드 Y/Z/ISOGND 연결
- 하프 듀플렉스 모드이므로 Y/Z만 사용, COM은 ISOGND와 연결
- MKR 485 실드 스위치 설정: HALF(2번 OFF), 종단저항 Y-Z(3번 ON), 1번은 무관
- 분전함 닫고 아두이노를 접근 좋은 위치에 배치



소프트웨어: Modbus RTU → MQTT 브리지
아두이노 스케치는 세 가지 역할을 수행합니다:
- Modbus RTU 마스터로 에너지 미터 레지스터 폴링
- WiFi 네트워크 관리 및 재접속
- MQTT 클라이언트로 브로커에 측정값 발행
Modbus 통신 원리 (핵심)
Modbus 메시지 구조 예시: 01 03 04 00 16 00 02 25 C7
0x01: 장치 주소 (슬레이브 ID)
0x03: 기능 코드 (홀딩 레지스터 읽기)
0x04: 바이트 카운트 (4바이트 = 레지스터 주소 2바이트 + 길이 2바이트)
00 16: 읽을 레지스터 시작 주소
00 02: 레지스터 개수 (워드 단위, 1워드=2바이트)
- 뒤 4바이트: CRC 체크섬
아두이노 구현 예시 (전류 읽기)
// 알베르토 페로(Alberto Perro) - Officine Innesto 작성
float readCurrent() {
float ampere = 0.0;
// 요청 전송 및 응답 수신
if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) {
Serial.print("전압 읽기 실패! ");
Serial.println(ModbusRTUClient.lastError());
} else {
uint16_t word1 = ModbusRTUClient.read(); // 상위 워드 (MSW)
uint16_t word2 = ModbusRTUClient.read(); // 하위 워드 (LSW)
int32_t milliamp = (word1 << 16) | word2; // 32비트 정수로 조합
ampere = milliamp / 1000.0; // mA → A 변환
}
return ampere;
}
같은 방식으로 전압, 전력, 역률, 적산 전력량(kWh) 등 미터 데이터시트의 모든 레지스터를 읽어 MQTT 토픽으로 발행합니다.
Home Assistant 연동
MQTT 브로커가 설정되어 있다고 가정할 때, configuration.yaml에 센서 정의만 추가하면 됩니다.
sensor:
- platform: mqtt
name: "Main Voltage"
state_topic: "energy/main/voltage"
unit_of_measurement: "V"
- platform: mqtt
name: "Main Current"
state_topic: "energy/main/current"
unit_of_measurement: "A"
- platform: mqtt
name: "Main Power"
state_topic: "energy/main/power"
unit_of_measurement: "W"
- platform: mqtt
name: "Total Energy"
state_topic: "energy/main/energy"
unit_of_measurement: "kWh"
device_class: "energy"
state_class: "total_increasing"
저장 → 설정 검사 → Home Assistant 재시작하면 대시보드에 실시간 그래프와 함께 나타납니다. 이후 자동화(예: 전력량 임계치 초과 알림, 태양광 연계 제어 등) 자유롭게 구성 가능.

코드 저장소
Modbus RTU → MQTT 브리지 스케치 (파인더 미터용)
Casa Jasmina 전력 모니터링용으로 개발. 전체 코드는 깃허브 저장소 참고.
확장 포인트
- 다중 미터 지원 (슬레이브 ID 변경으로 다중 회로 측정)
- 태양광 인버터 Modbus 연동으로 발전량 동시 모니터링
- 딥슬립 모드로 배터리 구동 무선 노드화
- 로컬 인플럭스DB/그라파나 스택으로 이력 시각화