물·흙 · 난이도 보통
YF-S201 유량 센서의 펄스를 세어 분당 리터와 누적 사용량을 구하고 계수를 직접 맞추기
YF-S201은 물이 흐르면 날개바퀴와 홀 센서가 펄스를 내는 유량 센서예요. 5V 펄스를 10kΩ·20kΩ으로 나눠 GP15에 잇는 배선, 주파수 = 7.5 × 유량 식으로 L/min과 누적 L를 구하는 코드, 계량컵으로 내 센서의 1L당 펄스 수를 맞추는 법과 탐구를 정리했어요.
이 센서로 무엇을 잴 수 있나
YF-S201은 수도관 지름 1/2인치에 맞춰 만든 검은 플라스틱 유량 센서예요. 제조사(Foshan Shunde Zhongjiang) 자료에는 동작 전압 5~18V, 5V에서 최대 전류 15mA, 측정 범위 1~30L/min에서 정확도 ±5%, 견디는 압력 1.75MPa 이하, 사용 온도 80℃ 이하가 적혀 있어요. 원래는 가스 온수기에 들어가 물이 흐르는지 확인하는 부품이에요.
피코로는 1분에 몇 리터가 흐르는지(유량, L/min)와 지금까지 흐른 양(누적, L)을 잴 수 있어요. 손 씻기에 물을 얼마나 쓰는지, 물통을 높이 올리면 흐름이 얼마나 빨라지는지, 센서가 알려 준 양이 계량컵과 얼마나 맞는지 같은 탐구를 할 수 있어요.
원리
센서 안에는 자석이 붙은 날개바퀴가 있고, 물이 지나가면 이 바퀴가 돌아요. 바깥쪽의 홀 센서가 자석이 지나갈 때마다 신호를 내서, 노랑 선으로 펄스가 나와요. 흐름이 빠를수록 바퀴가 빨리 돌아 펄스가 촘촘해져요.
제조사 자료의 식은 펄스 주파수(Hz) = 7.5 × 유량(L/min)이고, 오차는 ±3%예요. 1L/min이면 1초에 7.5번, 30L/min이면 225번이에요. 1분 동안 1L가 흐르면 펄스가 7.5 × 60 = 450번 나오니, 1L는 450펄스이고 펄스 하나는 약 2.2mL예요. DFRobot의 같은 계열 센서 자료(SEN0217)도 1L = 450펄스로 적어요.
정확도가 적힌 범위는 1~30L/min이에요. 그보다 느린 흐름에서는 바퀴가 고르게 돌지 않을 수 있어서 값을 덜 믿어요. 제조사는 설치 방향 그림대로, 기울기 5° 이내로 달라고 적어요. 몸통의 화살표는 물이 흐르는 방향이에요.
준비물
- 라즈베리파이 피코와 USB 케이블
- YF-S201 유량 센서, 1/2인치 호스 연결구와 호스, 나사산 테이프
- 10kΩ 저항 1개, 20kΩ 저항 1개, 브레드보드, 점퍼선, 케이블 타이
- 2L 페트병 또는 1L 계량컵, 전자저울, 양동이, 쟁반, 스톱워치
- 탐구용: 물통을 올릴 상자나 받침(높이 30cm, 60cm, 90cm)
배선
브레드보드 따라 꽂기 순서 (10단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 빨간 선: 피코 40번 핀(VBUS) 옆 칸 a2 → 아래쪽 + 줄(5V). 이제 이 줄 전체가 5V예요. 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)은 절대 서로 잇지 않아요.
- 검은 선: 피코 3번 핀(GND) 옆 칸 j4 → 아래쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- 유량 센서 YF-S201 물 흐름 꽂기: 다리 빨강 VCC · 검정 GND · 노랑 신호를 아래쪽 j24 · j25 · j26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 빨간 선(5V 전원): 유량 센서 빨강 VCC 줄 i24 → 아래쪽 + 줄(5V)
- 검은 선(GND): 유량 센서 검정 GND 줄 i25 → 아래쪽 − 줄(GND)
- 저항 10kΩ(색띠 갈색·검정·주황): g26 ↔ g28 (노랑 신호 다리 칸 → 나눔 칸 28열)
- 저항 20kΩ(색띠 빨강·검정·주황): i28 ↔ 아래쪽 − 줄(GND)
- 초록 선: 나눔 칸 h28 → 피코 20번 핀(GP15) 옆 칸 j21. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| 빨강 VCC | VBUS (40번) | 5V, 제조사 자료 기준 최대 15mA |
| 검정 GND | GND (38번) | 피코와 접지를 함께 써요 |
| 노랑 신호 | GP15 (20번) | 10kΩ·20kΩ 분압 뒤 연결 |
제조사 자료에 따르면 5V 전원에서 펄스의 HIGH는 4.5V보다 높고(DFRobot 자료는 4.7V 초과), LOW는 0.5V보다 낮아요. 그래서 노랑 선 ─ 10kΩ ─ ● ─ 20kΩ ─ GND로 잇고 가운데 점(●)을 GP15에 연결해요. 4.5V는 3.0V로, 0.5V는 약 0.33V로 줄어서, RP2350이 HIGH로 읽는 2V 이상과 LOW로 읽는 0.8V 이하에 각각 들어가요. 피코 2의 디지털 핀은 3.3V 전원이 켜진 동안 5.5V까지 견디지만 전원이 꺼진 때에는 그렇지 않아서, 이 자료실은 보드와 상관없이 5V 신호를 분압해요(피코 핀 지도).
센서가 HIGH와 LOW를 내보내고 아래쪽 20kΩ이 핀을 GND 쪽에 붙잡아 주므로, 코드에서 내부 풀업은 켜지 않아요. 피코와 브레드보드는 물이 지나가는 길보다 높은 곳에 두고, 센서 선은 케이블 타이로 묶어 호스가 움직여도 당겨지지 않게 해요.
코드
from machine import Pin
import time
flow = Pin(15, Pin.IN) # 노랑 신호 → 10kΩ/20kΩ 분압 → GP15
PULSES_PER_L = 450 # 제조사 식(7.5 × 60). 직접 맞춘 값으로 바꿔요
total = 0 # 켠 뒤 들어온 펄스 누계
def on_pulse(p):
global total
total += 1
flow.irq(trigger=Pin.IRQ_FALLING, handler=on_pulse)
WINDOW = 2 # 초. 길수록 느린 흐름에서 덜 흔들려요
last = 0
t_last = time.ticks_ms()
while True:
time.sleep(WINDOW)
t = time.ticks_ms()
dt = time.ticks_diff(t, t_last) / 1000 # 실제로 흐른 시간(초)
t_last = t
now = total
n = now - last
last = now
hz = n / dt if dt > 0 else 0
lpm = hz * 60 / PULSES_PER_L # 450이면 hz ÷ 7.5와 같아요
liters = now / PULSES_PER_L
print(f"DATA: hz={hz:.1f}, lpm={lpm:.2f}, liters={liters:.3f}")
- 펄스가 HIGH에서 LOW로 떨어질 때마다
on_pulse가 누계total에 1을 더해요. 펄스 하나에 한 번만 세요. - 본 반복은 2초마다 누계의 차이로 주파수(
hz)를 구해요. 잠든 시간 대신ticks_ms로 잰 실제 시간으로 나눠서, 코드가 도는 시간까지 계산에 넣어요. lpm은 분당 리터,liters는 켠 뒤 흐른 전체 양이에요.PULSES_PER_L만 바꾸면 두 값이 함께 고쳐져요.
값 해석과 보정
느린 흐름에서는 창 길이가 중요해요. 1L/min이면 2초 동안 펄스가 15개쯤 들어오는데, 펄스 하나가 더 오고 덜 오는 것만으로 값이 약 7% 흔들려요. 창이 1초면 약 13%예요. 느린 흐름을 비교할 때는 WINDOW를 늘리거나, 순간 유량 대신 정해진 시간 동안의 누적 양을 비교해요.
450이라는 숫자는 제조사가 정한 평균이라 내 센서와 꼭 맞지는 않아요. 2L 페트병을 채우는 동안의 펄스 수를 세면 내 센서의 1L당 펄스 수가 나와요. 부피는 눈금보다 저울로 재는 편이 정확해요. 상온의 물 1g은 약 1mL로 봐요. 이렇게 구한 값을 PULSES_PER_L에 넣고, 유량을 바꿔 가며 다시 확인해요(탐구 1). 흐름에 따라 이 값이 달라진다면, 실험에서 주로 쓸 유량에서 구한 값을 써요.
호스 안에 공기가 차 있으면 바퀴가 헛돌아 값이 틀려요. 물을 처음 흘릴 때는 몇 초 흘려 공기를 빼고 나서 기록을 시작해요. 연결부에서 물이 새면 센서를 지나지 않은 물만큼 실제보다 적게 나와요. 나사산 테이프를 감고 연결부를 휴지로 확인해요.
자주 하는 실수
- 노랑 선을 GP15에 바로 꽂기. 5V 펄스가 그대로 들어가요. 반드시 분압해요.
- 화살표를 반대로 달기. 물은 흐르지만 값이 작거나 들쭉날쭉해요. 몸통의 화살표 방향을 확인해요.
- 1초 창으로 느린 흐름을 비교하기. 펄스 몇 개의 차이가 큰 비율이 돼요. 창을 늘려요.
- 450을 그대로 믿기. 계량해서 내 센서의 값을 구해요.
- 피코를 호스 아래에 두기. 연결부에서 떨어진 물이 바로 회로로 가요. 물길보다 높은 곳에 둬요.
이 센서로 잴 수 있는 탐구
1. 내 센서의 1L당 펄스 수는 450일까
- 질문: 유량을 바꿔도 1L당 펄스 수는 같을까?
- 바꾸는 것: 수도꼭지를 연 정도(조금, 절반, 끝까지)
- 재는 것: 2L를 채우는 동안 늘어난 total을 저울로 잰 부피(L)로 나눈 값(펄스/L)
- 방법: 센서 출구에 호스를 이어 페트병에 받아요. 시작과 끝의 total을 적고, 병의 무게로 부피를 구해요. 조건마다 3번 해서 제조사의 450, 오차 ±3%와 비교해요.
2. 물통을 높이 올리면 흐름이 얼마나 빨라질까
- 질문: 물통을 높이 올릴수록 유량이 커질까? 높이가 4배일 때 유량은 몇 배일까?
- 바꾸는 것: 물통의 수면과 호스 출구의 높이 차 30cm, 60cm, 90cm(그리고 120cm)
- 재는 것: 흐름이 일정해진 뒤 10초 동안의 lpm 평균(L/min)
- 방법: 넓은 물통에 호스를 넣고 사이펀으로 물을 흘려 센서를 지나게 해요. 재는 동안 수면이 크게 내려가지 않도록 물을 넉넉히 채우고, 높이마다 3번 재요. 1L/min보다 느리면 사양 범위 밖이라고 표시해요.
3. 손 씻을 때 물을 얼마나 쓸까
- 질문: 물을 틀어 둔 채 비누칠할 때와 잠갔다가 다시 틀 때 쓰는 물의 양은 얼마나 다를까?
- 바꾸는 것: 손 씻는 방법(계속 틀어 둠, 비누칠 동안 잠금)
- 재는 것: 한 번 씻는 데 쓴 liters(L), 걸린 시간(초)
- 방법: 수도꼭지 끝에 센서를 단 호스를 연결하는 일은 선생님과 함께 해요. 같은 비누, 같은 30초 비누칠로 정하고 방법마다 5번 재요.
안전
- 물과 전기를 떨어뜨려요. 피코와 배선은 물길보다 높고 쟁반 밖인 곳에 두고, 호스를 만지기 전에는 USB를 뽑아요.
- 뜨거운 물은 쓰지 않아요. 제조사 자료의 사용 온도는 80℃ 이하이고, 무엇보다 손을 데요.
- 수도꼭지 연결은 선생님과 함께 하고, 학교 수도관에 고정해서 달아 두지 않아요. 바닥에 흘린 물은 바로 닦아 미끄러지지 않게 해요.
- 센서를 지난 물은 마시지 않아요.
더 알아보기
- 제조사 자료: Foshan Shunde Zhongjiang Energy Saving Electronics "YF-S201 black flow sensor"(동작 전압, 15mA, 펄스 HIGH·LOW 전압, F = 7.5Q ±3%, 1~30L/min ±5%, 1.75MPa, 기울기 5° 이내), DFRobot "Water Flow Sensor 1/2″ (SEN0217)" 자료(1L = 450펄스, HIGH 4.7V 초과)
- MicroPython 문서:
machine.Pin.irq, "Writing interrupt handlers" - 라이브러리: 따로 없어요
- 기초 글: 분압 회로, 센서 값의 신뢰도, 잴 수 있는 탐구 주제 만들기, 브레드보드 처음 쓰기