《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 之基于LCD12864RSPI库的开发 是一种利用SPI通信协议驱动128x64点阵液晶显示屏的方法。该库专门为带有ST7920控制器的LCD12864屏幕设计,支持通过较少的引脚实现高效的数据传输,并且内置了简体中文字符集,非常适合需要显示中文文本的应用场景。
1、主要特点
简化硬件连接
通过SPI接口减少了所需的I/O引脚数量,只需使用MOSI、SCK、CS等几个信号线即可控制LCD12864,这对于引脚资源有限的Arduino板来说尤为重要。
支持多种显示模式
支持文本模式和图形模式,可以在同一块屏幕上同时显示文字和简单的图形元素。
内置中文字库
对于带有ST7920控制器的LCD12864模块,通常内置了GB2312编码的简体中文字库,可以直接调用这些字体来显示中文字符,而不需要额外占用Arduino的内存加载字体文件。
易于使用的API
LCD12864RSPI库提供了简单易用的函数接口,如lcd.print()用于显示文本,lcd.drawBitmap()用于绘制自定义图形等,使得开发者能够快速上手并集成到自己的项目中。
高速数据传输
相较于传统的并行接口,SPI接口能够提供更快的数据传输速度,有助于提高显示内容更新的效率。
2、应用场景
智能家居设备
在智能温控器、智能门锁等设备上显示状态信息或用户指令,提升用户体验。
工业自动化控制系统
在工厂自动化控制面板上显示操作指南、故障提示等中文信息,便于工人理解和操作。
医疗仪器
显示患者的基本信息、检查结果或者操作步骤,确保医护人员能够快速准确地获取所需信息。
教育与实验设备
在教学演示或实验室环境中作为输出设备,显示实验数据或指导说明,帮助学生更好地理解课程内容。
个人电子产品
制作个性化的电子相框、日历或其他小型电子设备,增加趣味性和实用性。
3、注意事项
正确配置SPI通信
确保按照所使用的LCD12864模块的具体要求设置好SPI的相关参数,包括时钟速率、数据格式等。
检查硬件连接是否正确,特别是MOSI、SCK、CS这些关键信号线。
注意编码格式匹配
中文字符通常使用GB2312编码存储在LCD12864的字库中,因此发送给屏幕的字符串也需要是相同的编码格式,否则会出现乱码现象。
如果你的源代码文件不是以GB2312编码保存的,可能需要手动转换字符串编码。
优化显示内容布局
考虑到128x64像素的分辨率限制,合理安排显示区域,避免信息过于拥挤影响阅读体验。
可以考虑分页显示较长的内容,或者采用滚动条等方式提高信息量。
驱动库的选择与使用
使用专门针对LCD12864RSPI的库函数可以简化开发过程,但是需要注意不同版本的库可能存在兼容性问题。
在开始项目之前,建议先查阅最新的库文档,了解其功能特性和API调用方式。
电源管理
尽管LCD12864的功耗相对较低,但在一些对能耗有严格要求的应用中,仍需考虑如何有效地管理背光亮度,以延长电池寿命。
调试与测试技巧
由于涉及硬件通信和显示效果,调试过程中可能会遇到显示异常或无法正常工作的情况。此时,可以尝试降低SPI速率,检查连线是否牢固,以及确认所使用的库版本是否最新。
1、基础中文静态文本显示
#include <LCD12864RSPI.h>
LCD12864RSPI lcd(12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 初始化LCD12864
void setup() {
lcd.begin(); // 初始化LCD
lcd.clear(); // 清屏
lcd.setFont(1); // 设置字体大小
lcd.setCursor(0, 0); // 设置光标位置
lcd.print("你好,世界!"); // 显示中文文本
}
void loop() {
// 空循环,保持显示
}
要点解读:
初始化LCD:使用lcd.begin()初始化LCD12864模块。
清屏操作:通过lcd.clear()清除屏幕内容。
设置字体:使用lcd.setFont()设置字体大小。
显示中文:通过lcd.print()函数显示中文文本。
2、多行中文静态文本显示
#include <LCD12864RSPI.h>
LCD12864RSPI lcd(12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 初始化LCD12864
void setup() {
lcd.begin(); // 初始化LCD
lcd.clear(); // 清屏
lcd.setFont(1); // 设置字体大小
lcd.setCursor(0, 0); // 设置光标位置
lcd.print("第一行:你好"); // 显示第一行中文文本
lcd.setCursor(0, 1); // 设置光标位置
lcd.print("第二行:世界"); // 显示第二行中文文本
lcd.setCursor(0, 2); // 设置光标位置
lcd.print("第三行:Arduino"); // 显示第三行中文文本
}
void loop() {
// 空循环,保持显示
}
要点解读:
多行显示:通过多次调用lcd.setCursor()和lcd.print()函数,分别设置每行的文本位置和内容。
字体大小:根据需要选择合适的字体大小,这里使用了默认字体大小。
3、结合图形的中文静态文本显示
#include <LCD12864RSPI.h>
LCD12864RSPI lcd(12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 初始化LCD12864
void setup() {
lcd.begin(); // 初始化LCD
lcd.clear(); // 清屏
lcd.setFont(1); // 设置字体大小
// 绘制一个矩形
lcd.drawRect(10, 10, 100, 50, 1); // 绘制矩形边框
lcd.fillRect(10, 10, 100, 50, 1); // 填充矩形
// 显示中文文本
lcd.setCursor(12, 12); // 设置光标位置
lcd.print("矩形中的文本"); // 显示中文文本
}
void loop() {
// 空循环,保持显示
}
要点解读:
图形绘制:使用lcd.drawRect()和lcd.fillRect()函数绘制矩形。
文本位置调整:通过lcd.setCursor()函数调整文本的起始位置,确保文本显示在图形内部。
4、中英文混合显示与计时器
#include "LCD12864RSPI.h"
#define AR_SIZE(a) sizeof(a)/sizeof(a[0])
LCD12864RSPI LCDA(A0, A1, A2); // 配置RS, R/W, E引脚
unsigned char show0[] = {0xC9,0xEE,0xC0,0xB6,0xB4,0xB4,0xBF,0xCD,0xBF,0xD5,0xBC,0xE4}; // "深蓝创客空间"
void setup() {
LCDA.clear(); // 清屏
}
uint16_t time_num = 0; // 计时器
void loop() {
LCDA.clear();
LCDA.setCursor(0, 1); // 设置光标位置(行1,列0)
LCDA.chinese(show0, AR_SIZE(show0)); // 显示中文
LCDA.setCursor(1, 0); // 设置光标位置(行2,列0)
LCDA.print("shenlan-workshop"); // 显示英文
time_num = millis() / 1000; // 计算运行时间(秒)
LCDA.setCursor(2, 1); // 设置光标位置(行3,列0)
LCDA.print("run:"); LCDA.print(time_num); LCDA.print("s"); // 显示计时
delay(500);
}
要点解读:
中文字符处理:通过汉字机内码转换工具生成数组(如show0),直接调用LCDA.chinese()显示。
动态数据更新:利用millis()函数实现计时功能,并动态刷新显示内容。
引脚配置:LCD12864RSPI(A0, A1, A2)对应RS、R/W、E引脚,需根据实际硬件调整。
5、图片显示(如“龙”图案)
#include "LCD12864RSPI.h"
#define AR_SIZE(a) sizeof(a)/sizeof(a[0])
LCD12864RSPI LCDA(A0, A1, A2);
unsigned char logo0[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 图片数据(简化示例)
// ...(完整数据需通过取模工具生成)
};
void setup() {
LCDA.clear();
}
void loop() {
LCDA.clear();
LCDA.DrawFullScreen(logo0); // 显示整张图片
delay(2000);
}
要点解读:
图片取模工具:使用工具(如Lcmzimo)将BMP图片转换为16进制数组,保存到程序。
全屏显示:调用LCDA.DrawFullScreen()函数直接绘制图片,需确保数组长度为1024字节(128×64/8)。
分辨率匹配:图片需为128×64像素,否则需缩放或裁剪。
6、动态数据监控(如温度传感器)
#include "LCD12864RSPI.h"
#define AR_SIZE(a) sizeof(a)/sizeof(a[0])
LCD12864RSPI LCDA(A0, A1, A2);
void setup() {
LCDA.clear();
}
void loop() {
int sensorValue = analogRead(A3); // 读取模拟输入(假设为温度传感器)
float temperature = sensorValue * (5.0 / 1023.0) * 100; // 转换为温度值(示例公式)
LCDA.clear();
LCDA.setCursor(0, 0);
LCDA.print("Temp Monitor"); // 标题
LCDA.setCursor(1, 0);
LCDA.print("Value:"); LCDA.print(sensorValue); // 显示原始值
LCDA.setCursor(2, 0);
LCDA.print("Temp:"); LCDA.print(temperature); LCDA.print("C"); // 显示温度
delay(1000);
}
要点解读:
传感器数据读取:通过analogRead()获取模拟信号,并转换为实际物理量(如温度)。
多行文本布局:使用setCursor()定位光标,分多行显示不同信息。
数值格式化:动态拼接字符串和数值(如LCDA.print(temperature)),需注意数据类型转换。
注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。