599浏览
查看: 599|回复: 6

[教程] raspberry pico+hx711电子秤

[复制链接]
Raspberry pico+HX711 电子秤
【前言】
我做过多款电子秤,这次移植到pico上,显示屏采用复古的lcd-1602,均在micopython下完成。Hx711模块采用m5stack出品的模块,封装比较精致。
知识点:(1lcd-1602(i2c)micropython驱动
2hx711的micropython驱动。
难度系数:★☆☆☆☆
有趣系数:★★☆☆☆
allpic.jpg

【硬件准备】
序号
名称
型号
备注
1
Raspberry pico
树莓派基金会
2
称重传感器AD模块
Hx711
M5satck
3
字符型显示屏
Lcd1602
来自某宝
4
称重传感器+秤盘
模块来自某宝,秤盘DIY组装
【软件准备】
序号
名称
型号
备注
1
Raspberry pico micropython固件
1.14
2021-0316
2
LCD1602驱动
https://Github.com/devonschafer/Raspberry_Pi_Pico_I2C_1602_LCD_16x2
3
HX711驱动
https://Github.com/SergeyPiskunov/micropython-hx711
【接线】
hx711pic.PNG
序号
名称
Pico-pin
对应pico功能定义
1
LCDI2C--SDA
Pin1
GP0
2
LCDI2C--SCL
Pin2
GP1
3
LCDI2C--VCC
Pin40
VBUS(5V)
4
LCDI2C--GND
HX711-GND
Pin38
GND
5
HX711-VCC
Pin36
3v3(out)
6
Hx711-pd_sck
Pin6
GP4
7
Hx711-d_out
Pin7
GP5
【代码及注释】

  1. #date:2021-04-16
  2. #lcd1602 +hx711
  3. #https://Github.com/devonschafer/Raspberry_Pi_Pico_I2C_1602_LCD_16x2
  4. #https://Github.com/SergeyPiskunov/micropython-hx711
  5. #It works
  6. from hx711 import HX711
  7. from utime import sleep_us,sleep
  8. import machine, onewire, ds18x20, utime
  9. from esp8266_i2c_lcd import I2cLcd
  10. from machine import I2C, Pin
  11. DEFAULT_I2C_ADDR = 0x27
  12. # i2c init
  13. i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
  14. lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
  15. # say hello and clear screen
  16. lcd.putstr("Hello World !")
  17. sleep(3)
  18. lcd.clear()
  19. lcd.move_to(1, 0)
  20. print("scales begin...")
  21.    
  22. class Scales(HX711):
  23.     def __init__(self, d_out, pd_sck):
  24.         super(Scales, self).__init__(d_out, pd_sck)
  25.         self.offset = 0
  26.     def reset(self):
  27.         self.power_off()
  28.         self.power_on()
  29.     def tare(self):
  30.         self.offset = self.read()
  31.     def raw_value(self):
  32.         return self.read() - self.offset
  33.     def stable_value(self, reads=10, delay_us=500):
  34.         values = []
  35.         for _ in range(reads):
  36.             values.append(self.raw_value())
  37.             sleep_us(delay_us)
  38.         return self._stabilizer(values)
  39.    
  40.     @staticmethod
  41.     def _stabilizer(values, deviation=10):
  42.         weights = []
  43.         for prev in values:
  44.             weights.append(sum([1 for current in values if abs(prev - current) / (prev / 100) <= deviation]))
  45.         return sorted(zip(values, weights), key=lambda x: x[1]).pop()[0]
  46. #scales init
  47. scales = Scales(d_out=5, pd_sck=4)
  48. scales.tare() #setoff
  49. while True:
  50.     lcd.move_to(1, 0)
  51.     val =int(scales.stable_value()*(-0.000482462)*100)/100
  52.     lcd.putstr("Weight = ")
  53.     lcd.putstr(str(val))
  54.     print(val)
  55.     sleep(1)
复制代码
【小结】
这是一个小玩具、也是实用器,面包板搭建,后续可以做一个外壳。
计算折算系数:
系数=100/(100g对应raw-0g对应raw值)
本例题中,系数为-0.000482462。我用了一个100g砝码做了一个简单计算。玩家也可以用更好的方法标定,实际上形变传感器与温度也有关系,在不同季节应该做温度补偿,玩家感兴趣的话也可以进行尝试。
沧海抱拳。

代码和需要的库分享如下,库来自github.com,如果使用了别忘记给作者点个星星。谢谢。
upload.zip (5.89 KB, 下载次数: 32)

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([1 for current in values if abs(prev - current) / (prev / 100) <= deviation]))
回复

使用道具 举报

修图师BOBO  学徒

发表于 2021-5-7 15:41:54

修图师BOBO 发表于 2021-5-7 15:38
for prev in values:             weights.append(sum([1 for current in values if abs(prev - current) / ...

亲,这一句报错: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语句块捕获并处理异常:
把以下结构嵌入:
  1. while True:
  2.     (try:)
复制代码


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

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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail