《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升级能力,方便远程修改显示内容。
一、主要特点 - 帧动画机制
动画由一系列静态图像(帧)组成,通过高速切换帧画面产生动态视觉效果。
每帧画面可基于数组数据绘制,也可通过算法实时生成。 - 高度定制化内容
支持自定义图形、图标、角色、背景等元素。
可用于显示简单的动画序列,如进度条、旋转指针、移动小球、游戏人物动作等。 - 灵活的刷新控制
开发者可以精确控制刷新频率(帧率),以平衡流畅性与性能消耗。
常见帧率范围为 10~30 FPS,具体取决于处理器速度和绘图复杂度。 - 使用点阵图形库支持
依赖图形库如 Adafruit_GFX, U8g2lib, TFT_eSPI 等来操作像素级绘图。
这些库提供 drawBitmap(), drawFastImage() 等函数用于加载预定义图像帧。 - 内存与资源优化
动画帧可通过压缩方式存储,如使用位图数组、RLE 编码等方式减少内存占用。
对于低资源设备(如 Arduino UNO/Nano),建议采用单色 OLED 或小型帧缓存。
二、应用场景
- 游戏开发
在 Arduino 上开发简易游戏,如贪吃蛇、俄罗斯方块、打砖块等。
示例:使用 SSD1306 OLED 屏制作“跳跳虎”小游戏。 - 状态指示与反馈
显示设备运行状态、连接状态、充电动画、等待提示等。
示例:蓝牙连接时显示一个旋转的圆环或闪烁的图标。 - 教学演示与实验
作为教学工具展示动画原理、图像处理、帧缓存机制等知识点。
示例:演示如何用 C/C++ 数组表示图像,并进行动画播放。 - 工业 HMI 界面
在工业控制系统中展示动态仪表盘、流程动画、报警指示等。
示例:电机转速表、液位计的动态模拟。 - 艺术与创意项目
制作电子贺卡、互动装置、数字相框、音乐可视化等富有表现力的作品。
示例:根据音频节奏在 TFT 屏上绘制波形动画。
三、需要注意的事项
- 处理器性能限制
Arduino 主控芯片(如 ATmega328P)计算能力有限,不适合高分辨率或高帧率动画。
建议选择带有 SPI 接口的高性能屏幕(如 ILI9341、ST7735)搭配 ESP32 或 Teensy 使用。 - 图像资源管理
所有动画帧需预先转换为 C/C++ 数组并嵌入代码中,占用 Flash 和 RAM。
应合理规划帧数量和尺寸,避免内存溢出。 - 动画帧生成工具
使用图像转换工具(如 ImageConverter565、LCD Assistant)将 PNG/JPG 文件转换为代码可用的数组格式。
注意颜色深度匹配(如 RGB565、单色 BMP)。 - 引脚与接口配置
不同类型的屏幕使用不同的通信协议(如 I2C、SPI、并行总线)。
需正确配置引脚并确保驱动兼容性,防止通信失败导致动画无法显示。 - 功耗与续航问题
OLED/TFT 屏幕功耗较高,尤其是彩色屏,在电池供电设备中应谨慎使用。
若需低功耗应用,可考虑 ePaper 屏或关闭背光。 - 视觉体验优化
帧率过低会导致卡顿,过高则增加 CPU 占用。
可采用双缓冲技术、局部刷新、延迟控制等策略提升动画流畅性。
1、心跳动画
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte heart[8] = {
B00000,
B01010,
B11111,
B11111,
B01110,
B00100,
B00000,
B00000
};
void setup() {
lcd.init();
lcd.backlight();
lcd.createChar(0, heart);
}
void loop() {
// 心跳放大缩小动画
for (int size = 1; size <= 3; size++) {
lcd.setCursor(7 - size, 0);
for (int i = 0; i < 2 * size; i++) {
lcd.write(byte(0));
}
delay(300);
lcd.clear();
}
}
要点解读:
动画效果:通过调整字符显示位置和数量模拟心跳动画。
帧率控制:使用delay(300)控制帧率,使动画流畅。
字符创建:使用lcd.createChar将自定义点阵图形存入CGRAM。
2、交互式绘图板
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // 引脚定义
int cursorX = 0, cursorY = 0;
bool drawMode = false;
void setup() {
lcd.begin(16, 2);
lcd.print("Press BTN to Draw");
pinMode(2, INPUT_PULLUP); // 按键接D2
}
void loop() {
if (digitalRead(2) == LOW) { // 按键按下
delay(200); // 防抖
drawMode = !drawMode;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(drawMode ? "Drawing..." : "Idle");
}
// 简单光标移动(示例仅水平)
static unsigned long lastTime = 0;
if (millis() - lastTime > 500) {
cursorX = (cursorX + 1) % 16;
lcd.setCursor(cursorX, cursorY);
lcd.write(drawMode ? '*' : ' '); // 绘制或擦除
lastTime = millis();
}
}
要点解读:
交互功能:结合按键切换绘制模式,实现简单的交互功能。
光标控制:通过lcd.setCursor和lcd.write控制光标位置和绘制内容。
防抖处理:使用delay(200)避免按键抖动导致的误操作。
3、箭头动画
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C地址0x27,16列2行
void setup() {
lcd.init();
lcd.backlight();
// 定义箭头点阵(5x8像素)
byte arrow[8] = {
B00100,
B01110,
B11111,
B01110,
B00100,
B00000,
B00000,
B00000
};
lcd.createChar(0, arrow); // 存储到字符0
lcd.setCursor(5, 0);
lcd.write(byte(0)); // 显示箭头
}
void loop() {} // 保持静态显示
要点解读:
点阵定义:通过byte数组定义箭头的点阵图形。
字符存储:使用lcd.createChar将点阵图形存储为自定义字符。
显示位置:通过lcd.setCursor和lcd.write控制箭头的显示位置。
4、8×8点阵屏心跳动画(共阳极驱动)
#include <LedControl.h>
#define DIN_PIN 7
#define CS_PIN 6
#define CLK_PIN 5
LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 1); // 初始化MAX7219
// 大心脏与小心脏图案数据(16进制格式)
const uint64_t HEART_BIG = 0x00183C7E7E3C1800;
const uint64_t HEART_SMALL = 0x00060F1F1F0F0600;
void setup() {
display.shutdown(0, false); // 唤醒模块
display.setIntensity(0, 8); // 设置亮度
display.clearDisplay(0); // 清屏
}
void loop() {
displayImage(HEART_BIG); delay(300); // 显示大心脏300ms
displayImage(HEART_SMALL); delay(200); // 显示小心脏200ms
}
void displayImage(uint64_t image) {
for (int i = 0; i < 8; i++) {
byte row = (image >> (i * 8)) & 0xFF; // 提取每行数据
display.setRow(0, i, row); // 写入点阵屏
}
}
要点解读:
数据格式:使用uint64_t存储8×8点阵图案,每字节对应一行像素。
驱动库:LedControl.h简化MAX7219通信,通过setRow逐行写入数据。
动态效果:通过交替调用displayImage并控制delay时间,实现心跳节奏。
5、LCD1602滚动字幕动画
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 引脚定义(RS, EN, D4-D7)
String text = "HELLO WORLD";
int pos = 0;
void setup() {
lcd.begin(16, 2); // 初始化16×2显示
lcd.clear();
}
void loop() {
lcd.setCursor(0, 0); // 设置光标到首行首列
lcd.print(" "); // 清空首行
lcd.setCursor(pos, 0); // 移动光标到当前位置
lcd.print(text); // 显示文本
pos = (pos + 1) % 17; // 循环移动(16字符+1空格)
delay(200); // 控制滚动速度
}
要点解读:
字符移动:通过调整setCursor的X坐标实现横向滚动,利用取模运算%17实现循环。
清屏优化:每次写入前用空格覆盖旧内容,避免残留字符。
库函数:LiquidCrystal.h提供基础文本显示功能,无需直接操作显存。
6、WS2812B全彩点阵屏音乐频谱动画
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6
#define LED_COUNT 64 // 8×8点阵屏共64个LED
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
strip.show(); // 初始化所有LED关闭
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0); // 读取声音传感器值(0-1023)
int height = map(sensorValue, 0, 1023, 0, 8); // 映射到0-8行
// 清除屏幕
for (int i = 0; i < LED_COUNT; i++) {
strip.setPixelColor(i, 0, 0, 0);
}
// 绘制柱状图(从底部向上)
for (int row = 0; row < height; row++) {
int ledIndex = row * 8 + 0; // 示例:第一列显示
strip.setPixelColor(ledIndex, strip.Color(0, 150, 0)); // 绿色
}
strip.show();
delay(50); // 降低刷新率以避免闪烁
}
要点解读:
全彩控制:Adafruit_NeoPixel.h支持RGB三通道调色,通过setPixelColor设置每个LED颜色。
数据映射:map函数将传感器值线性映射到点阵屏高度(0-8行)。
硬件扩展:若需多列显示,需扩展循环逻辑(如for (int col = 0; col < 8; col++))。
注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。