【花雕学编程】Arduino TFT 之动态多行中文显示

在这里插入图片描述

《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域,本栏目涵盖了丰富的内容,包括但不限于以下主题:Arduino BLDC、Arduino CNC、Arduino E-Ink、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID、Arduino TFT,以及Arduino智能家居、智慧交通、月球基地、智慧校园和智慧农业等多个方面。我们不仅探讨了这些技术的基础知识和应用领域,还提供了众多具体的参考案例,帮助读者更好地理解和运用Arduino平台进行创新项目。目前,本栏目已有近5000篇相关博客,旨在为广大电子爱好者和开发者提供全面的学习资源与实践指导。通过这些丰富的案例和思路,读者可以获取灵感,推动自己的创作与开发进程。
https://blog.csdn.net/weixin_41659040/category_12422453.html

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述
Arduino TFT 是指与 Arduino 开发板兼容的薄膜晶体管(Thin - Film - Transistor)液晶显示屏,以下是其主要特点、应用场景及注意事项的详细介绍:

一、主要特点
1、高分辨率显示:TFT 显示屏通常具有较高的分辨率,能够提供清晰、细腻的图像和文字显示效果。这使得它可以展示复杂的图形界面、丰富的色彩以及详细的信息,满足各种应用对显示质量的要求。
2、快速响应速度:TFT 技术能够实现快速的像素切换,响应速度比传统的液晶显示屏更快。这意味着在显示动态图像或进行交互操作时,不会出现明显的拖影或延迟,提供流畅的视觉体验。
3、宽视角:具有较宽的可视角度,无论从哪个方向观看显示屏,都能获得清晰的图像和一致的色彩表现。这使得在不同角度下观察显示屏时,都能保证信息的准确传达,方便多人同时查看或在不同位置操作设备。
4、丰富的色彩表现:能够呈现出丰富、鲜艳的色彩,具备较高的色彩饱和度和对比度。可以准确地显示各种颜色,使图像和界面更加生动逼真,适用于需要展示彩色图像或进行视觉交互的应用。
5、易于控制:通过 Arduino 开发板可以方便地对 TFT 显示屏进行控制。借助相应的库函数和代码,能够轻松实现图像绘制、文字显示、触摸交互等功能,降低了开发难度,即使对于没有深厚显示技术背景的开发者也较为友好。

二、应用场景
1、人机交互界面:在各种电子设备中,如智能仪器仪表、智能家居控制系统、工业自动化控制面板等,作为人机交互的窗口,用于显示菜单、参数设置界面、实时数据监测以及操作提示等信息,方便用户与设备进行交互。
2、教育领域:可用于制作教育实验设备、电子学习工具等。例如,在教学机器人中作为显示屏,展示机器人的状态信息、任务指令以及互动内容;在电子积木等教育玩具中,显示图形化的编程界面或游戏画面,增加学习的趣味性和互动性。
3、便携式设备:如手持游戏机、电子书阅读器、便携式多媒体播放器等。其高分辨率、宽视角和丰富的色彩表现能够为用户提供良好的视觉享受,同时快速响应速度也适合处理游戏中的动态画面和多媒体内容的播放。
4、物联网应用:在物联网项目中,作为节点设备的显示屏,用于展示传感器采集的数据、设备状态信息以及远程控制界面等。例如,在环境监测系统中,显示温度、湿度、空气质量等数据;在智能农业中,展示农田的灌溉状态、作物生长信息等。

三、需要注意的事项
1、电源管理:TFT 显示屏通常需要稳定的电源供应,并且其功耗相对较高。在与 Arduino 连接时,要确保电源能够满足显示屏的需求,避免因电源不稳定导致显示屏出现闪烁、显示异常或损坏等问题。同时,要合理设计电源电路,考虑节能措施,特别是在电池供电的设备中,以延长设备的续航时间。
2、接口兼容性:不同型号的 Arduino 开发板和 TFT 显示屏可能具有不同的接口类型和通信协议。在选择和使用时,要确保两者之间的接口兼容,并且正确连接引脚。有些 TFT 显示屏可能需要额外的驱动电路或转接板才能与 Arduino 顺利连接,需要仔细阅读产品说明书并进行相应的配置。
3、显示内存限制:虽然 TFT 显示屏能够显示丰富的内容,但 Arduino 的内存资源有限。在绘制复杂图像或显示大量数据时,可能会遇到内存不足的问题。因此,需要合理规划显示内容,优化图像和数据的存储方式,避免因内存耗尽导致程序崩溃或显示异常。
4、驱动程序和库的使用:为了实现 TFT 显示屏的各种功能,需要使用相应的驱动程序和库。不同的显示屏可能需要不同的库,并且这些库可能会不断更新和改进。在使用过程中,要及时关注官方文档和社区资源,获取最新的驱动程序和库,并了解其使用方法和注意事项。同时,要注意库与 Arduino IDE 版本的兼容性,避免出现编译错误或运行时问题。
5、电磁干扰:在一些电磁环境较为复杂的场合,TFT 显示屏可能会受到电磁干扰,导致显示出现噪点、闪烁或颜色异常等问题。此时,需要采取相应的抗干扰措施,如合理布线、使用屏蔽线、添加滤波电容等,以确保显示屏的稳定工作。

在这里插入图片描述

Arduino TFT动态多行中文显示技术解析

一、主要特点
硬件与显示能力
低成本高分辨率:以ESP32+ST7789V2 TFT屏幕(240x240像素)为例,硬件成本约30元人民币,支持16位色深(65536色),满足中文文本清晰显示需求。
动态刷新机制:通过双缓冲或分页刷新技术,减少屏幕闪烁,实现多行文本的平滑滚动或动态更新。
中文编码与字体支持
字体库集成:使用开源字体库(如GB2312、UTF-8编码的中文点阵字库),将中文字符转换为二进制数组(如const uint8_t HZK16[]),支持16x16、24x24等字号。
动态加载技术:通过SPI Flash或SD卡存储大容量字体数据,避免占用主控芯片内存(如ESP32的4MB Flash可存储多个字号的中文字库)。
多任务与交互性
实时更新能力:结合FreeRTOS或定时器中断,实现多行文本的动态刷新(如滚动新闻、实时数据流)。
触摸屏支持:集成XPT2046等电阻式触摸芯片,支持点击、滑动等交互操作,动态调整显示内容(如切换页面、选择文本)。

二、应用场景
智能家居与物联网终端
设备状态面板:在TFT屏幕上实时显示多行中文信息(如温度、湿度、空气质量),结合触摸屏实现参数调整(如设置阈值)。
远程监控系统:通过Wi-Fi接收服务器推送的中文消息(如报警通知、设备日志),动态刷新多行文本并滚动显示。
工业控制与数据采集
生产看板:在工厂车间部署TFT设备,显示多行中文生产数据(如产量、良率、故障代码),支持历史数据滚动查询。
仪器仪表:将传感器数据(如压力、流量)转换为中文文本,动态更新多行显示,提升可读性。
消费电子与教育设备
电子书阅读器:通过TFT屏幕分页显示中文电子书,支持翻页、书签等交互功能。
教学实验平台:学生可通过此项目学习中文编码、屏幕驱动、多任务编程等技能,适合物联网或嵌入式课程。

三、注意事项
硬件资源优化
内存管理:ESP32的4MB Flash可存储中文字库,但运行内存(520KB SRAM)需谨慎分配,避免动态分配导致堆栈溢出。建议使用静态内存分配或分块加载字体数据。
屏幕引脚定义:TFT_eSPI库需根据屏幕型号(如ST7789V2、ILI9341)修改User_Setup.h文件,确保引脚定义、时序参数正确。
中文编码与显示效率
编码转换:UTF-8编码的中文需转换为点阵字库索引,可通过工具(如FontCreator)生成自定义字库,减少冗余数据。
刷新性能优化:多行文本滚动时,建议仅更新变化部分(如新增行),而非全屏重绘,提升刷新效率。
网络通信与数据同步
API请求与解析:通过HTTP请求获取中文数据(如天气预报、新闻标题),需使用ArduinoJson库解析JSON,提取中文文本字段。
数据缓存:免费API通常有调用频率限制,需在代码中实现本地缓存(如EEPROM或SPIFFS),避免频繁请求。
代码结构与可维护性
模块化设计:将屏幕初始化、中文显示、网络通信封装为独立函数,便于后续扩展(如增加语音播报、二维码显示)。
错误处理:添加网络连接失败、字体加载错误等异常处理逻辑,通过屏幕提示或LED指示灯反馈用户。

在这里插入图片描述

1、基本动态文本滚动

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <Fonts/FreeMono9pt7b.h>

#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8

Adafruit_TFTLCD tft(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(WHITE);
  tft.setTextColor(BLACK);
  tft.setFont(&FreeMono9pt7b);
}

void loop() {
  scrollText("欢迎使用Arduino TFT显示!", 10, 20);
}

void scrollText(String text, int x, int y) {
  int textWidth = text.length() * 10; // 估算文本宽度
  for (int pos = tft.width(); pos > -textWidth; pos--) {
    tft.fillScreen(WHITE); // 清屏
    tft.setCursor(pos, y);
    tft.println(text);
    delay(50); // 控制滚动速度
  }
}

要点解读
使用 Adafruit_GFX 和 Adafruit_TFTLCD 库控制TFT显示屏。
scrollText() 函数实现文本从右向左滚动。
通过 delay(50) 控制滚动速度和流畅度。

2、 循环显示多行文本

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <Fonts/FreeMono9pt7b.h>

#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8

Adafruit_TFTLCD tft(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(WHITE);
  tft.setTextColor(BLACK);
  tft.setFont(&FreeMono9pt7b);
}

void loop() {
  displayLines();
  delay(2000); // 每次显示后暂停
}

void displayLines() {
  tft.fillScreen(WHITE); // 清屏
  tft.setCursor(10, 30);
  tft.println("设备状态:正常");
  
  tft.setCursor(10, 60);
  tft.println("温度:25°C");
  
  tft.setCursor(10, 90);
  tft.println("湿度:60%");
}

要点解读
displayLines() 函数显示多行文本,包含设备状态和传感器数据。
每行文本位置通过 setCursor() 设置,方便变化。
使用 delay(2000) 控制显示间隔,便于用户阅读。

3、动态更新文本显示

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <Fonts/FreeMono9pt7b.h>

#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8

Adafruit_TFTLCD tft(TFT_CS, TFT_DC, TFT_RST);
int temperature = 20;

void setup() {
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(WHITE);
  tft.setTextColor(BLACK);
  tft.setFont(&FreeMono9pt7b);
}

void loop() {
  updateDisplay();
  temperature++; // 模拟温度变化
  if (temperature > 30) temperature = 20; // 温度循环
  delay(1000); // 更新间隔
}

void updateDisplay() {
  tft.fillScreen(WHITE); // 清屏
  tft.setCursor(10, 30);
  tft.println("设备状态:正常");
  
  tft.setCursor(10, 60);
  tft.print("温度:");
  tft.print(temperature);
  tft.println(" °C");
  
  tft.setCursor(10, 90);
  tft.println("湿度:60%");
}

要点解读
updateDisplay() 函数动态更新温度信息,每秒变化一次。
模拟温度变化,演示实时数据更新效果。
通过 fillScreen() 清屏,确保显示信息的准确性。

在这里插入图片描述

4、静态切换多行中文文本

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <U8g2_for_Adafruit_GFX.h>  // 中文支持库

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
U8G2_FOR_ADAFRUIT_GFX u8g2;  // 创建U8G2对象

String lines[] = {
  "今天天气很好",
  "适合出去散步",
  "注意保持社交距离"
};
int currentLine = 0;

void setup() {
  tft.reset();
  tft.begin(0x9341);
  tft.fillScreen(0x0000);  // 黑色背景
  tft.setRotation(1);

  u8g2.begin(tft);  // 初始化U8G2字体支持
  u8g2.setFont(u8g2_font_unifont_t_chinese2);  // 设置中文字体
  u8g2.setFontMode(1);  // 设置字体透明模式
  u8g2.setFontDirection(0);
}

void loop() {
  tft.fillScreen(0x0000);  // 清屏
  u8g2.setCursor(10, 50);  // 设置光标位置
  u8g2.print(lines[currentLine]);  // 显示当前行中文
  currentLine = (currentLine + 1) % 3;  // 切换到下一行
  delay(2000);  // 每2秒切换一次
}

要点解读
中文显示:通过 U8g2_for_Adafruit_GFX 实现中文支持。
多行切换:将内容存储在 String 数组中,逐行动态切换。
字体设置:使用 u8g2_font_unifont_t_chinese2 支持中文。

5、滚动显示多行中文文本

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <U8g2_for_Adafruit_GFX.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
U8G2_FOR_ADAFRUIT_GFX u8g2;

String lines[] = {
  "春眠不觉晓",
  "处处闻啼鸟",
  "夜来风雨声",
  "花落知多少"
};
int scrollOffset = 0;

void setup() {
  tft.reset();
  tft.begin(0x9341);
  tft.fillScreen(0x0000);
  tft.setRotation(1);

  u8g2.begin(tft);
  u8g2.setFont(u8g2_font_unifont_t_chinese2);
  u8g2.setFontMode(1);
}

void loop() {
  tft.fillScreen(0x0000);  // 清屏
  for (int i = 0; i < 4; i++) {
    int y = 50 + (i - scrollOffset) * 30;  // 计算每行的位置
    if (y >= 0 && y <= 240) {  // 确保在屏幕范围内
      u8g2.setCursor(10, y);
      u8g2.print(lines[i]);
    }
  }

  scrollOffset = (scrollOffset + 1) % 4;  // 滚动偏移
  delay(1000);  // 每秒滚动一行
}

要点解读
纵向滚动:通过调整 scrollOffset 实现文本滚动效果。
动态位置计算:根据行号和滚动偏移动态计算每行位置。
屏幕范围限制:确保只显示在屏幕范围内的内容,避免超出边界。

6、通过串口动态更新中文内容

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <U8g2_for_Adafruit_GFX.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
U8G2_FOR_ADAFRUIT_GFX u8g2;

String inputText = "";  // 存储串口接收的内容

void setup() {
  Serial.begin(9600);
  tft.reset();
  tft.begin(0x9341);
  tft.fillScreen(0x0000);
  tft.setRotation(1);

  u8g2.begin(tft);
  u8g2.setFont(u8g2_font_unifont_t_chinese2);
  u8g2.setFontMode(1);

  Serial.println("请输入中文内容:");
}

void loop() {
  // 检查是否有串口输入数据
  while (Serial.available()) {
    char c = Serial.read();
    if (c == '\n') {
      tft.fillScreen(0x0000);  // 清屏
      u8g2.setCursor(10, 50);
      u8g2.print(inputText);  // 显示输入内容
      inputText = "";  // 清空输入缓存
    } else {
      inputText += c;  // 累加接收到的字符
    }
  }
}

要点解读
串口输入:通过 Serial 接收用户输入的中文内容。
动态刷新:输入完成后按回车键清屏并显示新内容。
实时交互:适合需要动态更新内容的应用场景,例如电子公告板。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

### 关于在Arduino上使用LVGL库的示例教程 #### 示例代码解析 为了帮助理解如何在Arduino平台上利用LVGL库构建图形用户界面,下面提供了一个简单的`HelloWorld`实例。此例子展示了基本的初始化过程以及创建一个按钮的方法。 ```cpp #include "lvgl/lvgl.h" #include "lv_arduino.h" void setup() { Serial.begin(9600); // 初始化TFT屏幕和触摸屏 tft.init(); ts.begin(); // 初始化LVGL库 lv_init(); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic display driver initialization*/ disp_drv.flush_cb = my_disp_flush; // 设置刷新回调函数 lv_disp_drv_register(&disp_drv); // 创建一个按钮并设置其属性 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_set_pos(btn1, 10, 10); /*Set its position*/ lv_obj_set_size(btn1, 120, 50); /*Set its size*/ // 给按钮添加标签 lv_obj_t * label = lv_label_create(btn1); lv_label_set_text(label, "Button"); } void loop() { lv_task_handler(); /*Let the GUI do its work*/ delay(5); /*Sleep a bit not to waste resources*/ } ``` 这段代码首先包含了必要的头文件,并定义了`setup()`函数来完成硬件初始化工作[^2]。接着,在屏幕上创建了一个按钮对象,并通过调用`lv_btn_create()`方法将其放置到当前活动窗口中;之后调整位置大小并通过`lv_label_create()`给该按钮附加文字说明。最后,在主循环里不断更新GUI状态以响应事件处理程序。 #### 主要组件解释 - **lvgl/** 文件夹下存放着核心图形引擎及相关模块; - **examples/** 中有多个子目录分别对应不同类型的案例研究,比如最基础的`HelloWorld`入门级应用; - **libraries/** 收录了第三方依赖项和其他支持包; - **tools/** 提供了一些实用工具,例如图像转换器等辅助开发的小应用程序[^5]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值