Miniscale Unit

Miniscale 类用于与迷你称重传感器进行接口连接,该传感器包含一个 HX711 22-bit ADC。该传感器能够测量重量,并且还包含 LED 控制以及多种滤波等附加功能。

支持以下产品:

MINISCALE

UiFlow2 应用示例

基本示例

在 UiFlow2 中打开 m5cores3_miniscales_base_example.m5f2 项目。

该示例演示如何从 MiniScale unit 读取并显示重量值。它将平均滤波等级设置为 10,以获得更平滑的读数,并每 1 秒更新一次重量显示。

UiFlow2 代码块:

m5cores3_miniscales_base_example.png

示例输出:

None

校准示例

在 UiFlow2 中打开 m5cores3_miniscales_calibrate_example.m5f2 项目。

该示例演示 MiniScale 单元的完整校准流程。它引导用户完成三步校准:首先移除所有物品并记录零点 ADC 值,然后放置 100 g 砝码并记录该 ADC 值,最后执行 tare 操作以设置零点。校准完成后,将以平均滤波等级 5 显示重量。

UiFlow2 代码块:

m5cores3_miniscales_calibrate_example.png

示例输出:

None

MicroPython 应用示例

基本示例

该示例演示如何从 MiniScale unit 读取并显示重量值。它将平均滤波等级设置为 10,以获得更平滑的读数,并每 1 秒更新一次重量显示。

MicroPython 代码块:

 1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5
 6import os, sys, io
 7import M5
 8from M5 import *
 9import m5ui
10import lvgl as lv
11from hardware import I2C
12from hardware import Pin
13from unit import MiniScaleUnit
14import time
15
16
17page0 = None
18label_title = None
19label_weight = None
20i2c0 = None
21miniscales_0 = None
22last_time = None
23weight = None
24
25
26def setup():
27    global page0, label_title, label_weight, i2c0, miniscales_0, last_time, weight
28
29    M5.begin()
30    Widgets.setRotation(1)
31    m5ui.init()
32    page0 = m5ui.M5Page(bg_c=0xFFFFFF)
33    label_title = m5ui.M5Label(
34        "MiniScales",
35        x=94,
36        y=5,
37        text_c=0x0000FF,
38        bg_c=0xFFFFFF,
39        bg_opa=0,
40        font=lv.font_montserrat_24,
41        parent=page0,
42    )
43    label_weight = m5ui.M5Label(
44        "Weights: -- g",
45        x=81,
46        y=90,
47        text_c=0x0000FF,
48        bg_c=0xFFFFFF,
49        bg_opa=0,
50        font=lv.font_montserrat_24,
51        parent=page0,
52    )
53
54    i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=100000)
55    miniscales_0 = MiniScaleUnit(i2c0)
56    miniscales_0.set_average_filter_level(10)
57    page0.screen_load()
58
59
60def loop():
61    global page0, label_title, label_weight, i2c0, miniscales_0, last_time, weight
62    M5.update()
63    if (time.ticks_diff((time.ticks_ms()), last_time)) >= 1000:
64        last_time = time.ticks_ms()
65        weight = int(miniscales_0.weight)
66        label_weight.set_text(str((str("Weight: ") + str((str(weight) + str(" g"))))))
67
68
69if __name__ == "__main__":
70    try:
71        setup()
72        while True:
73            loop()
74    except (Exception, KeyboardInterrupt) as e:
75        try:
76            m5ui.deinit()
77            from utility import print_error_msg
78
79            print_error_msg(e)
80        except ImportError:
81            print("please update to latest firmware")

示例输出:

None

校准示例

该示例演示 MiniScale 单元的完整校准流程。它引导用户完成三步校准:首先移除所有物品并记录零点 ADC 值,然后放置 100 g 砝码并记录该 ADC 值,最后执行 tare 操作以设置零点。校准完成后,将以平均滤波等级 5 显示重量。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8import m5ui
  9import lvgl as lv
 10from hardware import I2C
 11from hardware import Pin
 12from unit import MiniScaleUnit
 13import time
 14
 15
 16page0 = None
 17label_weight = None
 18button0 = None
 19label_tip = None
 20label_title = None
 21i2c0 = None
 22miniscales_0 = None
 23state = None
 24adc_0 = None
 25adc_100 = None
 26last_time = None
 27weight = None
 28
 29
 30def button0_short_clicked_event(event_struct):
 31    global \
 32        page0, \
 33        label_weight, \
 34        button0, \
 35        label_tip, \
 36        label_title, \
 37        i2c0, \
 38        miniscales_0, \
 39        state, \
 40        adc_0, \
 41        adc_100, \
 42        last_time, \
 43        weight
 44    Speaker.tone(888, 200)
 45    if state == 0:
 46        state = 1
 47        adc_0 = miniscales_0.adc
 48        print((str("ADC0 Value: ") + str(adc_0)))
 49        label_tip.set_text(str("Put 100g weight, then press button."))
 50    elif state == 1:
 51        state = 2
 52        adc_100 = miniscales_0.adc
 53        print((str("ADC100 Value: ") + str(adc_100)))
 54        print("do calibrate")
 55        miniscales_0.calibration(0, adc_0, 100, adc_100)
 56        label_tip.set_text(str("Remove all items, then press button."))
 57    elif state == 2:
 58        state = 3
 59        print("tare the scale")
 60        print((str("Tare: ") + str((str((miniscales_0.weight)) + str(" g")))))
 61        miniscales_0.tare()
 62        label_tip.set_text(str("Weight"))
 63        label_tip.set_flag(lv.obj.FLAG.HIDDEN, True)
 64        button0.set_flag(lv.obj.FLAG.HIDDEN, True)
 65        miniscales_0.set_average_filter_level(5)
 66
 67
 68def button0_event_handler(event_struct):
 69    global \
 70        page0, \
 71        label_weight, \
 72        button0, \
 73        label_tip, \
 74        label_title, \
 75        i2c0, \
 76        miniscales_0, \
 77        state, \
 78        adc_0, \
 79        adc_100, \
 80        last_time, \
 81        weight
 82    event = event_struct.code
 83    if event == lv.EVENT.SHORT_CLICKED and True:
 84        button0_short_clicked_event(event_struct)
 85    return
 86
 87
 88def setup():
 89    global \
 90        page0, \
 91        label_weight, \
 92        button0, \
 93        label_tip, \
 94        label_title, \
 95        i2c0, \
 96        miniscales_0, \
 97        state, \
 98        adc_0, \
 99        adc_100, \
100        last_time, \
101        weight
102
103    M5.begin()
104    Widgets.setRotation(1)
105    m5ui.init()
106    page0 = m5ui.M5Page(bg_c=0xFFFFFF)
107    label_weight = m5ui.M5Label(
108        "Weight: ",
109        x=14,
110        y=90,
111        text_c=0x0000FF,
112        bg_c=0xFFFFFF,
113        bg_opa=0,
114        font=lv.font_montserrat_24,
115        parent=page0,
116    )
117    button0 = m5ui.M5Button(
118        text="Button",
119        x=116,
120        y=160,
121        bg_c=0x2196F3,
122        text_c=0xFFFFFF,
123        font=lv.font_montserrat_16,
124        parent=page0,
125    )
126    label_tip = m5ui.M5Label(
127        "Tip:",
128        x=10,
129        y=50,
130        text_c=0x000000,
131        bg_c=0xFFFFFF,
132        bg_opa=0,
133        font=lv.font_montserrat_16,
134        parent=page0,
135    )
136    label_title = m5ui.M5Label(
137        "MiniScales",
138        x=93,
139        y=5,
140        text_c=0x0000FF,
141        bg_c=0xFFFFFF,
142        bg_opa=0,
143        font=lv.font_montserrat_24,
144        parent=page0,
145    )
146
147    button0.add_event_cb(button0_event_handler, lv.EVENT.ALL, None)
148
149    i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=100000)
150    miniscales_0 = MiniScaleUnit(i2c0)
151    page0.screen_load()
152    label_tip.set_text(str("Remove all items, then press button."))
153    label_weight.set_text(str("Weight: -- g"))
154    label_weight.align_to(page0, lv.ALIGN.CENTER, 0, 0)
155    state = 0
156    button0.set_size(100, 50)
157    button0.align_to(page0, lv.ALIGN.CENTER, 0, 60)
158    Speaker.begin()
159    Speaker.setVolumePercentage(0.6)
160    Speaker.tone(888, 200)
161
162
163def loop():
164    global \
165        page0, \
166        label_weight, \
167        button0, \
168        label_tip, \
169        label_title, \
170        i2c0, \
171        miniscales_0, \
172        state, \
173        adc_0, \
174        adc_100, \
175        last_time, \
176        weight
177    M5.update()
178    if state == 3:
179        if (time.ticks_diff((time.ticks_ms()), last_time)) >= 1000:
180            last_time = time.ticks_ms()
181            weight = int(miniscales_0.weight)
182            label_weight.set_text(str((str("Weight:  ") + str((str(weight) + str(" g"))))))
183            label_weight.align_to(page0, lv.ALIGN.CENTER, 0, 0)
184
185
186if __name__ == "__main__":
187    try:
188        setup()
189        while True:
190            loop()
191    except (Exception, KeyboardInterrupt) as e:
192        try:
193            m5ui.deinit()
194            from utility import print_error_msg
195
196            print_error_msg(e)
197        except ImportError:
198            print("please update to latest firmware")

示例输出:

None

API参考

MiniScaleUnit

class unit.miniscale.MiniScaleUnit(i2c, address=0x26)

创建一个 MiniScaleUnit 对象。

参数:
  • i2c (I2C | PAHUBUnit) – 用于通信的 I2C 或 PAHUBUnit 实例。

  • address (int) – MiniScale 单元的 I2C 地址,默认为 0x26。

UiFlow2 代码块:

init.png

MicroPython 代码块:

from unit import MiniScaleUnit
from hardware import I2C, Pin

i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=100000)
miniscale_0 = MiniScaleUnit(i2c0)
adc()

读取原始 ADC 值(未处理)。

返回:

原始 ADC 值(整数)。

返回类型:

int

UiFlow2 代码块:

get_adc.png

MicroPython 代码块:

adc_value = miniscale_0.adc
weight()

读取当前重量(克)。

返回:

实际重量(扣除皮重值后的 float)。

返回类型:

float

UiFlow2 代码块:

get_weight.png

MicroPython 代码块:

weight_value = miniscale_0.weight
button()

读取按钮状态。

返回:

按下时为 True,未按下时为 False。

返回类型:

bool

UiFlow2 代码块:

get_button.png

MicroPython 代码块:

button_state = miniscale_0.button
tare()

去皮操作。将当前重量记录为偏移值,使后续重量读数以当前值为零点。

UiFlow2 代码块:

tare.png

MicroPython 代码块:

miniscale_0.tare()
set_led(r, g, b)

设置 RGB 指示灯颜色。

参数:
  • r (int) – 红色分量(0~255)。

  • g (int) – 绿色分量(0~255)。

  • b (int) – 蓝色分量(0~255)。

UiFlow2 代码块:

set_led.png

MicroPython 代码块:

miniscale_0.set_led(255, 0, 0)
reset()

重置模块内部重量寄存器(清零)。

UiFlow2 代码块:

reset.png

MicroPython 代码块:

miniscale_0.reset()
calibration(weight1_g, weight1_adc, weight2_g, weight2_adc)

校准模块增益(GAP 值)。

校准流程示例:1. 重置 offset 2. 读取空载 ADC(RawADC_0g)3. 放置已知重量(例如 100 g)并读取 ADC(RawADC_100g)4. 计算 GAP = (RawADC_100g - RawADC_0g) / 100 5. 写入模块以保存校准系数

参数:
  • weight1_g (float) – 第一个点的重量(单位:g)。

  • weight1_adc (int) – 第一个点的 ADC 值。

  • weight2_g (float) – 第二个点的重量(单位:g)。

  • weight2_adc (int) – 第二个点的 ADC 值。

抛出:

ValueError – 如果两个权重相等。

UiFlow2 代码块:

calibration.png

MicroPython 代码块:

miniscale_0.calibration(0, adc_0, 100, adc_100)
set_low_pass_filter(enabled)

启用或禁用低通滤波器。

参数:

enabled (bool) – True 用于启用过滤器,False 用于禁用过滤器。

UiFlow2 代码块:

set_low_pass_filter.png

MicroPython 代码块:

miniscale_0.set_low_pass_filter(True)
get_low_pass_filter()

获取低通滤波器状态。

返回:

如果已启用过滤器,则为 True。

返回类型:

bool

UiFlow2 代码块:

get_low_pass_filter.png

MicroPython 代码块:

filter_enabled = miniscale_0.get_low_pass_filter()
set_average_filter_level(level)

设置平均滤波等级。

参数:

level (int) – 平均计数等级(0~50),数值越高表示越平滑,但延迟越大。

抛出:

ValueError – 如果超出范围。

UiFlow2 代码块:

set_average_filter_level.png

MicroPython 代码块:

miniscale_0.set_average_filter_level(10)
get_average_filter_level()

获取平均滤波等级。

返回:

当前平均滤波等级(整数)。

返回类型:

int

UiFlow2 代码块:

get_average_filter_level.png

MicroPython 代码块:

filter_level = miniscale_0.get_average_filter_level()
set_ema_filter_alpha(alpha)

设置指数移动平均(EMA)滤波器参数。

EMA(指数移动平均)滤波器相比平均滤波器对数据变化更敏感。

参数:

alpha (int) – EMA 滤波系数 (0~99),数值越小越平滑,但响应延迟越大。

抛出:

ValueError – 如果超出范围。

UiFlow2 代码块:

set_ema_filter_alpha.png

MicroPython 代码块:

miniscale_0.set_ema_filter_alpha(50)
get_ema_filter_alpha()

获取 EMA 滤波器系数。

返回:

当前 EMA alpha 值(整数)。

返回类型:

int

UiFlow2 代码块:

get_ema_filter_alpha.png

MicroPython 代码块:

ema_alpha = miniscale_0.get_ema_filter_alpha()