안녕하세요.
이전 글에서 유량센서(YF-B10-S) 제품에 대해서 확인해 보았습니다. 이번 글에서는 실제로 어떻게 값을 구할 수 있는지, Raspberry Pi를 이용해서 확인해 보겠습니다.
1. 유량센서 테스트 환경
- 라즈베리 파이 CM4
- YF-B10-S 유량 센서 (하네스 SM 3핀 Female 커넥터 장착)
- 10kΩ 풀업 저항 (NPN 출력 신호 안정화용)
- 점퍼 와이어 혹은 연결 커넥터 하네스 커넥터(SM 3핀 Male)
2. 케이블 연결
1) 유량 센서 핀 정의
VCC(RED) : 센서의 전원 입력 (DC 3.5~24V)
OUT(YELLOW) : 펄스 출력
GND(BLACK) : 접지
2) 연결 방법
유량센서의 VCC 핀을 라즈베리 파이의 5V 핀에 연결합니다.
유량센서의 GND 핀을 라즈베리 파이의 GND 핀에 연결합니다.
유량센서의 OUT 핀을 라즈베리 파이의 GPIO 핀 중 하나에 연결합니다 (예: GPIO 17).
유량센서의 OUT 핀과 VCC 사이에 10kΩ 풀업 저항을 연결하여 출력 신호를 안정화합니다.
3. 소프트웨어 설정
1) Rasbperry Pi 설치
- 이미 라즈베리파이가 OS를 설치했다면 다음으로 넘어가면 됩니다.
- 테스트는 Raspberry Pi CM4에 Raspbian OS (Bookworm 64bit)를 설치한 후 진행했습니다.
2) 패키지 설치
$ sudo apt update
$ sudo apt upgrade
RPi.GPIO 라이브러리가 설치되어 있지 않다면, 아래와 같이 설치합니다.
$ pip install RPi.GPIO
3) 소스코드 작성
(1) 센서 설정 및 초기 변수 정의
FLOW_SENSOR_PIN = 17 # 센서를 연결한 GPIO 핀 번호
PULSES_PER_LITER = 595 # 센서의 1L당 펄스 수
pulse_count = 0
start_time = time.time()
FLOW_SENSOR_PIN: 유량 센서의 출력 핀을 라즈베리 파이의 어느 GPIO 핀에 연결했는지 지정합니다. 여기서는 GPIO 17번 핀을 사용하고 있습니다.
PULSES_PER_LITER: 이 센서는 1리터의 물이 흐를 때마다 약 595개의 펄스를 발생시킵니다. 이 값을 사용하여 유량을 리터 단위로 계산합니다.
pulse_count: 펄스를 세기 위한 변수로, 유량을 측정할 때마다 이 값이 증가합니다.
start_time: 측정 시작 시간을 저장합니다. 유량 계산 시, 경과 시간을 계산하기 위해 사용됩니다.
(2) 펄스 카운트 함수
def count_pulse(channel):
global pulse_count
pulse_count += 1
count_pulse: 펄스가 발생할 때마다 호출되는 함수입니다. 이 함수는 pulse_count를 1씩 증가시키며, 센서가 물의 흐름에 따라 펄스를 생성할 때마다 펄스 수를 기록합니다.
channel: 이 매개변수는 펄스를 감지한 GPIO 핀을 의미하며, RPi.GPIO 라이브러리가 자동으로 전달합니다.
(3) GPIO 설정 및 이벤트 감지
GPIO.setmode(GPIO.BCM)
GPIO.setup(FLOW_SENSOR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(FLOW_SENSOR_PIN, GPIO.FALLING, callback=count_pulse)
GPIO.setmode(GPIO.BCM): 라즈베리 파이 핀 번호 체계를 설정합니다. BCM 방식은 GPIO 핀 번호를 사용할 수 있도록 합니다.
GPIO.setup: FLOW_SENSOR_PIN을 입력 핀으로 설정하고, 풀업 저항을 활성화합니다. 풀업 저항은 센서 출력이 안정적으로 HIGH와 LOW로 전환되도록 합니다.
GPIO.add_event_detect: FLOW_SENSOR_PIN에 펄스가 발생(FALLING 엣지)할 때마다 count_pulse 함수를 호출하여 펄스를 기록합니다.
(4) 유량 계산 루프
try:
while True:
time.sleep(10)
end_time = time.time()
elapsed_time = end_time - start_time
flow_rate = (pulse_count / PULSES_PER_LITER) * (60 / elapsed_time)
print(f"Flow Rate: {flow_rate:.2f} L/min")
pulse_count = 0
start_time = time.time()
while True: 이 루프는 무한 루프 형태로, 유량을 지속적으로 측정합니다.
time.sleep(10): 10초 동안 대기하여 측정 주기를 설정합니다. 10초마다 유량을 측정하도록 하는 역할을 합니다.
elapsed_time: end_time과 start_time의 차이를 계산하여 경과 시간을 구합니다. 유량 계산 시 사용됩니다.
flow_rate: flow_rate = (pulse_count / PULSES_PER_LITER) * (60 / elapsed_time) 식을 통해 유량을 L/min 단위로 계산합니다. (pulse_count / PULSES_PER_LITER)는 펄스를 리터 단위(595)로 변환하고, (60 / elapsed_time)을 곱해 분 단위로 환산합니다.
print(f"Flow Rate: {flow_rate:.2f} L/min"): 측정된 유량을 L/min 단위로 출력합니다.
pulse_count = 0, start_time = time.time(): 다음 측정을 위해 펄스 카운트와 시작 시간을 초기화합니다.
(5) 전체 소스 코드
import RPi.GPIO as GPIO
import time
# 센서 설정
FLOW_SENSOR_PIN = 17 # 연결한 GPIO 핀 번호
PULSES_PER_LITER = 595 # 1L 물당 약 595 펄스 발생
# 펄스 카운트를 위한 변수
pulse_count = 0
start_time = time.time()
# 펄스가 발생할 때마다 카운트 증가
def count_pulse(channel):
global pulse_count
pulse_count += 1
# GPIO 설정
GPIO.setmode(GPIO.BCM)
GPIO.setup(FLOW_SENSOR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(FLOW_SENSOR_PIN, GPIO.FALLING, callback=count_pulse)
try:
while True:
# 측정 간격 설정 (10초)
time.sleep(10)
# 시간 계산
end_time = time.time()
elapsed_time = end_time - start_time
# 유량 계산 (L/min)
# 10초 동안의 유량이므로 6을 곱해 1분당 유량으로 변환
flow_rate = (pulse_count / PULSES_PER_LITER) * (60 / elapsed_time)
# 결과 출력
print(f"Flow Rate: {flow_rate:.2f} L/min")
# 카운트와 시간 초기화
pulse_count = 0
start_time = time.time()
except KeyboardInterrupt:
print("Measurement stopped")
finally:
GPIO.cleanup()
4. 실행결과
유량센서의 펄스 출력을 라즈베리파이에서 설정한 주기적으로 읽어 유량(L/min)을 계산합니다.
(실제 배관을 연결해서 테스트해 보면 좋겠지만, 입으로 불어서 동작여부만 확인했습니다.)
유량측정 전문 분야가 아니다 보니 정확하지 않을 수 있습니다. 대략 이렇게 가능하겠구나 참고정도하시면 어떨까 합니다. 잘못된 부분이 있다면 서슴없이 댓글 부탁드립니다. ~~
감사합니다.