2024-5-30 15:45:46 [显示全部楼层]
650浏览
查看: 650|回复: 2

[项目] 行空板——智能称重系统

[复制链接]
项目简介
在我刚开始接触电子爱好时,我得到了一套 HX711 重量传感器套件。这个传感器套件附带一个适用于 micropython 的库,并且可以通过 I2C 接口进行访问,因此非常适合用来进行一个小项目。我修改代码使其适用于 circuitpython,并使其在我的 Adafruit Clue 上运行。之后,我觉得可以在行空板上做一个类似的项目。
行空板是 DFRobot 推出的一款带触摸屏功能的单板计算机。它运行定制版的 Debian 操作系统,并提供 Pinpong 库来与各种 GPIO 进行接口。在这个项目中,我将控制一个 LED 环,使用板载按钮和光传感器,并通过 I2C 与 HX711 重量传感器套件进行通信。
项目代码可以在这里找到:https://github.com/Cosmic-Bee/unihiker_scale


功能
这个称重系统的功能很简单:
  • 称重:在秤上放置物体来测量其重量(单位为克)。
  • 校准:按下右侧上方的按钮进行校准,使用一个 50g(可配置)重量进行校准。
  • 去皮:按下右侧下方的按钮进行去皮,将当前重量重置为 0g。


3D打印支架

为这个项目,我设计并制作了一个简单的 3D 打印支架。这个支架有一个槽,用于插入行空板的金手指接口,另外还有背部支撑件。打印时不需要任何支撑材料,且只需较少的填充。从测试结果来看,支架的平衡效果很好。LED 环的两个孔之间距离为 28 毫米,使用 m2 螺丝进行连接。

行空板——智能称重系统图1


代码部分
1. 安装
安装步骤非常简单,只需将两个 py 文件放置在行空板的根目录,然后通过运行程序的 UI 界面进行访问即可。我使用 Visual Studio Code 的 SSH 选项,效果很好。

2. HX711 库
在使用 DFRobot 的 HX711 I2C Python 实现时,我遇到了一些问题(可能缺少关键的初始化步骤),所以我选择自己的逻辑作为起点,并将 circuitpython 代码转换为 pinpong。你可以点这里查看完整的库,但这里的代码我已经删掉了一些部分来突出 I2C 的使用。

  1. # We import i2c
  2. from pinpong.board import gboard, I2C
复制代码
  1. # The class initializes i2c on init
  2. class DFRobot_HX711_I2C:
  3.     def __init__(self, board=None, i2c_addr=I2C_ADDR, bus_num=0):
  4.         if isinstance(board, int):
  5.             i2c_addr = board
  6.             board = gboard
  7.         elif board is None:
  8.             board = gboard
  9.         self.i2c_addr = i2c_addr
  10.         self._i2c = I2C(bus_num)
复制代码
  1. # It writes  and reads from the i2c registers as needed
  2.     def _write_register(self):
  3.         self._i2c.writeto(self.i2c_addr, self.buffer)
  4.     def _read_register(self, length):
  5.         self.rxbuf = self._i2c.readfrom(self.i2c_addr, length)
复制代码
综上,使用 I2C 和 pinpong 上手并不困难。

3. 称重系统
跟之前一样,你可以点这里 查看完整的库,这里的代码突出的是关键部分。首先,逻辑允许设置环境变量进行重量校准和光启用阈值。我使用了手头的一个 50g 的重量。
  1. # Weight value
  2. CALIBRATION_WEIGHT_VALUE=50
  3. # Arbitrary value for light sensor to trigger LED ring light
  4. LIGHT_ENABLE_THRESHOLD = 300
复制代码
LED 环配置为使用 Pin 22:
  1. NEOPIXEL_PIN = Pin(22)
  2. PIXELS_NUM = 8
  3. neopixel = NeoPixel(NEOPIXEL_PIN, PIXELS_NUM)
复制代码
对于夜灯功能,我使用了一个全局变量,以下是与此相关的一组代码。
  1. LIGHT_ENABLE_THRESHOLD = 300
  2. Board("UNIHIKER").begin()
  3. lightEnabled = None
  4. def handleNightMode():
  5.     global lightEnabled
  6.     lightValue = light.read()
  7.     if 0 <= lightValue < LIGHT_ENABLE_THRESHOLD:
  8.         lightEnabled = True
  9.         for i in range(PIXELS_NUM):
  10.             neopixel[i] = (20, 20, 20)
  11.     elif lightEnabled:
  12.         lightEnabled = False
  13.         for i in range(PIXELS_NUM):
  14.             neopixel[i] = (0, 0, 0)
  15. while True:
  16.     handleNightMode()
复制代码
当你初始化板子时,它会提供一组功能,例如光传感器。在这种情况下,每次循环迭代都会读取光传感器的值,并与之前配置的光传感器阈值进行比较。如果光传感器检测到低于阈值的值,则 LED 以每个通道 20 的值启用。如果光值超过阈值,则 LED 环禁用。
称重系统主要通过以下代码进行设置:
  1. hx711_sensor = DFRobot_HX711_I2C()
  2. hx711_sensor.begin()
  3. # Weight display
  4. weightText = gui.draw_text(text="0.00 g", x=20, y=180, font_size=34, color="teal")
  5. while True:
  6.     ...
  7.     # Update the weight display
  8.     weight = hx711_sensor.weight(10)
  9.     weightText.config(text="{:.2f} g".format(weight))
复制代码
系统获取重量时会进行 10 次迭代以获取平均值,然后更新显示重量的文本。此外,称重系统还包含一些附加逻辑。这些功能包括称重系统的校准和去皮功能,以及指示它们是否处于活动状态的状态文本。默认情况下,状态文本显示为“正在称重”:
  1. state = gui.draw_text(text="Current State: Weighing", x=30, y=80, font_size=10, color="blue")
复制代码
如果状态被更新为其他内容,则会在 5 秒后恢复为称重状态。
  1. # Track the time when the state was last changed
  2. last_state_change_time = time.time()
  3. initial_state_set = False
  4. while True:
  5.     ...
  6.     # Check and update the state to "Current State: Weighing" if needed
  7.     if not initial_state_set and (time.time() - last_state_change_time) >= 5:
  8.         state.config(text="Current State: Weighing")
  9.         initial_state_set = True
复制代码
可以更新此状态文本的两个元素是按钮。按钮 A 用于校准,按钮 B 用于去皮。
  1. CALIBRATION_WEIGHT_VALUE=50
  2. while True:
  3.     ...
  4.     # Check if button A is pressed for calibration
  5.     if button_a.is_pressed() == True:
  6.         state.config(text="Current State: Calibrating {}g".format(CALIBRATION_WEIGHT_VALUE))
  7.         last_state_change_time = time.time()
  8.         hx711_sensor.setTriggerWeight(CALIBRATION_WEIGHT_VALUE)
  9.         hx711_sensor.setCalThreshold(1)
  10.         hx711_sensor.enableCalibration()
  11.         i = 0
  12.         while hx711_sensor.peelFlag() != 2:
  13.             time.sleep(1)
  14.             i += 1
  15.             if i >= 7:
  16.                 break
  17.         calibration = hx711_sensor.calibration()
  18.         state.config(text="Calibrated: {:.2f}".format(calibration))
  19.         hx711_sensor.setCalibration(calibration)
  20.         last_state_change_time = time.time()
  21.         initial_state_set = False
复制代码
校准逻辑使用设置为环境变量的克重值。当你按下按钮时,系统使用该环境变量更新传感器,并开始等待添加重量的过程。在时限内添加重量后,它会进行校准并更新显示校准值的 UI。
  1. while True:
  2.     ...
  3.     # Check if button B is pressed for tare (peel)
  4.     if button_b.is_pressed() == True:
  5.         state.config(text="Current State: Peeled")
  6.         last_state_change_time = time.time()
  7.         hx711_sensor.peel()
  8.         initial_state_set = False
复制代码
按下按钮 B 后,系统显示去皮状态,并激活传感器的去皮功能。


项目总结
我会写一篇关于我使用行空板的经验的文章,到目前为止体验总体不错。虽然希望文档更详细些,但我并没有遇到太多困难,整体使用还是很愉快的。

行空板——智能称重系统图2


行空板——智能称重系统图3


行空板——智能称重系统图4


原文链接:https://community.dfrobot.com/makelog-314325.html
原作者:CosmicBee


hnyzcj  版主

发表于 2024-5-31 07:00:18

可以拿去打鬼称
回复

使用道具 举报

auroraAA  管理员
 楼主|

发表于 2024-6-5 16:00:33

hnyzcj 发表于 2024-5-31 07:00
可以拿去打鬼称

回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail