【花雕学编程】Arduino LCD 之逐像素控制

在这里插入图片描述

《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、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 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
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 LCD:专业视角下的全面解析
在嵌入式系统开发中,LCD(Liquid Crystal Display)液晶显示屏是实现信息可视化和人机交互的重要组成部分。Arduino 作为广泛应用的开源硬件平台,其对多种类型 LCD 屏幕的良好支持,使得开发者能够快速构建低成本、高可用性的显示系统。

一、主要特点

  1. 接口种类丰富
    字符型 LCD(如 16x2、20x4):使用 HD44780 控制器,常见于基础教学项目;
    图形点阵 LCD(如 128x64 OLED、TFT 彩色屏):支持自由绘图,适合复杂界面;
    通信方式多样:
    并行接口(8位/4位模式)
    I²C 接口(节省引脚资源)
    SPI 接口(高速数据传输)
  2. 低功耗与稳定性强
    多数 LCD 模块(尤其是OLED)具有较低功耗特性,适用于电池供电设备;
    工作电压范围宽(3.3V~5V),兼容性强;
    支持长时间连续运行,稳定性好。
  3. 图形与文本混合显示能力强
    字符型 LCD 可自定义字符(最多8个用户定义字符);
    图形型 LCD 支持绘制线条、矩形、圆形、图像等;
    支持多字体、中文字符(需加载字库)及动态刷新。
  4. 开发资源成熟
    社区提供大量现成库函数,例如:
    LiquidCrystal(用于HD44780字符屏)
    U8g2lib / SSD1306(用于OLED图形屏)
    TFT_eSPI / ILI9341(用于TFT彩色屏)
    支持 Arduino IDE、PlatformIO 等主流开发环境。
  5. 可扩展性与集成度高
    可与其他传感器、执行器、无线模块(如蓝牙、Wi-Fi)协同工作;
    适合作为小型监控终端、状态面板、操作引导界面;
    支持远程控制更新内容(通过串口或网络协议)。

二、典型应用场景

  1. 工业控制系统
    显示PLC状态、温度、压力、液位等实时参数;
    提供本地操作提示与报警信息;
    替代传统按钮+LED指示灯组合,提升操作效率。
  2. 智能家居与物联网
    智能网关设备显示连接状态、传感器数据、Wi-Fi强度;
    家庭气象站展示温湿度、风速、空气质量等;
    智能门锁显示“开锁成功”、“密码错误”等反馈信息。
  3. 教育与实验教学
    编程入门教学中展示变量值、调试信息;
    嵌入式课程讲解GPIO、I²C/SPI通信、中断等核心概念;
    学生创新项目中实现信息反馈与人机交互。
  4. 商业与零售设备
    自助服务终端显示操作指引;
    POS收银机显示商品名称、价格、支付状态;
    智能售货机显示商品介绍与购买提示。
  5. 农业与环境监测
    土壤湿度、光照强度、CO₂浓度等传感器数据显示;
    温室大棚控制器的状态反馈;
    水质检测仪、气象站的数据输出。
  6. 艺术装置与互动展览
    数字艺术展中的文字说明与引导;
    科技馆互动装置的操作提示;
    商场数字标牌系统的静态/动态信息展示。

三、注意事项

  1. 合理选择LCD类型与尺寸
    根据功能需求选择字符型或图形型屏幕;
    小型项目优先考虑 I²C 接口的 OLED 屏幕(如 SSD1306);
    高分辨率或彩色需求则选择 TFT 类屏幕(如 ILI9341)。
  2. 避免频繁全屏刷新
    对图形型屏幕而言,每次全屏重绘会显著增加CPU负载;
    应采用局部刷新策略,仅更新变化部分区域;
    使用双缓冲机制可减少画面闪烁,但需权衡内存占用。
  3. 注意电源管理与背光控制
    OLED 屏幕无需背光,功耗更低;
    LCD 背光亮度应根据环境调整,避免过亮刺眼;
    若为低功耗设计,可在空闲时关闭背光或进入休眠模式。
  4. 字体与图标资源优化
    中文显示需加载字库,可能占用较大Flash空间;
    合理裁剪字库,仅包含常用汉字以节省资源;
    图标建议使用点阵格式并压缩存储。
  5. 兼容性与接口配置
    不同型号的LCD模块可能需要不同的初始化设置;
    注意I²C地址冲突问题(可通过逻辑分析仪或扫描工具排查);
    使用电平转换器确保3.3V模块与5V主控兼容。
  6. 代码结构与维护性
    将LCD相关逻辑封装为独立模块或类,便于复用;
    注释清晰,命名规范,提高后期维护效率;
    提供串口调试接口或OTA升级能力,方便远程修改显示内容。
    在这里插入图片描述

在 Arduino 项目中,LCD 的逐像素控制(Pixel-level Control) 是一种对液晶显示屏进行精细化图形处理的技术。与传统的字符型 LCD 直接输出预定义字符不同,逐像素控制通常用于 图形点阵型 LCD(Graphic LCD) 或带有绘图功能的 OLED 屏幕,它允许开发者对屏幕上的每一个像素点进行独立操作。这种控制方式极大地增强了显示内容的表现力和灵活性,适用于需要绘制自定义图形、动画、仪表盘、图表等复杂视觉效果的应用场景。

一、主要特点

  1. 精确到像素级别的控制
    每个像素点都可以被单独点亮或熄灭,支持黑白(单色)或彩色显示。
    支持坐标定位,如 (x, y) 坐标系,便于绘制图形、文字、图标等。
  2. 支持图形绘制功能
    可以绘制点、线、矩形、圆形、椭圆、多边形等基本图形。
    支持填充、反色、位图图像显示等功能。
  3. 更高的分辨率
    图形 LCD 通常具有更高的分辨率,例如 128×64、128×128、240×240 等。
    高分辨率支持更复杂的界面设计和数据可视化。
  4. 使用专用图形库
    常用库包括:Adafruit_GFX, U8g2lib, TFT_eSPI, ILI9341_t3n 等。
    这些库提供了丰富的 API 来简化图形绘制和像素操作。
  5. 多种通信接口支持
    支持 SPI、I2C、并行总线等多种通信协议。
    SPI 接口较为常见,因其传输速度快,适合高分辨率图形刷新。

二、应用场景

  1. 工业人机界面(HMI)
    用于工业设备的状态监控、参数设置、流程控制等。
    示例:PLC 控制面板、温度控制器界面、电机状态仪表盘。
  2. 数据可视化展示
    显示传感器采集的数据趋势图、柱状图、饼图等。
    示例:温湿度曲线图、空气质量变化趋势图。
  3. 智能穿戴设备
    在智能手表、手环等小型设备上显示时间、天气、心率等信息。
    示例:基于 SSD1306 的 OLED 显示屏用于微型仪表界面。
  4. 教育实验与嵌入式教学
    作为教学工具帮助学生理解图形编程、坐标系统、点阵原理等。
    示例:使用 Arduino 绘制动态图形或实现小游戏界面。
  5. DIY 创意项目
    电子钟、天气预报仪、音乐频谱分析器、游戏机掌机等。
    示例:使用 ILI9341 TFT 屏制作 Arduino 版“贪吃蛇”游戏。

三、需要注意的事项

  1. 内存资源限制
    Arduino(尤其是 UNO、Nano)RAM 和 Flash 容量有限。
    高分辨率图形和大量图像缓存可能导致内存溢出,需合理分配资源。
  2. 刷新率与性能瓶颈
    图形刷新频率过高会导致画面卡顿或 CPU 占用率上升。
    对于复杂图形建议采用局部刷新或帧缓冲优化策略。
  3. 图像格式转换
    自定义图片需通过工具(如 ImageConverter565、LCD Assistant)转为 C 数组。
    注意颜色深度匹配(如 RGB565、单色 BMP)。
  4. 引脚配置与硬件连接
    不同屏幕模块使用不同的通信协议(SPI/I2C),需确认引脚连接正确。
    使用电平转换器防止 5V 与 3.3V 设备之间的电压冲突。
  5. 屏幕初始化与驱动兼容性
    不同型号的 LCD 屏幕可能需要不同的初始化序列和驱动程序。
    使用前应查阅芯片手册(如 ST7735、SSD1306、ILI9341)。
  6. 功耗问题
    高分辨率彩色 TFT 屏幕功耗较高,不适合长时间低功耗运行。
    在电池供电设备中应选择低功耗 OLED 或 ePaper 屏幕。

在这里插入图片描述
1、基础逐像素控制显示文本

#include <LiquidCrystal.h>

// 初始化LCD,设定RS, E, D4, D5, D6, D7引脚
LiquidCrystal 
lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd
.begin(16, 2); // 设置LCD的列数和行数
}

void loop() {
  lcd
.setCursor(0, 0); // 设置光标位置
  lcd
.print("Hello, World!"); // 显示文本

  delay(2000); // 延迟2秒
}

要点解读:
• 逐像素控制:虽然LCD模块本身不支持直接逐像素控制,但可以通过控制光标位置来逐字符显示文本。
• 显示文本:使用lcd.print函数在指定位置显示文本。
• 光标位置:通过lcd.setCursor设置光标位置,实现文本的逐像素显示。

2、逐像素控制显示多行文本

#include <LiquidCrystal.h>

// 初始化LCD,设定RS, E, D4, D5, D6, D7引脚
LiquidCrystal 
lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd
.begin(16, 2); // 设置LCD的列数和行数
}

void loop() {
  lcd
.setCursor(0, 0); // 设置光标位置
  lcd
.print("Line 1: Hello!"); // 显示第一行文本

  lcd
.setCursor(0, 1); // 设置光标位置
  lcd
.print("Line 2: World!"); // 显示第二行文本

  delay(2000); // 延迟2秒
}

要点解读:
• 多行文本:通过多次调用lcd.setCursor和lcd.print函数,分别设置每行的光标位置和显示文本。
• 逐像素控制:虽然LCD模块本身不支持直接逐像素控制,但可以通过控制光标位置来逐字符显示文本。
• 显示更新:每行文本的显示位置和内容可以通过lcd.setCursor和lcd.print函数动态调整。

3、逐像素控制显示动态内容

#include <LiquidCrystal.h>

// 初始化LCD,设定RS, E, D4, D5, D6, D7引脚
LiquidCrystal 
lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd
.begin(16, 2); // 设置LCD的列数和行数
}

void loop() {
  lcd
.setCursor(0, 0); // 设置光标位置
  lcd
.print("Dynamic Text: "); // 显示静态文本

  lcd
.setCursor(0, 1); // 设置光标位置
  lcd
.print("Time: "); // 显示静态文本
  lcd
.print(millis() / 1000); // 显示动态时间(秒)

  delay(1000); // 每秒更新一次
}

要点解读:
• 动态内容:通过millis函数获取当前时间(毫秒),并将其转换为秒显示在第二行。
• 逐像素控制:虽然LCD模块本身不支持直接逐像素控制,但可以通过控制光标位置来逐字符显示文本。
• 显示更新:动态内容(如时间)每秒更新一次,确保显示内容的实时性。

在这里插入图片描述

4、12864 LCD绘制动态进度条(U8g2库)

#include <U8g2lib.h>
#include <SPI.h>
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8g2_R2, 18, 23, 16); // 软件SPI定义
 
void setup() {
  u8g2.begin();
  u8g2.setPowerSave(0);
}
 
void loop() {
  static int progress = 0;
  u8g2.firstPage();
  do {
    u8g2.drawFrame(10, 30, 108, 10); // 绘制外框
    u8g2.drawBox(10, 30, progress * 108 / 100, 10); // 动态填充
    u8g2.setCursor(40, 50);
    u8g2.print(progress); u8g2.print("%");
  } while (u8g2.nextPage());
  
  progress = (progress + 1) % 101; // 循环0-100
  delay(100);
}

要点解读
图形库选择:U8g2库支持12864 LCD的逐像素绘图,需配置SPI/I2C接口。
动态填充:drawBox()通过计算宽度比例实现进度条效果,progress变量控制填充长度。
刷新优化:firstPage()和nextPage()确保图形完整渲染,避免闪烁。

5、OLED屏幕绘制实时波形(Adafruit_GFX库)

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
 
void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C地址
  display.clearDisplay();
}
 
void loop() {
  static int xPos = 0;
  static float yValue = 0;
  
  display.clearDisplay();
  display.drawLine(0, 32, 128, 32, WHITE); // 中心线
  
  // 绘制波形
  for (int i = 0; i < 128; i++) {
    int y = 32 - (sin(yValue + i * 0.1) * 15); // 正弦波
    display.drawPixel(i, y, WHITE);
  }
  
  display.display();
  yValue += 0.1; // 更新波形相位
  delay(50);
}

要点解读
OLED特性:SSD1306驱动的OLED屏幕需配置I2C地址(如0x3C)。
实时波形:通过drawPixel()逐点绘制正弦波,yValue控制波形相位偏移。
性能平衡:clearDisplay()清除旧帧,避免残留,但频繁调用可能影响刷新率。

6、TFT LCD触摸屏绘制自由线条(MCUFRIEND库)

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
 
void setup() {
  tft.begin(tft.readID()); // 自动检测LCD型号
  tft.fillScreen(BLACK);
  tft.setTextColor(WHITE);
  tft.print("Draw on Screen!");
}
 
void loop() {
  static int lastX = -1, lastY = -1;
  TSPoint p = ts.getPoint(); // 假设已初始化触摸屏
  
  if (p.z > ts.pressureThreshhold) { // 检测触摸
    int x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
    int y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
    
    if (lastX != -1) {
      tft.drawLine(lastX, lastY, x, y, RED); // 绘制线条
    }
    lastX = x;
    lastY = y;
  } else {
    lastX = -1; // 释放触摸时重置
  }
}

要点解读
触摸屏集成:MCUFRIEND库支持多种TFT LCD型号,需配合触摸屏库(如TouchScreen)。
坐标映射:map()函数将触摸原始数据转换为屏幕坐标。
实时交互:通过drawLine()实现自由绘制,lastX/Y记录上一点位置。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值