70 lines
1.8 KiB
Python
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)
|