auroraAA 发表于 2024-5-30 15:45:46

行空板——智能称重系统

项目简介在我刚开始接触电子爱好时,我得到了一套 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. 安装安装步骤非常简单,只需将两个 py 文件放置在行空板的根目录,然后通过运行程序的 UI 界面进行访问即可。我使用 Visual Studio Code 的 SSH 选项,效果很好。

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

# We import i2c
from pinpong.board import gboard, I2C# The class initializes i2c on init
class DFRobot_HX711_I2C:
    def __init__(self, board=None, i2c_addr=I2C_ADDR, bus_num=0):
      if isinstance(board, int):
            i2c_addr = board
            board = gboard
      elif board is None:
            board = gboard
      self.i2c_addr = i2c_addr
      self._i2c = I2C(bus_num)# It writesand reads from the i2c registers as needed
    def _write_register(self):
      self._i2c.writeto(self.i2c_addr, self.buffer)

    def _read_register(self, length):
      self.rxbuf = self._i2c.readfrom(self.i2c_addr, length)综上,使用 I2C 和 pinpong 上手并不困难。

3. 称重系统
跟之前一样,你可以点这里 查看完整的库,这里的代码突出的是关键部分。首先,逻辑允许设置环境变量进行重量校准和光启用阈值。我使用了手头的一个 50g 的重量。# Weight value
CALIBRATION_WEIGHT_VALUE=50

# Arbitrary value for light sensor to trigger LED ring light
LIGHT_ENABLE_THRESHOLD = 300LED 环配置为使用 Pin 22:NEOPIXEL_PIN = Pin(22)
PIXELS_NUM = 8
neopixel = NeoPixel(NEOPIXEL_PIN, PIXELS_NUM)对于夜灯功能,我使用了一个全局变量,以下是与此相关的一组代码。LIGHT_ENABLE_THRESHOLD = 300
Board("UNIHIKER").begin()
lightEnabled = None

def handleNightMode():
    global lightEnabled
    lightValue = light.read()
    if 0 <= lightValue < LIGHT_ENABLE_THRESHOLD:
      lightEnabled = True
      for i in range(PIXELS_NUM):
            neopixel = (20, 20, 20)
    elif lightEnabled:
      lightEnabled = False
      for i in range(PIXELS_NUM):
            neopixel = (0, 0, 0)

while True:
    handleNightMode()当你初始化板子时,它会提供一组功能,例如光传感器。在这种情况下,每次循环迭代都会读取光传感器的值,并与之前配置的光传感器阈值进行比较。如果光传感器检测到低于阈值的值,则 LED 以每个通道 20 的值启用。如果光值超过阈值,则 LED 环禁用。称重系统主要通过以下代码进行设置:hx711_sensor = DFRobot_HX711_I2C()
hx711_sensor.begin()

# Weight display
weightText = gui.draw_text(text="0.00 g", x=20, y=180, font_size=34, color="teal")

while True:
    ...
    # Update the weight display
    weight = hx711_sensor.weight(10)
    weightText.config(text="{:.2f} g".format(weight))系统获取重量时会进行 10 次迭代以获取平均值,然后更新显示重量的文本。此外,称重系统还包含一些附加逻辑。这些功能包括称重系统的校准和去皮功能,以及指示它们是否处于活动状态的状态文本。默认情况下,状态文本显示为“正在称重”:state = gui.draw_text(text="Current State: Weighing", x=30, y=80, font_size=10, color="blue")如果状态被更新为其他内容,则会在 5 秒后恢复为称重状态。# Track the time when the state was last changed
last_state_change_time = time.time()
initial_state_set = False

while True:
    ...
    # Check and update the state to "Current State: Weighing" if needed
    if not initial_state_set and (time.time() - last_state_change_time) >= 5:
      state.config(text="Current State: Weighing")
      initial_state_set = True可以更新此状态文本的两个元素是按钮。按钮 A 用于校准,按钮 B 用于去皮。CALIBRATION_WEIGHT_VALUE=50

while True:
    ...
    # Check if button A is pressed for calibration
    if button_a.is_pressed() == True:
      state.config(text="Current State: Calibrating {}g".format(CALIBRATION_WEIGHT_VALUE))
      last_state_change_time = time.time()
      hx711_sensor.setTriggerWeight(CALIBRATION_WEIGHT_VALUE)
      hx711_sensor.setCalThreshold(1)
      hx711_sensor.enableCalibration()
      i = 0
      while hx711_sensor.peelFlag() != 2:
            time.sleep(1)
            i += 1
            if i >= 7:
                break
      calibration = hx711_sensor.calibration()
      state.config(text="Calibrated: {:.2f}".format(calibration))
      hx711_sensor.setCalibration(calibration)
      last_state_change_time = time.time()
      initial_state_set = False校准逻辑使用设置为环境变量的克重值。当你按下按钮时,系统使用该环境变量更新传感器,并开始等待添加重量的过程。在时限内添加重量后,它会进行校准并更新显示校准值的 UI。while True:
    ...
    # Check if button B is pressed for tare (peel)
    if button_b.is_pressed() == True:
      state.config(text="Current State: Peeled")
      last_state_change_time = time.time()
      hx711_sensor.peel()
      initial_state_set = False按下按钮 B 后,系统显示去皮状态,并激活传感器的去皮功能。


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







原文链接: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
可以拿去打鬼称

刘睿鹏 发表于 2024-6-21 18:42:09

可以反烧秤
页: [1]
查看完整版本: 行空板——智能称重系统