如何基于加速度计X/Y输入绘制单个移动点?解决plot像素残留问题
解决加速度计控制单点移动时plot残留的问题
核心问题很明确:plot()方法只会点亮指定像素,不会自动清除之前画的点,所以每次移动后旧点还留在屏幕上。下面给两种实用的解决办法,结合加速度计输入实现单点平滑移动:
方案1:每次更新前清屏(简单直接)
每次计算出新的坐标后,先清空整个屏幕,再绘制新点。优点是逻辑简单,适合入门;缺点是可能会有轻微闪烁。
示例代码逻辑(以MicroPython+SSD1306屏幕+MPU6050加速度计为例):
from machine import I2C, Pin from ssd1306 import SSD1306_I2C from mpu6050 import MPU6050 # 初始化硬件 i2c = I2C(0, scl=Pin(1), sda=Pin(0)) display = SSD1306_I2C(128, 64, i2c) accel = MPU6050(i2c) # 固定y坐标在屏幕中间,只处理左右移动 fixed_y = 32 while True: # 读取加速度计X轴数据 accel_data = accel.accel x_raw = accel_data['x'] # 把加速度计原始值映射到屏幕宽度范围(0-127) screen_x = int((x_raw + 16384) / 32768 * 127) # 清屏+绘制新点+刷新显示 display.fill(0) # 清屏,0表示黑色(熄灭所有像素) display.pixel(screen_x, fixed_y, 1) # 点亮新点,1表示白色 display.show()
方案2:记录旧坐标,只擦除旧点(更流畅)
每次移动时,先把上一次的点熄灭,再点亮新点,这样不会清屏,闪烁感几乎没有,体验更好。
示例代码逻辑:
from machine import I2C, Pin from ssd1306 import SSD1306_I2C from mpu6050 import MPU6050 import time i2c = I2C(0, scl=Pin(1), sda=Pin(0)) display = SSD1306_I2C(128, 64, i2c) accel = MPU6050(i2c) fixed_y = 32 # 初始化旧坐标为屏幕中间 old_x = 64 display.pixel(old_x, fixed_y, 1) display.show() while True: accel_data = accel.accel x_raw = accel_data['x'] screen_x = int((x_raw + 16384) / 32768 * 127) # 只在坐标变化时更新,避免重复操作 if screen_x != old_x: # 擦除旧点 display.pixel(old_x, fixed_y, 0) # 点亮新点 display.pixel(screen_x, fixed_y, 1) display.show() # 更新旧坐标 old_x = screen_x time.sleep(0.01) # 小延时降低刷新频率
注意事项
- 加速度计原始值范围可能因型号不同而变化(比如有些是-2g到2g对应-2048到2048),要根据你的硬件调整映射公式
- 如果屏幕没有
pixel()方法,换成你所用库的plot()方法即可,逻辑完全一致 - 可以给加速度计加个简单校准,比如先读取静止时的X轴偏移值,后续计算时减去这个偏移,避免单点一直偏在一侧
内容的提问来源于stack exchange,提问作者Bernd
相关产品推荐
相关产品推荐

