项目简介 在我刚开始接触电子爱好时,我得到了一套 HX711 重量传感器套件。这个传感器套件附带一个适用于 micropython 的库,并且可以通过 I2C 接口进行访问,因此非常适合用来进行一个小项目。我修改代码使其适用于 circuitpython,并使其在我的 Adafruit Clue 上运行。之后,我觉得可以在行空板上做一个类似的项目。 行空板是 DFRobot 推出的一款带触摸屏功能的单板计算机。它运行定制版的 Debian 操作系统,并提供 Pinpong 库来与各种 GPIO 进行接口。在这个项目中,我将控制一个 LED 环,使用板载按钮和光传感器,并通过 I2C 与 HX711 重量传感器套件进行通信。
功能
这个称重系统的功能很简单:
- 称重:在秤上放置物体来测量其重量(单位为克)。
- 校准:按下右侧上方的按钮进行校准,使用一个 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 writes and 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 = 300
复制代码
LED 环配置为使用 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[i] = (20, 20, 20)
- elif lightEnabled:
- lightEnabled = False
- for i in range(PIXELS_NUM):
- neopixel[i] = (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
|