You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于加速度计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:25:15