133 lines
3.0 KiB
Python
133 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
LoadCell - Raspberry Pi Python library for HX711 load cell amplifier
|
|
|
|
하드웨어 연결:
|
|
- HX711 [VCC] -> Pi 5 [Pin 1] (3.3V)
|
|
- HX711 [GND] -> Pi 5 [Pin 6] (GND)
|
|
- HX711 [DT] -> Pi 5 [Pin 29] (GPIO5)
|
|
- HX711 [SCK] -> Pi 5 [Pin 31] (GPIO6)
|
|
"""
|
|
|
|
from HX711 import SimpleHX711, Rate
|
|
import time
|
|
|
|
# HX711 핀 설정
|
|
DT_PIN = 5 # GPIO5 -> 29번 핀
|
|
SCK_PIN = 6 # GPIO6 -> 31번 핀
|
|
|
|
# 설정 변수
|
|
CALIBRATION_FACTOR = -411.17 # 캘리브레이션 팩터
|
|
measure_delay = 0.1 # 측정 간격 (초)
|
|
density = 1.0 # 기본값: 물 (1.0 g/ml)
|
|
|
|
# 상태 변수
|
|
is_calibrated = False
|
|
offset_value = 0
|
|
|
|
# HX711 인스턴스
|
|
hx = None
|
|
|
|
|
|
def init_hx711():
|
|
"""HX711 초기화"""
|
|
global hx
|
|
print("HX711 초기화 중...")
|
|
print(f" DT 핀: GPIO{DT_PIN} (Pin 29)")
|
|
print(f" SCK 핀: GPIO{SCK_PIN} (Pin 31)")
|
|
|
|
try:
|
|
hx = SimpleHX711(DT_PIN, SCK_PIN, 1, 0, Rate.HZ_10)
|
|
print("HX711 연결 성공!")
|
|
return True
|
|
except Exception as e:
|
|
print(f"HX711 연결 실패: {e}")
|
|
print("배선 확인 필요")
|
|
return False
|
|
|
|
|
|
def perform_calibration():
|
|
"""캘리브레이션 수행"""
|
|
global is_calibrated, offset_value
|
|
|
|
if is_calibrated:
|
|
return
|
|
|
|
print()
|
|
print("-" * 50)
|
|
print(">> 최초 캘리브레이션 진행")
|
|
print("-" * 50)
|
|
print("로드셀 위에 아무것도 올리지 마세요!")
|
|
print("2초 후 영점 조정을 시작합니다...")
|
|
time.sleep(2)
|
|
|
|
print("영점 조정 중...")
|
|
|
|
|
|
# 10번 읽어서 평균값을 오프셋으로 사용
|
|
readings = []
|
|
for _ in range(10):
|
|
readings.append(hx.read())
|
|
time.sleep(0.1)
|
|
|
|
offset_value = sum(readings) / len(readings)
|
|
|
|
print(">> 캘리브레이션 완료!")
|
|
print(f"현재 오프셋 값: {offset_value:.2f}")
|
|
print()
|
|
|
|
is_calibrated = True
|
|
|
|
|
|
def tare():
|
|
"""영점 조정 함수"""
|
|
global offset_value
|
|
|
|
print("\n>> 영점 조정 중...")
|
|
print(" 로드셀 위에 아무것도 올리지 마세요")
|
|
time.sleep(1)
|
|
|
|
readings = []
|
|
for _ in range(10):
|
|
readings.append(hx.read())
|
|
time.sleep(0.1)
|
|
|
|
offset_value = sum(readings) / len(readings)
|
|
print(">> 영점 조정 완료!\n")
|
|
|
|
|
|
def get_weight():
|
|
"""무게 측정 함수"""
|
|
raw_value = hx.read()
|
|
|
|
# (RAW 값 - 오프셋) / 캘리브레이션 팩터 = 무게
|
|
weight_g = (raw_value - offset_value) / CALIBRATION_FACTOR
|
|
weight_g = max(0, weight_g) # 음수 값 방지
|
|
|
|
# 밀도 적용 (부피 계산)
|
|
volume_ml = weight_g / density
|
|
|
|
return weight_g, volume_ml
|
|
|
|
|
|
def main():
|
|
if not init_hx711():
|
|
return
|
|
|
|
perform_calibration()
|
|
|
|
print("무게 측정 테스트 (10회):")
|
|
print("-" * 50)
|
|
|
|
for i in range(10):
|
|
weight_g, volume_ml = get_weight()
|
|
print(f" [{i+1:2d}] {weight_g:.1f}g / {volume_ml:.1f}ml")
|
|
time.sleep(measure_delay)
|
|
|
|
print("-" * 50)
|
|
print("테스트 완료")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|