沧海笑 发表于 2021-4-17 20:19:53

raspberry pico+hx711电子秤

Raspberry pico+HX711 电子秤 【前言】我做过多款电子秤,这次移植到pico上,显示屏采用复古的lcd-1602,均在micopython下完成。Hx711模块采用m5stack出品的模块,封装比较精致。知识点:(1)lcd-1602(i2c)的micropython驱动(2)hx711的micropython驱动。难度系数:★☆☆☆☆有趣系数:★★☆☆☆
【硬件准备】
序号名称型号备注
1Raspberry pico 树莓派基金会
2称重传感器AD模块Hx711M5satck
3字符型显示屏Lcd1602来自某宝
4称重传感器+秤盘 模块来自某宝,秤盘DIY组装
【软件准备】
序号名称型号备注
1Raspberry pico micropython固件1.14 2021-0316
2LCD1602驱动 https://Github.com/devonschafer/Raspberry_Pi_Pico_I2C_1602_LCD_16x2
3HX711驱动 https://Github.com/SergeyPiskunov/micropython-hx711
【接线】
序号名称Pico-pin 对应pico功能定义
1LCDI2C--SDAPin1GP0
2LCDI2C--SCLPin2GP1
3LCDI2C--VCCPin40VBUS(5V)
4LCDI2C--GNDHX711-GNDPin38GND
5HX711-VCCPin363v3(out)
6Hx711-pd_sckPin6GP4
7Hx711-d_outPin7GP5
【代码及注释】
#date:2021-04-16
#lcd1602 +hx711
#https://Github.com/devonschafer/Raspberry_Pi_Pico_I2C_1602_LCD_16x2
#https://Github.com/SergeyPiskunov/micropython-hx711
#It works

from hx711 import HX711
from utime import sleep_us,sleep
import machine, onewire, ds18x20, utime
from esp8266_i2c_lcd import I2cLcd
from machine import I2C, Pin

DEFAULT_I2C_ADDR = 0x27
# i2c init
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
# say hello and clear screen
lcd.putstr("Hello World !")
sleep(3)
lcd.clear()
lcd.move_to(1, 0)

print("scales begin...")

   
class Scales(HX711):
    def __init__(self, d_out, pd_sck):
      super(Scales, self).__init__(d_out, pd_sck)
      self.offset = 0

    def reset(self):
      self.power_off()
      self.power_on()

    def tare(self):
      self.offset = self.read()

    def raw_value(self):
      return self.read() - self.offset

    def stable_value(self, reads=10, delay_us=500):
      values = []
      for _ in range(reads):
            values.append(self.raw_value())
            sleep_us(delay_us)
      return self._stabilizer(values)
   
    @staticmethod
    def _stabilizer(values, deviation=10):
      weights = []
      for prev in values:
            weights.append(sum())
      return sorted(zip(values, weights), key=lambda x: x).pop()

#scales init
scales = Scales(d_out=5, pd_sck=4)
scales.tare() #setoff

while True:
    lcd.move_to(1, 0)
    val =int(scales.stable_value()*(-0.000482462)*100)/100
    lcd.putstr("Weight = ")
    lcd.putstr(str(val))
    print(val)
    sleep(1)【小结】这是一个小玩具、也是实用器,面包板搭建,后续可以做一个外壳。计算折算系数:系数=100/(100g对应raw值-0g对应raw值)本例题中,系数为-0.000482462。我用了一个100g砝码做了一个简单计算。玩家也可以用更好的方法标定,实际上形变传感器与温度也有关系,在不同季节应该做温度补偿,玩家感兴趣的话也可以进行尝试。沧海抱拳。
代码和需要的库分享如下,库来自github.com,如果使用了别忘记给作者点个星星。谢谢。

rzegkly 发表于 2021-4-18 06:52:28

作品很详细,电路图用哪个设计软件?

沧海笑 发表于 2021-4-18 11:40:07

rzegkly 发表于 2021-4-18 06:52
作品很详细,电路图用哪个设计软件?

电路图就是fritzing。

修图师BOBO 发表于 2021-5-7 15:38:39

for prev in values:             weights.append(sum())

修图师BOBO 发表于 2021-5-7 15:41:54

修图师BOBO 发表于 2021-5-7 15:38
for prev in values:             weights.append(sum(

亲,这一句报错:division by zero。除数为0。好像prev-current是有可能为零的,这个怎么破?

沧海笑 发表于 2021-5-8 11:59:13

修图师BOBO 发表于 2021-5-7 15:41
亲,这一句报错:division by zero。除数为0。好像prev-current是有可能为零的,这个怎么破? ...
您说的这个bug我也曾遇到过,是库的问题,但遇到概率不高。
后续可以换作arduino等玩法。

沧海笑 发表于 2021-6-21 10:38:16

修图师BOBO 发表于 2021-5-7 15:41
亲,这一句报错:division by zero。除数为0。好像prev-current是有可能为零的,这个怎么破? ...

在昨天调试另外一段程序时,出现了uart不同步的问题,也造成了程序中断,后来尝试了用try except语句块捕获并处理异常:
把以下结构嵌入:while True:
    (try:)

出现了除0,丢掉即可,不会造成程序中断。希望能够帮到你。
详情可以搜索:
python try except 捕获 异常

try:
    可能产生异常的代码块
except [ (Error1, Error2, ... ) ]:
    处理异常的代码块1
except [ (Error3, Error4, ... ) ]:
    处理异常的代码块2
except:
    处理其它异常

页: [1]
查看完整版本: raspberry pico+hx711电子秤