75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
import lgpio
|
|
import time
|
|
|
|
|
|
class HX711:
|
|
def __init__(self, dout, pd_sck, gain=128):
|
|
self.DOUT = dout
|
|
self.PD_SCK = pd_sck
|
|
|
|
self.chip = lgpio.gpiochip_open(0)
|
|
|
|
lgpio.gpio_claim_input(self.chip, self.DOUT)
|
|
lgpio.gpio_claim_output(self.chip, self.PD_SCK)
|
|
|
|
self.GAIN = 1 if gain == 128 else 3 if gain == 64 else 2
|
|
|
|
self.OFFSET = 0
|
|
self.REFERENCE_UNIT = 1
|
|
|
|
self.set_gain(gain)
|
|
|
|
def is_ready(self):
|
|
return lgpio.gpio_read(self.chip, self.DOUT) == 0
|
|
|
|
def set_gain(self, gain):
|
|
if gain == 128:
|
|
self.GAIN = 1
|
|
elif gain == 64:
|
|
self.GAIN = 3
|
|
elif gain == 32:
|
|
self.GAIN = 2
|
|
|
|
self.read_raw()
|
|
|
|
def read_raw(self):
|
|
while not self.is_ready():
|
|
pass
|
|
|
|
data = 0
|
|
for _ in range(24):
|
|
lgpio.gpio_write(self.chip, self.PD_SCK, 1)
|
|
data = (data << 1) | lgpio.gpio_read(self.chip, self.DOUT)
|
|
lgpio.gpio_write(self.chip, self.PD_SCK, 0)
|
|
|
|
for _ in range(self.GAIN):
|
|
lgpio.gpio_write(self.chip, self.PD_SCK, 1)
|
|
lgpio.gpio_write(self.chip, self.PD_SCK, 0)
|
|
|
|
if data & 0x800000:
|
|
data -= 0x1000000
|
|
|
|
return data
|
|
|
|
def set_offset(self, offset):
|
|
self.OFFSET = offset
|
|
|
|
def set_reference_unit(self, value):
|
|
self.REFERENCE_UNIT = value
|
|
|
|
def get_value(self, times=5):
|
|
return sum(self.read_raw() for _ in range(times)) / times
|
|
|
|
def get_weight(self, times=5):
|
|
value = self.get_value(times) - self.OFFSET
|
|
return value / self.REFERENCE_UNIT
|
|
|
|
def power_down(self):
|
|
lgpio.gpio_write(self.chip, self.PD_SCK, 0)
|
|
lgpio.gpio_write(self.chip, self.PD_SCK, 1)
|
|
time.sleep(0.0001)
|
|
|
|
def power_up(self):
|
|
lgpio.gpio_write(self.chip, self.PD_SCK, 0)
|
|
time.sleep(0.0001)
|