14강 / 20강
유량 센서 — I²C 와 CRC 검산
그리고 관 속의 공기를 알려 주는 비트 하나
Sensirion SLF3S 유량계는 I²C 로 말합니다. 공식 파이썬 꾸러미가 있어서 쓰기는 쉽습니다 — 그런데 쉬워서 지나치기 쉬운 것이 둘 있습니다.
from sensirion_i2c_driver import I2cConnection, LinuxI2cTransceiver
from sensirion_i2c_sf06_lf.device import Sf06LfDevice
from sensirion_i2c_sf06_lf.commands import InvFlowScaleFactors
with LinuxI2cTransceiver('/dev/i2c-1') as t:
dev = Sf06LfDevice(I2cConnection(t), slave_address=0x08)
dev.stop_continuous_measurement() # 먼저 멈춘다 (다시 시작하려면)
dev.start_h2o_continuous_measurement() # ← 물용 명령
flow, temp, flags = dev.read_measurement_data(
InvFlowScaleFactors.SLF3S_1300F) # == 500
if flags.air_in_line_flag:
raise RuntimeError("관에 공기가 들었다 — 배치를 중단한다")
I²C 선이 길거나 밸브 잡음이 실리면 값이 깨집니다. CRC 는 그 값을 조용히 쓰는 것을 막아 줍니다.
Python
브라우저에서 실행
가장 헷갈리는 자리 — 눈금은 액체가 아니라 센서에 붙는다
흔한 오해
“에탄올이니까 나눗수를 바꿔야지.”
→ 아닙니다.
→ 아닙니다.
InvFlowScaleFactors.SLF3S_1300F 는 500 으로
액체와 무관하게 같습니다.실제
액체는 시작 명령으로 고릅니다 —
start_h2o_… 인가 start_ipa_… 인가.
그 명령이 센서 안의 보정표를 고릅니다.즉 물 쪽 채널은 h2o 명령, 에탄올 쪽 채널은 ipa 명령으로 시작해야 합니다.
둘 다 h2o 로 시작해 놓고 나눗수만 만지작거리면 /mech 15강에서 본
유량비 틀어짐이 그대로 일어납니다.
※ 에탄올이 IPA 와 완전히 같지는 않으므로, /mech 15강에서 말한
중량법 보정은 여전히 필요합니다. 명령 선택은 출발점이지 끝이 아닙니다.
🤔 확인 문제
에탄올 쪽 유량계를 올바로 쓰려면?
해설 눈금(나눗수)은 센서 모델에 붙고, 액체는 시작 명령으로 고릅니다. 이것을 거꾸로 알면 유량비가 조용히 틀어집니다.
🤔 확인 문제
CRC 검산에 실패한 값을 어떻게 해야 하나?
해설 검산 실패는 “정확도가 떨어진다” 가 아니라 “이 바이트들은 신뢰할 수 없다” 입니다. 버리고 다시 읽으십시오 — 읽기는 재시도해도 안전합니다(13강).