这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【ESP32TAB5】测试屏幕的刷新功能

共1条 1/1 1 跳转至

【ESP32TAB5】测试屏幕的刷新功能

高工
2026-08-20 11:14:04     打赏
一:屏幕测试如下

Bargraph例程的核心,是一个动态、可视化的柱状图演示程序。它的主要目的是向你展示如何使用M5GFX库在屏幕上绘制和实时更新图形,是对库中基本绘图功能的一个综合演练。

实现的基本功能:

动态柱状图绘制:在屏幕上生成并绘制一组垂直的条形(柱状图),每个条形的高度会持续、随机地变化,模拟出数据流的动态效果。

多彩颜色渲染:每个数据条通常会被赋予不同的颜色,形成一个多彩的图表,以演示M5GFX库的色彩设置能力。

实时画面更新:程序会以一定的频率刷新屏幕,清除旧画面并绘制新画面,从而形成流畅的动画效果,展示了如何在嵌入式设备上实现实时图形刷新。

界面信息显示:屏幕顶部或底部通常会显示一些静态文字(如标题“BarGraph”),构成一个完整的演示界面。

二:程序实现步骤:

2.1 初始化阶段 (setup())

这是程序启动后最先执行的部分,负责准备硬件和屏幕环境。

硬件初始化:M5.begin() 是核心。它会初始化 Tab5 的屏幕、电源管理、I2C 总线等所有板载硬件。这一步是后续一切操作的基础。

屏幕设置:初始化后,程序会设置屏幕的显示方向(如横屏或竖屏),以适应例程的布局设计。

清屏与绘制背景:调用 fillScreen() 函数,用指定的颜色(通常是黑色)填充整个屏幕,清除可能存在的残留画面。

绘制静态元素:在清屏后的背景上,绘制不会变化的UI元素,例如屏幕顶部的标题文字 “BarGraph” 等。

2.2 主循环阶段 (loop())

setup() 执行完毕后,程序会不断重复执行 loop() 函数里的代码,形成动态效果。

生成随机数据:例程使用 random() 函数为每一个柱状条生成一个随机的目标高度值,以此来模拟动态变化的数据。

绘制柱状条:这是最核心的绘图步骤。程序会遍历所有柱状条,并为每一个执行以下操作:

计算坐标与尺寸:根据柱状条的索引(第几个)、屏幕的总宽度和高度,计算出当前柱状条的左上角X、Y坐标,以及它的宽度和高度。

设置颜色:为当前柱状条指定一种颜色(例如,通过一个颜色数组或HSV转换),使每个柱状条的颜色不同。

绘制矩形:调用 fillRect() 函数,用上一步设置的颜色,在计算出的位置绘制一个填充的矩形,即一个柱状条。

控制刷新速度:在所有柱状条绘制完成后,程序会调用 delay() 函数进行一次短暂的阻塞延时。这个延时决定了动画的刷新频率,延时越短,动画看起来越流畅,但也会消耗更多CPU资源。

更新显示:在某些版本的M5GFX或M5Unified框架中,需要显式调用 M5.update() 来将绘图指令真正刷新到屏幕上。这一步确保所有 fillRect() 的绘制结果能最终显示出来。

2.3 程序代码如下所示:

static constexpr size_t BAR_COUNT = 64;
static int max_y[BAR_COUNT];
static int prev_y[BAR_COUNT];
static uint32_t colors[BAR_COUNT];

void setup(void)
{
  display.init();
  display.startWrite();
  display.fillScreen(TFT_BLACK);

  if (display.isEPD())
  {
    display.setEpdMode(epd_mode_t::epd_fastest);
  }
  if (display.width() < display.height())
  {
    display.setRotation(display.getRotation() ^ 1);
  }

  for (int x = 0; x < BAR_COUNT; ++x)
  {
    prev_y[x] = display.height();
    max_y[x] = display.height();
    int r=0,g=0,b=0;
    switch (x >> 4)
    {
    case 0:
      b = 255;
      g = x*0x11;
      break;
    case 1:
      b = 255 - (x&15)*0x11;
      g = 255;
      break;
    case 2:
      g = 255;
      r = (x&15)*0x11;
      break;
    case 3:
      r = 255;
      g = 255 - (x&15)*0x11;
      break;
    }
    colors[x] = display.color888(r,g,b);
  }
}

void loop(void)
{
  int h = display.height();

  static int i;
  ++i;
  display.waitDisplay();
  for (int x = 0; x < BAR_COUNT; ++x)
  {
    int y = (h>>1) - (sinf((float)((x-24)*i) / 3210.0f) + sinf((float)((x-40)*i) / 1234.0f)) * (h>>2);

    int xpos = x * display.width() / BAR_COUNT;
    int w = ((x+1) * display.width() / BAR_COUNT) - xpos - 1;
    if (max_y[x]+1 >= y) { max_y[x] = y-1; }
    else
    {
      if ((i & 3) ==0 )
      {
        display.fillRect(xpos, max_y[x]-3, w, 1, TFT_BLACK);
        max_y[x]++;
      }
    }
    display.fillRect(xpos, max_y[x]-3, w, 3, TFT_WHITE);
    if (prev_y[x] < y)
    {
      display.fillRect(xpos, prev_y[x], w, y - prev_y[x], TFT_BLACK);
    }
    else
    {
      display.fillRect(xpos, y, w, prev_y[x] - y, colors[x]);
    }
    prev_y[x] = y;
  }
  display.display();
}

三:实物验证、总结如下

04-1  bargraph实物演示.png

整个 BarGraph 例程的逻辑非常清晰,遵循了 “初始化 -> 循环生成数据 -> 循环绘制图形” 的标准嵌入式图形程序模式。

它通过 fillRect() 这个基础绘图函数,结合循环和随机数,巧妙地构建出了一个动态的、视觉上可用的柱状图界面。





关键词: ESP32     测试     屏幕    

共1条 1/1 1 跳转至

回复

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