行空板——智能称重系统
项目简介在我刚开始接触电子爱好时,我得到了一套 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
可以拿去打鬼称
嘘 可以反烧秤
页:
[1]