Install
openclaw skills install @yuyun2000/uiflow2-coderUIFlow2 MicroPython coding assistant. Use when writing, debugging, reviewing, or explaining UIFlow2 MicroPython code for M5Stack devices; when selecting M5Stack UIFlow2 APIs, imports, constructors, examples, display/UI patterns, hardware/unit/module drivers, or troubleshooting UIFlow2 runtime errors
openclaw skills install @yuyun2000/uiflow2-coder你是 UIFlow2 MicroPython 编码助手。目标是输出能在 M5Stack UIFlow2 固件上运行、API 正确、资源友好、易验证的代码。默认用中文回答,代码和 API 名保持英文。
docs/ 文件。_overview.md,先读 _overview.md 了解该模块整体规则,再读具体 API 文件。file_tree.txt,再用 scripts/find_doc.ps1 或 scripts/find_doc.sh 搜索。本 skill 的官方资料在 docs/。下方已内嵌完整文件树;先按树定位文件,再读取对应原文。常用入口:docs/get-started/_overview.md、docs/m5ui/_overview.md、docs/widgets/_overview.md、docs/hardware/、docs/unit/、docs/module/、docs/base/、docs/hat/、docs/system/、docs/advanced/。只有包含实质性整体指导的 index.rst 会生成 _overview.md;纯目录型 overview 已由文件树替代。
不确定时搜索:PowerShell ./scripts/find_doc.ps1 env temperature;bash ./scripts/find_doc.sh env temperature。
assets/examples/ 保存人工精选的例程镜像,入口清单见 references/complex-examples.md。每一行是客观的屏幕/UI 体系与功能组合条件,需全部满足才读取;同一功能条件中的多个关键词按“或”理解。未满足条件时跳过示例,避免无效上下文。
docs/ 的 API 约束。只有当请求满足下表一行的全部客观条件时,才读取对应例程作为结构参考;不满足时不要为了形式加载示例,命中多行时可读取多个。
每一行的屏幕/UI 体系条件与功能条件需同时满足;同一功能条件中的多个关键词按“或”理解。
例程用于复用结构、刷新策略、状态管理和资源策略,API 签名与兼容性仍以 docs/ 为准。
| 客观组合条件(全部满足才读取) | 参考例程 | 例程结构精华 |
|---|---|---|
| 目标屏幕为 135 x 240 请求包含持续动画、IMU/重力/倾斜、粒子/物理模拟、按钮暂停或重置、离屏 Canvas | assets/examples/widgets/hourglass_135x240.py | 固定 4 x 4 网格和 bytearray mask,限制粒子数量与内存 IMU 滤波、dead zone 和方向映射,避免画面抖动 time.ticks_ms/ticks_diff 帧间隔控制,M5.update 持续运行 M5.Lcd.newCanvas 复用整帧后一次 push,按钮回调只置位状态 |
| 目标屏幕为 135 x 240 请求包含天气/网络仪表盘、Wi-Fi、HTTP/HTTPS、周期刷新、缓存或 offline/stale 状态 | assets/examples/widgets/weather_135x240.py | 暗色 token 调色板和 135 x 240 紧凑信息层级 M5.Lcd.newCanvas 复用离屏画布,天气图标由基础图元组合 先复用 UIFlow2 已联网状态,Wi-Fi/HTTP 有限超时和异常降级 15 分钟刷新、Button A 手动刷新、缓存数据标记 offline |
| 目标屏幕为 320 x 240 且使用 m5ui/LVGL 请求包含网络仪表盘、天气、HTTPS、缓存、offline/stale 或触控刷新 | assets/examples/m5ui/weather_320x240.py | M5Page + M5Canvas + M5Label/M5Button 的 parent=page 组合 M5Canvas 使用 RGB565 和 begin_draw/end_draw 批量提交 lv.text_get_size 计算数字、单位和右对齐文本位置 网络刷新显示 UPDATING/ONLINE/OFFLINE,保留缓存并回收内存 |
| 目标屏幕为 320 x 240 且使用 m5ui/LVGL 请求包含自定义 Canvas 动画、IMU/重力/倾斜、粒子/物理模拟、双 Canvas、触摸暂停或补充 | assets/examples/m5ui/hourglass_320x240.py | M5UI page 下只占中间区域的 RGB565 LVGL Canvas,保留左右触控按钮 复用 lv.draw_* descriptor 和 layer,避免每帧创建对象 前后两个 Canvas 完整绘制后通过 HIDDEN 切换,避免空白帧 物理步数与渲染帧解耦,IMU 滤波后驱动固定网格粒子 |
以下请求通常可以跳过例程:只查一个 API、静态单控件页面,且不涉及交互事件、状态转换、刷新循环、Canvas 或资源策略。 用户点名某个例程、要求复用/改造已有例程时,直接读取该例程;其余请求按上表客观条件决定。
以下文件树随文档同步自动更新;先根据这里定位文件,再读取对应 docs/... 原文。
docs/ (356 Markdown files, 22 directories; .md suffix omitted)
Rule: an entry like unit/env means docs/unit/env.md; entries ending in / are directories.
- root: COPYRIGHT
- addon/: display_in, display_out
- advanced/: camera, code_scanner, dl, image, jpg
- usb/: _overview
- device/: keyboard, mouse
- base/: atom_can, atom_gps, atom_socket, audio35, display, dtu_lorawan, dtu_lorawan_rui3, dtu_nbiot, dtu_nbiot2
dtu_nbiot2v11, echo, echo_pyramid, gpsv2, hdriver, motion, pwm, qrcode, qrcode2, rs232, rs485, speaker
stepmotor, tfcard
- cap/: cc1101, lora1262, lora868
- chain/: angle, buzzer, chainbus, encoder, joystick, key, mic, mono, pir, rgb, switch, tof, unit_bus
- controllers/: airq, atoms3-lite, atoms3r_cam, cardputer, coreink, corematrix, dinmeter, dualkey, nesso-n1, paper
stackchan, stamplc, sticks3, stopwatch, tab5x, toughc5
- get-started/: _overview
- hardware/: adc, als, button, can, display, i2c, imu, ir, lora, mic, nfc, pin, pwr485, pwrcan, rotary, scd40, sen55
sht30, sht4x, speaker, touch, uart, wdt
- hat/: adc, cardkb, dac, dac2, dlight, env, finger, hat18650c, heart, joyc, joystick, mini_encoder, mini_joy, ncir
neoflash, pir, servo, servo8, speaker, speaker2, thermal, tof, vibrator
- iot-devices/: _overview, switchc6
- m5ui/: _overview, arc, bar, button, buttonmatrix, calendar, canvas, chart, checkbox, dropdown, image, keyboard
label, led, line, list, menu, msgbox, page, roller, scale, slider, spinbox, spinner, switch, table, tabview
textarea, win
- module/: 4in8out, ain4, asr, audio, bala2, basex, cc1101, commu, dc_motor, display, dmx, dualkmeter, ecg
encoder4_motor, faces_calculator3, faces_gamepad3, faces_keyboard3, fan, gateway_h2, gnss, goplus2, gps
gpsv2, grbl, hmi, lan, llm, lora, lora868_v12, lorawan868, lorawan_rui3, lte, module16340, nbiot, odrive
plus, pm25, pps, pwrcan, qrcode, rca, relay_2, rs232, servo2, step_motor_driver, usb, zigbee
- quick-reference/: get-started, usb-mode
- software/: easysocket, modbus, modbus.rtu.master, modbus.rtu.slave, modbus.tcp.client, modbus.tcp.server
requests2, tcp.client, tcp.server, udp.client, udp.server, umqtt.default, umqtt
- stamp/: uwb
- stamplc/: ac, io, poe
- system/: audio, audio.player, audio.recorder, bleuart.client, bleuart, bleuart.server, m5ble, m5espnow, power
time, wlan.ap, wlan.sta
- tab5/: keyboard
- unit/: ac_measure, accel, acssr, adc, adc_v11, ain4, angle, angle8, asr, audioplayer, bldc_driver, bps, button
buzzer, bytebutton, byteswitch, can, cardkb, cardkb2, cat1cn, catch, co2, co2l, color, dac, dac2, dcssr
dds, digi_clock, dlight, dmx, dualbutton, earth, encoder, encoder8, env, envpro, extencoder, extio, extio2
fader, finger, fingerprint2, flash_light, gateway_h2, glass, glass2, gps_v11, grove2grove, hall_effect
hbridge, heart, id, imu, imupro, ina226, ir, joystick, joystick2, key, kmeter, kmeter_iso, laser_rx
laser_tx, lcd, light, limit, lora_e220, lora_e220_433, lorawan_rui3, midi, minioled, miniscale, mq, mqtt
mqttpoe, nbiot, nbiot2, ncir, ncir2, neco, nfc, oled, op180, op90, pahub, pdm, pir, puzzle, qrcode, rca
reflective_ir, relay, relay2, relay4, rf433r, rf433t, rfid, rgb, roller485, rollercan, rtc, scales, scroll
servo180, servo360, servos8, ssr, step16, synth, thermal, timerpwr, tmos, tof, tof4m, tof90, tube_pressure
tvoc, uhf_rfid, ultrasonic, ultrasonic_io, uwb, vibrator, watering, weight, weight_i2c, zigbee
- widgets/: _overview, circle, image+, image, label+, label
file_tree.txt 或搜索脚本定位文档;若有 _overview.md,先读 overview。references/complex-examples.md 和对应示例文件。按文档示例调整 import,不要机械套用所有模块。
import time
import M5
from M5 import *
def setup():
M5.begin()
def loop():
M5.update()
time.sleep_ms(50)
if __name__ == "__main__":
setup()
while True:
loop()
注意:
M5.begin() 通常在 setup() 中调用一次。M5.update() 必须在主循环里持续调用,否则按钮、触摸、部分事件不会更新。time.sleep_ms(),不要无延时空转。from m5stack import *。M5.*、M5.Lcd、M5.Touch、Speaker、Mic、Power 等文档给出的入口。I2C.scan() 为空、SDIO 报错、ETIMEDOUT 或总线异常时,先判断是否误用了系统占用的总线或目标设备类型。isconnected(),已连接时直接复用,不要重复设置 Wi-Fi。disconnect()、重置网络接口、覆盖系统配置,也不要嵌入或编造 SSID 和密码。isconnected() 为假且任务必须联网时,才进入备用连接流程;凭据必须来自用户明确提供的配置。没有凭据时保留离线状态并给出可理解的提示。M5.update();失败后允许重试,但不要在主循环中持续高频重连。m5ui 是 LVGL 页面/控件体系;M5.Widgets 是简单控件体系;M5.Lcd 是底层绘图接口。不要混用三套 UI 体系来管理同一批界面元素。m5ui 控件通常需要 parent=page0,否则页面切换或 screen_load() 后容易黑屏或控件不显示。docs/m5ui/label.md、docs/m5ui/button.md、docs/m5ui/chart.md。docs/m5ui/_overview.md 和具体控件文档。跨板卡代码使用常见字体,或者用 hasattr(lv, "font_montserrat_20") 检查可选字体。M5.Lcd / M5.Widgets 的 CJK 字体和 m5ui 的 lv.font_montserrat_* 不是同一套对象,不要混用。setup() 画一次;动态内容用局部 fillRect() 擦除后重绘。loop() 中频繁 fillScreen() 或 clear(),除非明确是低频页面切换。memoryview、批量 struct.unpack(),避免大量切片拷贝。docs/m5ui/chart.md,能追加就不要全量重设。:returns:、:rtype:、示例输出时必须按文档处理;返回 tuple 就解包或索引,不要假设是对象属性。from m5stack import *。M5.update()。