Miniscale Unit
Miniscale 类用于与迷你称重传感器进行接口连接,该传感器包含一个 HX711 22-bit ADC。该传感器能够测量重量,并且还包含 LED 控制以及多种滤波等附加功能。
支持以下产品:
UiFlow2 应用示例
基本示例
在 UiFlow2 中打开 m5cores3_miniscales_base_example.m5f2 项目。
该示例演示如何从 MiniScale unit 读取并显示重量值。它将平均滤波等级设置为 10,以获得更平滑的读数,并每 1 秒更新一次重量显示。
UiFlow2 代码块:
示例输出:
None
校准示例
在 UiFlow2 中打开 m5cores3_miniscales_calibrate_example.m5f2 项目。
该示例演示 MiniScale 单元的完整校准流程。它引导用户完成三步校准:首先移除所有物品并记录零点 ADC 值,然后放置 100 g 砝码并记录该 ADC 值,最后执行 tare 操作以设置零点。校准完成后,将以平均滤波等级 5 显示重量。
UiFlow2 代码块:
示例输出:
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 代码块:

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 值(整数)。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
adc_value = miniscale_0.adc
- weight()
读取当前重量(克)。
- 返回:
实际重量(扣除皮重值后的 float)。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
weight_value = miniscale_0.weight
- button()
读取按钮状态。
- 返回:
按下时为 True,未按下时为 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
button_state = miniscale_0.button
- tare()
去皮操作。将当前重量记录为偏移值,使后续重量读数以当前值为零点。
UiFlow2 代码块:

MicroPython 代码块:
miniscale_0.tare()
- set_led(r, g, b)
设置 RGB 指示灯颜色。
UiFlow2 代码块:

MicroPython 代码块:
miniscale_0.set_led(255, 0, 0)
- reset()
重置模块内部重量寄存器(清零)。
UiFlow2 代码块:

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. 写入模块以保存校准系数
- 参数:
- 抛出:
ValueError – 如果两个权重相等。
UiFlow2 代码块:

MicroPython 代码块:
miniscale_0.calibration(0, adc_0, 100, adc_100)
- set_low_pass_filter(enabled)
启用或禁用低通滤波器。
- 参数:
enabled (bool) – True 用于启用过滤器,False 用于禁用过滤器。
UiFlow2 代码块:

MicroPython 代码块:
miniscale_0.set_low_pass_filter(True)
- get_low_pass_filter()
获取低通滤波器状态。
- 返回:
如果已启用过滤器,则为 True。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
filter_enabled = miniscale_0.get_low_pass_filter()
- set_average_filter_level(level)
设置平均滤波等级。
- 参数:
level (int) – 平均计数等级(0~50),数值越高表示越平滑,但延迟越大。
- 抛出:
ValueError – 如果超出范围。
UiFlow2 代码块:

MicroPython 代码块:
miniscale_0.set_average_filter_level(10)
- get_average_filter_level()
获取平均滤波等级。
- 返回:
当前平均滤波等级(整数)。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
filter_level = miniscale_0.get_average_filter_level()
- set_ema_filter_alpha(alpha)
设置指数移动平均(EMA)滤波器参数。
EMA(指数移动平均)滤波器相比平均滤波器对数据变化更敏感。
- 参数:
alpha (int) – EMA 滤波系数 (0~99),数值越小越平滑,但响应延迟越大。
- 抛出:
ValueError – 如果超出范围。
UiFlow2 代码块:

MicroPython 代码块:
miniscale_0.set_ema_filter_alpha(50)



