这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【成果帖】基于树莓派2和SenseHAT的像素风桌面环境检测仪和水平仪

共1条 1/1 1 跳转至

【成果帖】基于树莓派2和SenseHAT的像素风桌面环境检测仪和水平仪

菜鸟
2026-06-13 00:15:29     打赏

多功能环境看板与动态流体水平仪系统实现

本项旨在基于树莓派与 Sense HAT 打造一款兼具美学动效与工业级平滑度的嵌入式仪表盘系统。系统通过状态机架构,实现了在“动态环境看板”与“流体阻尼水平仪”两大核心功能间的无缝切换。

1. 系统框图

系统整体的数据流向与业务逻辑如下面的 Mermaid 框图所示:

mermaid-1781283945108.jpeg

2. 电路原理与接线说明

Sense HAT 采用了 直插式(Hat-on-top) 的物理结构设计,无需传统的面包板和跳线连接。

  • 供电接口:通过 40-pin GPIO 中的 5V 和 GND 引脚直接获取电源。

  • 通信总线:传感器数据通过标准 I2C 总线(GPIO 2 为 SDA,GPIO 3 为 SCL)与树莓派主 SoC 进行双向通信。

  • 摇杆控制:摇杆的五个方向映射为普通的 GPIO 输入中断,由底层驱动统一捕获。

  • 防短路设计:在树莓派 5 上使用时,建议在 GPIO 排针处加装加长排母或铜柱,确保 Sense HAT 触点不会压到树莓派 5 独有的 PCIe 柔性排线接口或高负载散热片。

    3. 运行步骤

  • 准备工作:确保树莓派已成功安装操作系统,且 I2C 功能已通过 raspi-config 开启。

  • 代码部署:将完整的 Python 脚本命名为 sense_dashboard.py 并保存至用户目录(例如 /home/pi/)。

  • 执行程序:打开终端,输入以下命令启动系统:python sense_dashboard.py

  • 后台挂载(可选):若需长期稳定运行,可使用命令 nohup python3 sense_dashboard.py > dashboard.log 2>&1 & 将其挂入后台。

    4. 核心代码片段及解析

    本系统的最大亮点在于对数字水平仪小球引入了一阶低通滤波算法。以下是该算法的核心实现:

import math

smooth_x = 3.5  # X 轴物理缓冲器(初始指向画布中心)
smooth_y = 3.5  # Y 轴物理缓冲器

def update_level_display_fluid(sense):
    """
    一阶低通滤波流体阻尼数字水平仪核心引擎
    """
    global smooth_x, smooth_y

    # 1. 读取纯净的原始重力加速度数据(单位:g)
    accel = sense.get_accelerometer_raw()
    
    # 2. 硬件去零偏(基准扣除)
    ax = accel['x'] - bias_ax
    ay = accel['y'] - bias_ay

    # 3. 姿态学换算:利用反三角函数将加速度矢量转化为倾斜角度(弧度转角度)
    roll = math.atan2(ax, 1.0) * (180.0 / math.pi)
    pitch = math.atan2(ay, 1.0) * (180.0 / math.pi)

    # 4. 核心算法参数配置
    MAX_ANGLE = 22.0  # 满量程映射角(倾斜 22 度时水泡到达边界)
    ALPHA = 0.18      # 低通滤波系数(越小阻尼感、油性越强)
    DEADZONE = 1.0    # 中心 1.0 度绝对容错死区(彻底消除末端滞后晃荡)

    # 5. 引入死区控制,计算当前帧的目标裸位置 (target)
    if abs(roll) < DEADZONE:
        target_x = 3.5
    else:
        target_x = 3.5 - (roll / MAX_ANGLE) * 3.5  # 符号对齐

    if abs(pitch) < DEADZONE:
        target_y = 3.5
    else:
        target_y = 3.5 - (pitch / MAX_ANGLE) * 3.5  # 符号对齐

    # 6. 输入端防噪硬限幅(Clamping)
    # 在进入滤波器前强行截断异常突变噪声,保护滤波器不被突变脏数据污染
    target_x = max(0.0, min(7.0, target_x))
    target_y = max(0.0, min(7.0, target_y))

    # 7. 执行核心一阶低通滤波公式(流体阻尼数学模型)
    smooth_x = ALPHA * target_x + (1.0 - ALPHA) * smooth_x
    smooth_y = ALPHA * target_y + (1.0 - ALPHA) * smooth_y

    # 8. 离散化渲染:四舍五入映射到 8x8 有限像素矩阵
    x = max(0, min(7, int(round(smooth_x))))
    y = max(0, min(7, int(round(smooth_y))))

    # 9. 生成 64 像素画布缓冲区
    canvas = [(0, 0, 0)] * 64
    
    # 黄金参考准心线(当水泡进入中心 2x2 时亮起青色准心)
    if x in [3, 4] and y in [3, 4]:
        canvas[3*8+3] = canvas[3*8+4] = canvas[4*8+3] = canvas[4*8+4] = (0, 255, 255)

    # 绘制当前水泡位置
    canvas[y*8 + x] = (240, 240, 240)
    sense.set_pixels(canvas)


【核心算法解析】

如果直接将陀螺仪读取的角度进行坐标映射(即只采用 target_x 和 target_y),手部的任何细微颤抖都会导致 LED 屏幕上的光点疯狂跳动。

通过引入一阶低通滤波公式 Smooth=α⋅Target+(1−α)⋅Smooth.old,新位置 smooth_x 仅保留了当前真实测量值的 18%(ALPHA),而继承了上一帧位置的 82%。这种数学模型在软件层为虚拟小球注入了“质量”与“粘滞阻尼感”,使其在滑动时呈现出如同液体中气泡浮动的极佳视觉质感。

5. 效果演示说明

frame

plant

snow

  • 环境动效模式(默认):开机后,点阵屏会根据当前环境温度展现不同的“呼吸式像素画”。温度大于 28.0 摄氏度时,火焰像素帧会高频交叉跳动;温度低于 18.0 摄氏度时,会有雪花闪烁;而在舒适温度下,则是暗绿与亮绿交替的盆栽呼吸动效。按下摇杆中键,整个屏幕会以横向推屏卷轴的动画效果,滑入当前温湿度的精确数字看板。

demo

  • 流体水平仪模式:向右拨动摇杆,屏幕干净切入水平仪模式。当整个装置完全水平时,中心的 2 * 2 准心会亮起青色(Cyan)参考线;倾斜树莓派,白色光点会丝滑地向倾斜方向滑动,向左拨动摇杆则可一键返回环境模式。

   




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]