가스 온수기 파일럿 라이트 감시 시스템 – 열전대 전압 모니터링으로 안전 확보
필요한 부품 및 소모품
| 부품 |
수량 |
비고 |
| 라즈베리 파이 제로 WH |
1 |
알림 발송용 (WiFi 내장) |
| 아두이노 나노 R3 |
1 |
열전대 전압 측정용 (ADC 내장) |
프로젝트 개요
가스 온수기의 파일럿 라이트가 간헐적으로 꺼지는 문제(연 3회 내외)를 해결하기 위해 열전대가 생성하는 미세 전압(최대 30mV)을 모니터링합니다. 전압이 0에 가까워지면 파일럿 라이트가 꺼진 것으로 판단해 이메일/문자 알림을 보냅니다. 가스 밸브는 열전대 전압이 떨어지면 자동 차단되므로 가스 누출 위험은 없습니다.
시스템 아키텍처
- 아두이노 나노: 내부 1.1V 레퍼런스 전압 사용해 ADC(10비트, 0~1023)로 열전대 전압 측정. 30mV ≈ ADC 값 28. 30초마다 측정 후 단일 와이어 시그널링으로 라즈베리 파이 전송.
- 라즈베리 파이 제로 WH: 파이썬 프로그램으로 아두이노 신호 수신 → 전압 환산 → 임계값 이하 5회 연속(2분 30초) 시 알림 발송. 6시간 쿨다운 적용.
단계별 구현
1. 라즈베리 파이 준비
OS 설치, 네트워크 연결, 파이썬 알림 프로그램 작성 (소스 코드 참조). Gmail 앱 비밀번호 사용 권장 (일반 비밀번호는 보안 정책상 차단될 수 있음).
2. 아두이노 준비
중국산 나노 보드 드라이버(CH340 등) 설치 후 스케치 업로드. analogReference(INTERNAL)로 1.1V 레퍼런스 설정. A0 핀으로 열전대 전압 읽기.
3. 열전대 선 연결
온수기 써모스탯으로 가는 동축 케이블을 써모스탯에서 약 5인치 지점에서 절단. 외부 차폐선(양극)을 살짝 벗겨 중앙 도체(음극)와 쇼트 나지 않게 주의하며 아두이노 A0와 GND에 연결. 악어 클립 활용 권장.
4. 아두이노-라즈베리 파이 간 레벨 시프팅
아두이노 출력(5V) → 라즈베리 파이 입력(3.3V) 위해 전압 분할기 필요. 예: 330Ω + 220Ω 직렬 연결, 중간 점을 라즈베리 파이 GPIO 16번(BCM)에 연결. 모든 GND 공통 연결 필수.
5. 아두이노 시그널링 프로토콜
ADC 값(0~1023)을 두 자리 10진수로 전송. 각 자릿수마다 펄스 수로 인코딩:
- 킥오프 펄스 1개 + 자릿수 값만큼 펄스 추가 (자릿수 내 펄스 간격 20ms HIGH + 20ms LOW)
- 자릿수 간 50ms 대기
- 예: 값 12 → 킥오프 + 1펄스(십의 자리) + 50ms + 킥오프 + 2펄스(일의 자리)
6. 라즈베리 파이 수신 및 판정 로직
GPIO 16번 라이징 에지 감지 루프. 펄스 간격 70ms 미만이면 같은 자릿수, 70ms~200ms면 다음 자릿수, 200ms 초과면 숫자 완료로 판정. 수신 값 × 1.1V / 1023으로 전압 환산.
7. 알림 발송 조건
- 센서 읽기 값 ≤ 1 (약 1mV 이하) 시 저전압 카운트 증가
- 저전압 카운트 ≥ 5 (연속 5회, 2분 30초) 시 알림 발송
- 발송 후 저전압 카운트 리셋, 6시간 동안 재발송 억제
- SMTP(Gmail) 이용, 이메일 + 이동통신사 게이트웨이(예: 5555555555@vtext.com)로 문자 동시 발송
8. 자동 실행 설정
부팅 시 파이썬 스크립트 자동 실행 위해 크론탭 등록:
@reboot sh /home/pi/hotwater/run_HotWaterNotifier.sh >> /home/pi/hotwater/logs/HotWaterNotifier.log 2>&1
수동 실행 시: ./run_HotWaterNotifier.sh → Ctrl+Z → bg → disown
소스 코드
아두이노 스케치 (핵심부)
double ReferenceVoltage = 1.1;
int OUTPUT_PIN = 9;
int INTRA_DIGIT_WAIT = 20;
int BETWEEN_DIGIT_WAIT = 50;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(OUTPUT_PIN, OUTPUT);
analogReference(INTERNAL);
Serial.begin(9600);
}
void loop() {
int pinInput = analogRead(A0);
double voltage = (pinInput * ReferenceVoltage) / 1023.0;
sendNumberSignal(pinInput, OUTPUT_PIN, INTRA_DIGIT_WAIT, BETWEEN_DIGIT_WAIT);
delay(30000); // 30초 주기
}
// sendNumberSignal, sendPulse 함수 구현 생략 (원문 참조)
파이썬 알림 프로그램 (핵심부)
import RPi.GPIO as GPIO, smtplib, datetime, logging, time
GPIO_Alert = 16
lowSensorReading = 1
maxLowVoltageCount = 5
emailWaitHours = 6
def waitReceiveNumber(pin):
# 라이징 에지 기반 펄스 카운팅으로 2자리 숫자 수신
# 구현 생략 (원문 참조)
return decoded_number
def send_email_alert():
# Gmail SMTP + 앱 비밀번호로 이메일/문자 발송
# 구현 생략 (원문 참조)
pass
def main():
lowVoltageCount = 0
while True:
sensorReading = waitReceiveNumber(GPIO_Alert)
voltage = (sensorReading * 1.1) / 1023.0
if sensorReading <= lowSensorReading:
lowVoltageCount += 1
if lowVoltageCount >= maxLowVoltageCount:
send_email_alert()
lowVoltageCount = 0
else:
lowVoltageCount = 0
if __name__ == "__main__":
main()
실행 스크립트 (run_HotWaterNotifier.sh)
#!/bin/bash
cd /home/pi/hotwater
sudo python HotWaterNotifier.py
설치 사진
아두이노-라즈베리 파이 연결부, 전압 분할기, 열전대 탭 연결부 등 실물 사진 참조.