14강 / 20강

유량 센서 — I²C 와 CRC 검산

그리고 관 속의 공기를 알려 주는 비트 하나

유량 센서 — 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 검산에 실패한 값을 어떻게 해야 하나?