Files
mixly3/boards/default_src/micropython/origin/build/lib/hx720.py

70 lines
1.8 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 if raw_data < (1 << (DATA_BITS - 1)) else raw_data - (1 << DATA_BITS)
def tare(self, times=10):
"""清零传感器"""
_values = []
for _ in range(max(times, 5)):
_values.append(self.read_raw())
_values = sorted(_values)[2: -2]
self.offset = sum(_values) / len(_values)
def read_weight(self, times=5):
"""读取重量数据,返回去掉偏移量的平均值"""
_values = []
for _ in range(max(times, 3)):
_values.append(self.read_raw())
_values = sorted(_values)[1: -1]
return round((sum(_values) / len(_values)- self.offset) / self.scale, 2)