1. 유량계 (Flow Meter) YF-S401과 측정 원리
라즈베리파이 피코 보드로 여러 가지 센서들을 취급하다가 유량계를 하나 접하게 되었다.
전면에는 상표명과 유량 범위 같은 것들이 적혀있었는데, 모델명이 YF-S401이었다.
뒷면에는 유체가 진행하는 방향이 화살표로 표기되어 있었다.
자료를 찾아보니, 다음과 같은 구조로 되어 있고, 내부 한쪽에 hall 센서가 붙어있다고 한다.
유량게를 통해 유체가 흘러갈 때, 유체의 흐름에 따라 내부의 수차(물레방아)가 회전하면서 hall 센서가 켜지는 구조라고 했다. 즉 쉽게 이야기하면 수차가 회전하면서 스위치를 한 번씩 눌러주는 구조였다.
유체의 흐름이 빠를수록 수차도 빠르게 회전하므로, 스위치는 더 빠른 간격으로 켜지게 되고, 일정한 양의 유체가 흘러갈 때마다 hall 센서가 켜지는 것이므로, hall 센서가 켜졌다 꺼진 횟수를 알면 유량게를 통해 흘러간 유체의 양을 계산할 수 있는 원리인 것이다.
그런데 내가 구입한 곳에는 이 유량계에 대한 기술적 자료는 제시된 쓸모 있는 자료는 거의 없었다.
필요한 자료를 인터넷에서 찾다 보니, 다음과 같은 Datasheet가 있기는 했다.
이 Data sheet에 주요 사양이 나와 있기는 하고, 유량을 계산하는 식이 있는듯한데, 문제는 이 식이 불완전하다. 이 식에 사용되는 변수에 대한 정의나 설명이 없어 식은 있으나 사용이 불가능했다.
결국 이 식을 버리고, 좀 더 자료를 찾아보았다.
그 결과 여러 자료에서 이 모델의 유량계는 5800 펄스 사이클이 1 Liter에 해당된다고 하는 자료들을 발견하게 되었다. 즉 수차로 인해 hall 센서가 5800번 켜졌다 꺼지면 1Liter의 유체가 흘러갔다는 의미였다.
2. 라즈베리파이 피코 보드에 적용해 보기
이 유량계를 사용해 보기 위해, 다음과 같이 라즈베리파이 피코 보드와 연결하였다.
이 유량계의 동작 전압이 5-24V이고 최소 4.5V 이상 전압이 필요하다고 하므로, 피코 보드의 5V에 연결해 주었다.
그리고 hall 센서에서 나오는 신호는 마치 푸시버튼과 동일한 입력을 제공하는 디지탈 입력신호이므로, GP16에 연결했다.
그리고 유체를 흘려주기 위해 작은 펌프와 유량계를 연결하고
펌프를 작동하면서, 유체의 흐름 속도와 유량을 측정해 보았다.
그리고, 코드는 GP16으로 들어오는 입력값의 변화 횟수를 세는 간단한 코드를 만들었다.
코드의 원리는 GP16으로 들어온 값이 High가 되었다가 다시 Low로 되는 것을 감지하면서 숫자를 세는 것이었고, 1초 간격(1000 msec)으로 유량을 계산하도록 했다. 처음에 임시로 사용한 계산식은 다음과 같다.
<초기 임시 적용한 계산식>
Pulse 수 = 입력 신호 변화 횟수 /2
초당 유량 = Pulse 수 / 5800 x 1000 (ml / Sec)
분당 유량 = 초당 유량 x 60 / 1000 (Liter/min)
총 유량 = 초당 유량 누적치
그 결과 원활하게 동작했고, 다음과 같은 결과물을 얻을 수 있었다. (물론 정확도는 다시 짚어보아야 한다.)

3. 유량계 검증 및 계산식 수정
이렇게 라즈베리파이 피코 보드에서 유량계를 사용할 수 있는 것과 잘 동작하는 것은 확인했지만, 아직 이 유량계가 정확한지를 알 수 없었다.
스펙상으로는 측정오차가 약 2%가 오차 범위라고 했다.
또한 Datasheet에는 다음과 같이 수직 방향으로 설치해야 한다는 주의사항도 있었다. 즉 설치 상태에 따라 측정치에 오류가 생길 수 있다는 의미로 느껴졌다.
이 유량계의 정확도를 확인하기 위해, 그리고 유량 계산 공식이 정확한지를 확인하기 위해, 다음과 같이 물 200을 준비했다. 물은 밀도가 1이므로, 상온에서 물 200g은 상온에서 200ml로 볼 수 있다.
이 물이 유량계를 통과하면서 측정된 총 유량을 살펴볼 계획이었다.
그런데 200g(200ml = 0.2L)를 가지고 측정을 했는데, 유량계에서 측정되는 총 유량은 다음 동영상과 같이 0.1L(100ml)로 나타나는 것이었다. 여러 차례 반복해 시험해도 동일한 100ml였다.
임시로 사용한 유량 환산식에 오류가 있었다는 의미였다.
다만 100ml라는 값은 재현성 있게 측정되었다. 즉 측정의 재현성은 나쁘지 않다는 의미이기도 했다.

결국, 나는 1L에 필요한 펄스의 수가 5800 Pulse가 아니라, 그 절반인 2900 Pulse라는 결론을 얻게 되었다.
내 경험으로는 중국에서 구입한 많은 센서들이 인터넷에 알려진 Data Sheet과 조금 다르게 작동하는 경우가 많았었다 (특히 서보모터). 그랬던 것처럼 이 Flow meter도 일반적으로 인터넷에 알려진 것과 동일한 방식으로 작동하지만, 유량 계산에 사용하는 펄스의 수만 딱 절반이었던 것이다. 과거 서보모터에서 경험한 것과 아주 유사한 경험이었다.
왜 이런 현상이 발생했는지 정확히 알 수는 없지만, 저작권에 대한 문제를 피하기 위해서 원래의 모델에 약간의 변화를 준 것이 아닐까 추정할 뿐이다.
이 때문에 계산식을 다음과 같이 수정하게 되었다.
<최종 계산식>
Pulse 수 = 입력 신호 변화 횟수 /2
초당 유량 = Pulse 수 / 2900(=5800/2) x 1000 (ml / Sec)
분당 유량 = 초당 유량 x 60 / 1000 (Liter/min)
총 유량 = 초당 유량 누적치
그리고 이에 맞게 코드도 다음과 같이 정정했다. 최종적으로 사용한 코드는 다음과 같다.
import machine
import utime
pulse=machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
status=pulse.value()
t0=utime.ticks_ms()
count=0
totalflow=0
p_1liter=5880/2
while True:
if pulse.value()!=status :
count+=1
status=pulse.value()
t1=utime.ticks_ms()
if (t1-t0)>=1000 :
pulse_counted=count/2
print ("Number of Pulses ", pulse_counted)
print ("Flowrate == ", round(pulse_counted/(p_1liter)/(t1-t0)*1000*60, 2), "l/min")
totalflow=totalflow+round(pulse_counted/p_1liter, 2)
print ("Total flow == ", totalflow*1000," ml")
count=0
t0=utime.ticks_ms()
이렇게 유량 환산식을 보정한 후, 동일하게 200ml 물을 가지고 측정한 결과는 다음과 같다.
정상적으로 200ml의 유량이 흘러간 것으로 잘 표시된다.


