Files
mixly3/boards/default/micropython/build/lib/hx720.py
fredqian 847bddd52f build
2025-01-21 07:44:29 +08:00

68 lines
1.7 KiB
Python

"""
HX720/HX711
Micropython library for the HX720/HX711(Load Cell)
=======================================================
@dahanzimin From the Mixly Team
"""
import time
from machine import Pin
from micropython import const
DATA_BITS = const(24)
READY_TIMEOUT_SEC = const(500)
class HX720:
def __init__(self, sck_pin, dat_pin, scale=500, pulse_obj=1):
self._sck = Pin(sck_pin, Pin.OUT, value=0)
self._dat = Pin(dat_pin, Pin.IN, Pin.PULL_UP)
self._obj = min(max(pulse_obj, 1), 3)
self.scale = scale
self.tare()
def _wait(self):
"""超时响应报错"""
star = time.ticks_ms()
while not self.is_ready():
if time.ticks_diff(time.ticks_ms(), star) > READY_TIMEOUT_SEC:
raise AttributeError("Cannot find a HX711/HX720")
def is_ready(self):
"""检查是否有数据可以读取"""
return self._dat.value() == 0
def set_scale(self, scale):
"""设置比例因子"""
self.scale = scale
def read_raw(self):
"""读取传感器的原始数据"""
if not self.is_ready():
self._wait()
raw_data = 0
for _ in range(DATA_BITS):
self._sck.value(1)
self._sck.value(0)
raw_data = raw_data << 1 | self._dat.value()
# 根据脉冲功能设置多读几次
for _ in range(self._obj):
self._sck.value(1)
self._sck.value(0)
return raw_data | 0xFF000000 if raw_data & 0x800000 else raw_data
def tare(self, times=10):
"""清零传感器"""
total = 0
for _ in range(times):
total += self.read_raw()
self.offset = total / times
def read_weight(self, times=5):
"""读取重量数据,返回去掉偏移量的平均值"""
total = 0
for _ in range(times):
total += self.read_raw()
return round((total / times - self.offset) / self.scale, 2)