Home IoT Hub Series · 14
[14편] 물 새는지, 얼마나 쓰는지 숫자로 보자 - YF-S201 수도 사용량 노드
![[14편] 물 새는지, 얼마나 쓰는지 숫자로 보자 - YF-S201 수도 사용량 노드 대표 이미지](/iot-lab/assets/water-flow-yfs201-hero.png)
이 글은 2편: 두뇌 만들기에서 구축한 중앙 NodeMCU 서버에 연결되는 우리집 IoT 허브 구성 문서입니다. YF-S201의 펄스 수를 물 사용량으로 변환해 누수와 사용 패턴을 추적하게 합니다. 수집된 데이터는 로컬 무선망
IoT_Hub_Net을 통해 중앙 서버의 16번 수도 사용량 슬롯(/set?no16=값)을 갱신하며, 20채널 스마트홈 통합 컨트롤러의 판단 근거로 사용됩니다.YF-S201은 배관을 흐르는 물에 의해 내부 임펠러가 돌면서 펄스를 발생시키는 유량 센서입니다. 펄스 수를 세면 사용한 물의 양(L)을 계산할 수 있고, 결과는 16번 Water 슬롯으로 보냅니다.
준비물과 가격
| 부품 | 수량 | 개당 가격 |
|---|---|---|
| Wemos D1 Mini | 1개 | 2,000원 |
| YF-S201 유량 센서 | 1개 | 3,000원 |
| 점퍼 와이어 3개 | — | — |
| 합계 | 5,000원 |
핀 연결
| 센서/모듈 | 보드 연결 |
|---|---|
| 빨강 (VCC) | 5V (VU) |
| 검정 (GND) | GND |
| 노랑 (OUT) | D2 (GPIO4) |
전체 코드
YF-S201은 1리터당 약 450펄스를 발생시킵니다. 인터럽트로 펄스를 세고, 일정 간격으로 리터 단위로 환산해 전송합니다.
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> const char* ssid = "IoT_Hub_Net"; const char* password = "iothub1234"; const char* hubURL = "http://192.168.1.1"; #define FLOW_PIN 4 // D2 (인터럽트 가능 핀) #define SLOT_NO 16 #define PULSE_PER_L 450 // YF-S201: 450펄스/L #define INTERVAL 15000 volatile unsigned long pulseCount = 0; unsigned long lastSend = 0; void ICACHE_RAM_ATTR countPulse() { pulseCount++; } void setup() { Serial.begin(115200); pinMode(FLOW_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(FLOW_PIN), countPulse, FALLING); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Connecting to IoT_Hub_Net"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected!"); } void loop() { unsigned long now = millis(); if (now - lastSend > INTERVAL) { // 펄스 → 리터 변환 unsigned long pulses; noInterrupts(); pulses = pulseCount; pulseCount = 0; interrupts(); float liters = (float)pulses / PULSE_PER_L; Serial.print("Pulses: "); Serial.print(pulses); Serial.print(" -> Water: "); Serial.print(liters, 2); Serial.println(" L"); WiFiClient client; HTTPClient http; String url = String(hubURL) + "/set?no" + String(SLOT_NO) + "=" + String(liters, 1); http.begin(client, url); http.GET(); http.end(); Serial.println("HTTP -> " + url); lastSend = now; } delay(100); }
확인
수도꼭지를 틀면 시리얼 모니터에 Water: 2.5 L 같은 값이 표시되고, 두뇌 16번 슬롯에도 표시됩니다.
시리얼 모니터
업로드가 끝나면 Arduino IDE의 툴 → 시리얼 모니터를 열고 보드레이트를 115200으로 맞춥니다. 다음은 정상 동작을 확인하기 위한 시리얼 모니터 출력 예시입니다. 이 로그는 실제 캡처가 아니라, 유량 센서 펄스와 16번 슬롯 누적 사용량 전송을 확인하는 예시입니다.
[BOOT] Home IoT Node #14 - Water flow YF-S201 [INT] pulse counter attached, debounce=50ms [SENSOR] pulses=38 flow=1.9L/min total=0.32L [FILTER] air_bubble_noise=PASS [HTTP] GET /set?no16=0.32 [HUB] 200 OK - slot no16 updated [CHECK] leak watch enabled when flow continues too long
Connected또는connected가 보이면 Wi-Fi 연결 단계는 통과한 것입니다.HTTP 200또는200 OK가 보이면 두뇌 서버에 값이 전달된 것입니다.- 값이 갱신되지 않으면 먼저 URL의 슬롯 번호와 센서 배선을 함께 확인합니다.
다음 글 예고
빗물 감지는 우적 센서 하나로 시작할 수 있는 비교적 단순한 구성입니다.
YF-S201 수도 사용량 센서 활용 가이드
YF-S201은 물이 흐를 때 내부 임펠러(날개바퀴)가 돌면서 만드는 펄스 신호를 세어 사용량을 리터 단위로 환산하는 홀센서 방식 유량계입니다. 배선과 코드는 앞 절에서 다뤘으니, 여기서는 '우리집 IoT 허브'에서 실제로 쓸모 있게 만드는 방법을 정리합니다.
안 될 때 체크포인트
이 노드는 코드만 보면 짧아 보일 수 있지만, 실제 집에 붙이면 센서 위치·전원·무선망·노이즈 때문에 값이 쉽게 흔들립니다. 아래 항목은 두뇌 서버에 잘못된 판단 근거가 들어가지 않도록 현장에서 먼저 점검할 내용입니다.
| 증상 | 가능한 원인 | 현장 해결 방법 |
|---|---|---|
| 물을 안 써도 펄스가 생김 | 배관 공기방울이나 수압 변화로 임펠러가 순간적으로 움직임 | 50ms 이하로 너무 빠른 펄스나 짧은 단발 펄스는 노이즈로 버립니다. |
| 실제 물 사용량과 차이가 큼 | YF-S201의 보정 계수는 설치 방향·수압·배관 굵기에 따라 달라짐 | 1L 또는 5L 계량컵으로 실제 배출량을 재고 pulse-per-liter 값을 현장 보정합니다. |
| 배관 연결부에서 미세 누수 | 나사산 체결 부족 또는 테플론 테이프 감김 부족 | 물 흐름 방향 화살표를 맞추고 테플론 테이프를 충분히 감은 뒤 처음 24시간은 휴지로 누수 흔적을 확인합니다. |
| 온수 라인에서 센서가 빨리 망가짐 | 저가형 YF-S201은 고온수와 압력 변화에 약함 | 정격 온도와 압력을 확인하고, 가능하면 냉수 측정용으로 쓰거나 온수 전용 센서를 선택합니다. |
활용 방안
단순히 물이 흐르는지 아는 것을 넘어, 누적 리터를 쌓으면 다양한 지표가 나옵니다.
- 수도요금 추정: 월 누적 사용량에 지역 요금 단가를 곱해 이번 달 예상 요금을 대시보드에 표시합니다.
- 누수 감지: 새벽 2~4시처럼 아무도 물을 안 쓰는 시간대에 지속적인 미세 흐름이 잡히면 변기 부속 누수나 배관 누수로 판단해 알림을 보냅니다.
- 정원 관수량 관리: 텃밭·화단 호스에 달아 '오늘 몇 리터 줬는지'를 기록하고 목표치 도달 시 자동으로 밸브를 잠급니다.
- 샤워 시간·습관: 1회 샤워당 사용량과 지속 시간을 로깅해 가족별 물 절약 챌린지에 활용합니다.
추천 설치 장소
- 화살표 방향 준수: 센서 몸체의 화살표를 실제 물 흐름 방향과 반드시 일치시킵니다. 반대로 달면 계측이 부정확하고 임펠러가 잘 안 돕니다.
- 수평 설치: 임펠러 축이 수평이 되도록 눕혀 달면 저유량에서도 회전이 안정적입니다. 수직 배관보다 수평 구간이 유리합니다.
- 계량기 이후: 수도 계량기 다음, 분기되기 전 지점에 달아야 집 전체 사용량을 잡습니다. 특정 용도만 재려면 해당 분기 라인에 답니다.
- 진동·역류 주의: 펌프 바로 뒤나 급격한 꺾임 직후는 난류·역류로 오차가 커지니 피하고, 직선 배관 구간을 확보합니다.
- 접근 쉬운 실내: 청소·점검·배선 정비가 필요하므로 손이 닿고 동파 걱정 없는 실내에 두는 것이 좋습니다.
실전 팁과 주의점
- 보정계수는 유량별로 다르다: 데이터시트의 'F=7.5×Q' 같은 값은 평균치일 뿐, 실제로는 저유량에서 오차가 큽니다. 1L 계량컵이나 페트병으로 여러 유량에서 직접 채수해 나만의 펄스-리터 계수를 구합니다.
- 저유량 감지 한계: YF-S201은 대체로 분당 1L 미만의 아주 약한 흐름은 임펠러가 안 돌아 놓칩니다. 미세 누수 감지에는 한계가 있음을 감안합니다.
- 이물질·석회 청소: 모래·녹·석회가 임펠러에 끼면 회전이 뻑뻑해집니다. 앞단에 간이 필터(스트레이너)를 두고, 주기적으로 분리 세척합니다.
- 방수 배선: 센서 커넥터 부위는 물이 튀는 곳이라 열수축 튜브·에폭시로 방수하고, 결선부가 배관보다 낮지 않게 배치해 물이 타고 들어오지 않게 합니다.
자주 묻는 질문
Q. 온수에도 쓸 수 있나요? A. YF-S201은 보통 80℃ 이하 권장입니다. 급탕 직후 고온 구간은 피하고, 온수용은 내열 사양(YF-S201C 등)을 확인합니다.
Q. 수압이 세지면 센서가 터지지 않나요? A. 정격 사용 압력(약 1.75MPa 내외)을 넘지 않으면 괜찮습니다. 수격(워터해머)이 잦은 곳은 앞단에 감압·완충을 두는 것이 좋습니다.
Q. 값이 실제 계량기와 안 맞아요. A. 대부분 보정계수 문제입니다. 계량기 눈금과 센서 누적값을 같은 구간에서 비교해 계수를 재조정하면 오차가 크게 줄어듭니다.
이 글은 2편의 중앙 두뇌 서버와 3~19편의 분산 엣지 노드가 함께 구성하는 20채널 홈 IoT 시스템의 일부입니다. 필요한 편으로 이동해 슬롯과 센서 흐름을 함께 확인합니다.
[1편] 우리집 IoT 허브 전체 그림[2편] 중앙 두뇌 서버 만들기 · 슬롯 1~20[3편] 집 안 온습도, 감으로 보지 말고 숫자로 보자 · 슬롯 1·2[4편] 문 닫았나 계속 신경 쓰일 때 · 슬롯 9[5편] 냉장고가 제대로 돌고 있는지 눈으로 확인하자 · 슬롯 12[6편] 창문 열어도 될까? · 슬롯 3[7편] 욕실 곰팡이 생기기 전에 습도부터 잡자 · 슬롯 19[8편] 보일러가 실제로 도는지 배관 온도로 확인하자 · 슬롯 5·17[9편] 외출했는데 가스레인지가 켜져 있지 않을까? · 슬롯 6[10편] 가스 냄새가 나기 전에 먼저 경고받자 · 슬롯 7[11편] 집을 비웠을 때 불꽃 징후를 먼저 잡자 · 슬롯 8[12편] 머리가 멍한 이유가 공기 때문인지 확인하자 · 슬롯 13·14[13편] 전기세 무지 나오네, 이번 기회에 눈으로 보자 · 슬롯 15[14편] 물 새는지, 얼마나 쓰는지 숫자로 보자 · 슬롯 16[15편] 비 오는 줄 모르고 창문 열어두지 않게 · 슬롯 18[16편] 불 껐나, 문 잠갔나 한 번에 확인하자 · 슬롯 11·10[17편] 리모컨 없이 에어컨을 IoT 허브에서 제어하자 · 슬롯 4[18편] 강아지 밥그릇이 비었는지 눈으로 보자 · 슬롯 20[19편] 사람 있을 때만 시원하게, 없을 땐 아끼자 · 슬롯 1·4[20편] 집 안 상태가 한 화면에 보이기 시작했다 · 슬롯 전체