Embedded/RaspberryPI

Raspberry Pi에서 유량센서(YF-B10-S)로 유량계산하기

변화의 물결1 2024. 11. 14. 11:38

 

 

 

안녕하세요. 

 

 이전 글에서 유량센서(YF-B10-S) 제품에 대해서 확인해 보았습니다. 이번 글에서는 실제로 어떻게 값을 구할 수 있는지, Raspberry Pi를 이용해서 확인해 보겠습니다. 

 

 

 

 

YF-B10-S(유량센서) 확인해 보기

안녕하세요.  사이드 프로젝트로 유량파악해서 ModbusTCP로 전달이 필요하다는 요청을 받았습니다. 우선 유량을 확인할 수 있는 센서를 확인해 보겠습니다.  파이프 규격과 재질에 따라 가격과

remnant24c1.tistory.com

 


 

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)을 계산합니다.

(실제 배관을 연결해서 테스트해 보면 좋겠지만, 입으로 불어서 동작여부만 확인했습니다.)

 

 유량측정 전문 분야가 아니다 보니 정확하지 않을 수 있습니다. 대략 이렇게 가능하겠구나 참고정도하시면 어떨까 합니다. 잘못된 부분이 있다면 서슴없이 댓글 부탁드립니다. ~~

 

 

감사합니다.

 

 

 

반응형