《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 屏幕的良好支持,使得开发者能够快速构建低成本、高可用性的显示系统。
一、主要特点
- 接口种类丰富
字符型 LCD(如 16x2、20x4):使用 HD44780 控制器,常见于基础教学项目;
图形点阵 LCD(如 128x64 OLED、TFT 彩色屏):支持自由绘图,适合复杂界面;
通信方式多样:
并行接口(8位/4位模式)
I²C 接口(节省引脚资源)
SPI 接口(高速数据传输) - 低功耗与稳定性强
多数 LCD 模块(尤其是OLED)具有较低功耗特性,适用于电池供电设备;
工作电压范围宽(3.3V~5V),兼容性强;
支持长时间连续运行,稳定性好。 - 图形与文本混合显示能力强
字符型 LCD 可自定义字符(最多8个用户定义字符);
图形型 LCD 支持绘制线条、矩形、圆形、图像等;
支持多字体、中文字符(需加载字库)及动态刷新。 - 开发资源成熟
社区提供大量现成库函数,例如:
LiquidCrystal(用于HD44780字符屏)
U8g2lib / SSD1306(用于OLED图形屏)
TFT_eSPI / ILI9341(用于TFT彩色屏)
支持 Arduino IDE、PlatformIO 等主流开发环境。 - 可扩展性与集成度高
可与其他传感器、执行器、无线模块(如蓝牙、Wi-Fi)协同工作;
适合作为小型监控终端、状态面板、操作引导界面;
支持远程控制更新内容(通过串口或网络协议)。
二、典型应用场景
- 工业控制系统
显示PLC状态、温度、压力、液位等实时参数;
提供本地操作提示与报警信息;
替代传统按钮+LED指示灯组合,提升操作效率。 - 智能家居与物联网
智能网关设备显示连接状态、传感器数据、Wi-Fi强度;
家庭气象站展示温湿度、风速、空气质量等;
智能门锁显示“开锁成功”、“密码错误”等反馈信息。 - 教育与实验教学
编程入门教学中展示变量值、调试信息;
嵌入式课程讲解GPIO、I²C/SPI通信、中断等核心概念;
学生创新项目中实现信息反馈与人机交互。 - 商业与零售设备
自助服务终端显示操作指引;
POS收银机显示商品名称、价格、支付状态;
智能售货机显示商品介绍与购买提示。 - 农业与环境监测
土壤湿度、光照强度、CO₂浓度等传感器数据显示;
温室大棚控制器的状态反馈;
水质检测仪、气象站的数据输出。 - 艺术装置与互动展览
数字艺术展中的文字说明与引导;
科技馆互动装置的操作提示;
商场数字标牌系统的静态/动态信息展示。
三、注意事项
- 合理选择LCD类型与尺寸
根据功能需求选择字符型或图形型屏幕;
小型项目优先考虑 I²C 接口的 OLED 屏幕(如 SSD1306);
高分辨率或彩色需求则选择 TFT 类屏幕(如 ILI9341)。 - 避免频繁全屏刷新
对图形型屏幕而言,每次全屏重绘会显著增加CPU负载;
应采用局部刷新策略,仅更新变化部分区域;
使用双缓冲机制可减少画面闪烁,但需权衡内存占用。 - 注意电源管理与背光控制
OLED 屏幕无需背光,功耗更低;
LCD 背光亮度应根据环境调整,避免过亮刺眼;
若为低功耗设计,可在空闲时关闭背光或进入休眠模式。 - 字体与图标资源优化
中文显示需加载字库,可能占用较大Flash空间;
合理裁剪字库,仅包含常用汉字以节省资源;
图标建议使用点阵格式并压缩存储。 - 兼容性与接口配置
不同型号的LCD模块可能需要不同的初始化设置;
注意I²C地址冲突问题(可通过逻辑分析仪或扫描工具排查);
使用电平转换器确保3.3V模块与5V主控兼容。 - 代码结构与维护性
将LCD相关逻辑封装为独立模块或类,便于复用;
注释清晰,命名规范,提高后期维护效率;
提供串口调试接口或OTA升级能力,方便远程修改显示内容。
在 Arduino 项目中,LCD 的逐像素控制(Pixel-level Control) 是一种对液晶显示屏进行精细化图形处理的技术。与传统的字符型 LCD 直接输出预定义字符不同,逐像素控制通常用于 图形点阵型 LCD(Graphic LCD) 或带有绘图功能的 OLED 屏幕,它允许开发者对屏幕上的每一个像素点进行独立操作。这种控制方式极大地增强了显示内容的表现力和灵活性,适用于需要绘制自定义图形、动画、仪表盘、图表等复杂视觉效果的应用场景。
一、主要特点
- 精确到像素级别的控制
每个像素点都可以被单独点亮或熄灭,支持黑白(单色)或彩色显示。
支持坐标定位,如 (x, y) 坐标系,便于绘制图形、文字、图标等。 - 支持图形绘制功能
可以绘制点、线、矩形、圆形、椭圆、多边形等基本图形。
支持填充、反色、位图图像显示等功能。 - 更高的分辨率
图形 LCD 通常具有更高的分辨率,例如 128×64、128×128、240×240 等。
高分辨率支持更复杂的界面设计和数据可视化。 - 使用专用图形库
常用库包括:Adafruit_GFX, U8g2lib, TFT_eSPI, ILI9341_t3n 等。
这些库提供了丰富的 API 来简化图形绘制和像素操作。 - 多种通信接口支持
支持 SPI、I2C、并行总线等多种通信协议。
SPI 接口较为常见,因其传输速度快,适合高分辨率图形刷新。
二、应用场景
- 工业人机界面(HMI)
用于工业设备的状态监控、参数设置、流程控制等。
示例:PLC 控制面板、温度控制器界面、电机状态仪表盘。 - 数据可视化展示
显示传感器采集的数据趋势图、柱状图、饼图等。
示例:温湿度曲线图、空气质量变化趋势图。 - 智能穿戴设备
在智能手表、手环等小型设备上显示时间、天气、心率等信息。
示例:基于 SSD1306 的 OLED 显示屏用于微型仪表界面。 - 教育实验与嵌入式教学
作为教学工具帮助学生理解图形编程、坐标系统、点阵原理等。
示例:使用 Arduino 绘制动态图形或实现小游戏界面。 - DIY 创意项目
电子钟、天气预报仪、音乐频谱分析器、游戏机掌机等。
示例:使用 ILI9341 TFT 屏制作 Arduino 版“贪吃蛇”游戏。
三、需要注意的事项
- 内存资源限制
Arduino(尤其是 UNO、Nano)RAM 和 Flash 容量有限。
高分辨率图形和大量图像缓存可能导致内存溢出,需合理分配资源。 - 刷新率与性能瓶颈
图形刷新频率过高会导致画面卡顿或 CPU 占用率上升。
对于复杂图形建议采用局部刷新或帧缓冲优化策略。 - 图像格式转换
自定义图片需通过工具(如 ImageConverter565、LCD Assistant)转为 C 数组。
注意颜色深度匹配(如 RGB565、单色 BMP)。 - 引脚配置与硬件连接
不同屏幕模块使用不同的通信协议(SPI/I2C),需确认引脚连接正确。
使用电平转换器防止 5V 与 3.3V 设备之间的电压冲突。 - 屏幕初始化与驱动兼容性
不同型号的 LCD 屏幕可能需要不同的初始化序列和驱动程序。
使用前应查阅芯片手册(如 ST7735、SSD1306、ILI9341)。 - 功耗问题
高分辨率彩色 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版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。