《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 OLED 指的是将 Arduino 开发平台与 OLED(有机发光二极管)显示屏相结合的应用组合。Arduino 是开源电子原型平台,具备灵活的硬件扩展性和简单易上手的编程环境;OLED 显示屏则以其自发光、高对比度、宽视角、响应速度快等优势,为信息展示提供了优质的视觉体验。二者结合能实现各类数据显示、图形绘制及交互界面展示等功能,在电子制作、物联网、机器人等诸多领域广泛应用。
详细解释
Arduino 相关特性
硬件特性
开源设计:Arduino 的硬件设计方案完全公开,用户能够获取其原理图、PCB 版图等详细资料。这不仅降低了开发成本,还方便开发者根据自身需求对硬件进行修改和扩展,例如制作自定义外形或功能的开发板。
丰富接口资源:Arduino 开发板配备了多种类型的接口。数字输入输出引脚可用于连接开关、继电器、LED 等设备,实现数字信号的读取和输出控制;模拟输入引脚能够采集如温度传感器、光照传感器输出的连续模拟信号,经内部 ADC(模拟 - 数字转换器)转换为数字值供程序处理。
多种供电方式:支持 USB 供电、外接电源适配器供电以及电池供电等多种方式。使用 USB 供电时,可方便地与计算机连接进行程序上传和调试;外接电源适配器则能提供稳定的电源,适用于长时间运行的项目;电池供电赋予了 Arduino 设备便携性,可应用于移动监测等场景。
软件特性
简易编程环境:Arduino 使用基于 C/C++ 的编程语言,其语法简洁易懂。Arduino IDE 是专门为其开发的集成开发环境,具有跨平台性,可在 Windows、Mac OS、Linux 等操作系统上运行。IDE 提供了直观的代码编辑界面、便捷的编译和上传功能,还内置了大量示例代码,帮助初学者快速入门。
庞大的库资源:Arduino 社区拥有丰富的开源库,涵盖了传感器驱动、通信协议、图形绘制等各个领域。例如,Wire 库用于 I2C 通信,SPI 库用于 SPI 通信,开发者可以直接调用这些库,无需从头编写底层代码,大大提高了开发效率。
OLED 显示屏特性
显示原理
OLED 基于有机材料的电致发光特性工作。当在有机材料层两端施加电压时,电子从阴极注入,空穴从阳极注入,二者在有机材料中相遇并复合,释放出能量以光的形式呈现,从而实现发光显示。由于每个像素都能独立发光,OLED 显示屏无需背光源。
性能优势
自发光与高对比度:自发光特性使得 OLED 能够实现真正的黑色显示,因为不发光的像素完全不产生光线。这使得其对比度极高,图像的亮部更亮,暗部更暗,色彩表现更加生动逼真。
宽视角:OLED 的视角非常宽广,通常可达 170° 以上。从不同角度观看显示屏,画面的颜色和亮度变化极小,能为用户提供一致的视觉体验,适用于各种需要多角度观察的应用场景。
快速响应时间:OLED 的响应时间极短,一般在几微秒到几十微秒之间。相比传统的液晶显示屏,OLED 在显示动态画面时不会出现拖影现象,能够清晰、流畅地展示快速变化的图像,如动画、视频等。
轻薄与低功耗:由于无需背光源,OLED 显示屏的结构更加简单,厚度更薄,重量更轻。同时,其在显示黑色画面时几乎不消耗电能,只有发光的像素才会消耗功率,因此在显示深色画面较多的场景下,功耗显著降低。
Arduino 与 OLED 的连接和通信
通信接口类型
SPI(Serial Peripheral Interface):SPI 是一种高速的全双工串行通信协议,Arduino 通过 SPI 接口与 OLED 显示屏连接时,通常需要使用时钟线(SCK)、主输出从输入线(MOSI)、主输入从输出线(MISO)和片选线(SS)。SPI 通信速度快,适合需要快速传输大量数据的应用场景,如显示高分辨率的图像或视频流。
I2C(Inter - Integrated Circuit):I2C 是一种串行通信协议,使用两根线进行通信,即时钟线(SCL)和数据线(SDA)。I2C 接口简单,占用 Arduino 的引脚资源少,并且支持多个设备挂载在同一总线上,通过不同的设备地址进行区分。在一些对引脚资源要求较高的项目中,I2C 接口更为适用。
通信流程
初始化:在 Arduino 代码中,首先需要初始化所选的通信接口(SPI 或 I2C),并设置相关的通信参数,如时钟频率、设备地址等。
发送数据:Arduino 根据需要显示的内容,将数据按照 OLED 显示屏的通信协议进行编码,然后通过通信接口发送给 OLED 显示屏。数据可以是字符、数字、图形等信息。
显示更新:OLED 显示屏接收到数据后,对其进行解码和处理,将相应的内容显示在屏幕上。为了实现动态显示效果,Arduino 可以定期更新发送的数据,使 OLED 显示屏不断刷新显示内容。
应用场景
数据监测与显示:在环境监测系统中,Arduino 连接各种传感器(如温度传感器、湿度传感器、空气质量传感器等)采集环境数据,然后将数据通过通信接口传输到 OLED 显示屏上进行实时显示。用户可以直观地了解环境参数的变化情况。
智能家居控制:在智能家居系统中,Arduino 作为控制核心,连接各种家电设备和传感器。OLED 显示屏可以显示家电设备的状态(如开关状态、温度设置等),并提供操作菜单,用户可以通过触摸按键或其他输入设备在 OLED 显示屏上进行操作,实现对家电设备的远程控制。
机器人交互界面:在机器人项目中,OLED 显示屏可以作为机器人的交互界面,显示机器人的工作状态、任务进度、传感器数据等信息。同时,还可以显示一些动画或图标,增强机器人的人机交互体验。
手持设备与可穿戴设备:由于 OLED 显示屏的轻薄和低功耗特性,与 Arduino 结合可用于开发手持设备和可穿戴设备。例如,制作一个便携式的健康监测设备,通过 Arduino 连接心率传感器、计步器等,将监测数据显示在 OLED 显示屏上,方便用户随时查看自己的健康状况。
在Arduino项目中,OLED之显示中文静态文本(Displaying Static Chinese Text on OLED) 是一种重要的信息展示方式。通过在OLED屏幕上显示中文字符,可以为用户提供直观、易懂的信息提示或操作指南。以下是关于这一技术的主要特点、应用场景以及需要注意的事项的专业解析。
主要特点
- 本地化支持
中文字符的直接显示使得设备能够更好地服务于中文用户群体,提供更加亲切和易于理解的操作界面。
支持多种字体大小和样式,适应不同的屏幕尺寸和显示需求。 - 高对比度与清晰度
OLED显示屏具有自发光特性,提供高对比度和鲜艳的颜色,使得中文字符显示效果非常出色,尤其适合小尺寸屏幕上的文字展示。
支持灰度模式设置,可以根据环境光线调整显示效果,确保在不同光照条件下都能清晰阅读。 - 资源占用优化
相较于图形或动画显示,静态中文文本对处理器和内存的需求较低,非常适合资源有限的Arduino平台。
使用预设的字库文件可以有效减少内存占用,提升加载速度和显示效率。 - 灵活性强
可以根据实际需求动态加载不同的中文文本内容,实现多语言切换或个性化定制。
支持滚动显示长文本内容,充分利用有限的屏幕空间,避免信息过载。 - 实时反馈
静态文本结合其他交互元素(如按钮、传感器),可以为用户提供即时的操作反馈或状态提示,增强用户体验。
应用场景
- 智能家居控制面板
在家庭自动化系统中,用于显示设备状态、操作指南或警告信息等,帮助用户快速了解并控制家中设备。
示例:智能恒温器上显示“当前温度:25℃”,让用户一目了然地知道室内温度情况。 - 便携式测量仪器
科学实验或现场检测中,用于显示测量结果、单位说明或操作提示,方便用户进行准确的数据读取和记录。
示例:手持式空气质量检测仪上显示“PM2.5浓度:30μg/m³”,提醒用户当前空气质量状况。 - 教育与培训工具
制作基于Arduino的学习装置,帮助学生理解编程概念或电子元件的工作原理,并通过中文提示引导完成实验任务。
示例:Arduino教学套件上的显示屏逐行显示实验步骤:“连接电阻到面包板”,指导学生逐步搭建电路。 - 公共信息终端
在公共场所的信息显示屏上,用于发布公告、通知或紧急信息,确保公众能够及时获取并理解重要消息。
示例:图书馆入口处的显示屏显示“今日闭馆,请改日再来”,吸引路过人员的注意。
注意事项
- 字库选择与集成
确保使用的字库包含所需的所有中文字符,避免出现乱码或缺失字符的情况。
常见的解决方案包括使用内置字库(如Adafruit GFX库中的中文字库)、外部字库文件(如GB2312编码的字库),或者自定义字库。 - 内存管理
Arduino微控制器的RAM有限,处理大量中文字符可能会超出内存容量。
对于较长的文本或复杂的字库,考虑使用外部存储(如SD卡)读取数据,并采用分段加载的方式减少内存占用。 - 显示效果优化
根据屏幕分辨率和显示区域大小合理调整字体大小和间距,确保文本清晰可读。
考虑背景色与前景色的搭配,提高对比度,特别是在户外或强光环境下使用的设备。 - 性能优化
动态更新文本时,尽量只刷新发生变化的部分,而不是整个屏幕,以降低CPU负载和减少闪烁现象。
对于滚动显示长文本内容,适当控制滚动速度,避免因过快导致用户难以阅读。
1、基础中文欢迎界面
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <U8g2_for_Adafruit_GFX.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
U8g2_for_Adafruit_GFX u8g2Font;
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
u8g2Font.begin(display);
u8g2Font.setFontMode(1);
u8g2Font.setFontDirection(0);
u8g2Font.setForegroundColor(WHITE);
u8g2Font.setFont(u8g2_font_wqy12_t_gb2312); // 设置中文字体
display.clearDisplay();
u8g2Font.setCursor(10, 20);
u8g2Font.print("欢迎使用");
u8g2Font.setCursor(10, 40);
u8g2Font.print("Arduino系统");
display.display();
}
void loop() {}
要点解读:
通过U8g2库加载wqy12字体实现中文显示
设置光标坐标(10,20)和(10,40)实现双行文本定位
使用setForegroundColor设置白色前景色
适合制作设备启动界面或固定标识牌
2、多页信息展示屏
// 延续案例一的库引入和初始化代码
void showPage(int page) {
display.clearDisplay();
switch(page){
case 0:
u8g2Font.setCursor(5, 20);
u8g2Font.print("系统状态:正常");
u8g2Font.setCursor(5, 40);
u8g2Font.print("温度:25℃");
break;
case 1:
u8g2Font.setCursor(5, 20);
u8g2Font.print("警告:请勿触摸");
u8g2Font.setCursor(5, 40);
u8g2Font.print("高压区域!");
break;
}
display.display();
}
void setup() {
// 延续案例一的初始化代码
showPage(0);
}
void loop() {
static int currentPage = 0;
delay(3000);
currentPage = !currentPage;
showPage(currentPage);
}
要点解读:
通过showPage函数实现页面切换逻辑
使用静态变量currentPage保持页面状态
3秒延时实现自动轮播效果
适合制作信息展示屏或状态指示器
3、传感器数据中文显示
// 延续案例一的库引入和初始化代码
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// 延续案例一的初始化代码
dht.begin();
display.clearDisplay();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
u8g2Font.setCursor(10, 20);
u8g2Font.print("传感器故障!");
} else {
u8g2Font.setCursor(5, 20);
u8g2Font.print("温湿度监测");
u8g2Font.setCursor(5, 40);
u8g2Font.print("温度:");
u8g2Font.print(t);
u8g2Font.print("℃ 湿度:");
u8g2Font.print(h);
u8g2Font.print("%");
}
display.display();
delay(2000);
display.clearDisplay();
}
要点解读:
集成DHT11温湿度传感器读取
异常值检测处理(isnan判断)
动态数值拼接显示技术
每2秒刷新显示机制
适合物联网环境监测设备开发
4、基础中文静态文本显示
功能描述
在 OLED 上显示简单的中文文本(如“你好,世界!”)。
适用于静态信息展示(如设备名称、状态提示)。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// 使用 U8g2 字库(需提前安装)
#include <U8g2_for_Adafruit_GFX.h>
U8G2_FOR_ADAFRUIT_GFX u8g2;
void setup() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// 初始化 U8g2 中文字体
u8g2.begin(display);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// 显示中文(需 U8g2 字库支持)
u8g2.setFont(u8g2_font_wqy12_t_chinese); // 文泉驿正黑 12pt
u8g2.setCursor(10, 20);
u8g2.print("你好,世界!");
display.display();
}
void loop() {
// 静态显示,无需循环
}
要点解读
U8g2 字库支持
使用 U8g2_for_Adafruit_GFX 库加载中文字体(如 wqy12_t_chinese)。
需提前安装 U8g2 字库(.c 文件需放入 fonts 文件夹)。
字体选择
u8g2_font_wqy12_t_chinese 是文泉驿正黑 12pt 字体,适合小尺寸 OLED。
更大字体(如 wqy20_t_chinese)可提高可读性,但占用更多空间。
静态显示
适用于固定信息(如设备名称、状态提示),无需动态更新。
5、多行中文排版显示
功能描述
在 OLED 上显示多行中文文本(如“温度:25°C\n湿度:60%”)。
适用于传感器数据展示或状态信息。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <U8g2_for_Adafruit_GFX.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
U8G2_FOR_ADAFRUIT_GFX u8g2;
void setup() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
u8g2.begin(display);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// 设置多行文本
u8g2.setFont(u8g2_font_wqy12_t_chinese); // 文泉驿正黑 12pt
// 显示多行中文(换行符 \n)
u8g2.setCursor(10, 15); // 第一行
u8g2.print("温度:25°C");
u8g2.setCursor(10, 35); // 第二行
u8g2.print("湿度:60%");
display.display();
}
void loop() {
// 静态显示
}
要点解读
换行显示
使用 \n 换行符或手动调整 setCursor(y) 实现多行排版。
注意 OLED 的高度限制(64px),每行高度约 10px(12pt 字体)。
字体大小调整
更大字体(如 wqy16_t_chinese)可提高可读性,但减少行数。
示例:
u8g2.setFont(u8g2_font_wqy16_t_chinese); // 16pt 字体
对齐方式
默认左对齐,如需居中,可计算 x 坐标:
int x = (SCREEN_WIDTH - u8g2.getUTF8Width(“温度:25°C”)) / 2;
u8g2.setCursor(x, 15);
6、自定义中文字体显示
功能描述
使用自定义中文字体(如自定义 Logo 或特殊字符)。
适用于品牌标识或特殊符号显示。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <U8g2_for_Adafruit_GFX.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
U8G2_FOR_ADAFRUIT_GFX u8g2;
// 自定义字体(需提前生成 .c 文件)
#include "custom_font.h" // 假设已生成自定义字体
void setup() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
u8g2.begin(display);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// 使用自定义字体
u8g2.setFont(custom_font); // 替换为你的自定义字体
// 显示自定义字符(如 Logo 或特殊符号)
u8g2.drawStr(10, 30, "自定义文字"); // 如果支持 UTF-8
// 或直接绘制位图(如果字体是位图)
// u8g2.drawXBMP(0, 0, 128, 64, custom_logo_bits);
display.display();
}
void loop() {
// 静态显示
}
要点解读
自定义字体生成
使用 FontForge 或 u8g2 字体生成工具 将 .ttf 转换为 .c 文件。
示例工具:
u8g2 字体生成器
FontForge(手动转换)
字体嵌入
将生成的 .c 文件放入 Arduino 项目文件夹,并 #include。
位图替代方案
如果字体不支持 UTF-8,可直接使用 drawXBMP() 显示位图:
const uint8_t custom_logo_bits[] PROGMEM = { … }; // 位图数据
u8g2.drawXBMP(0, 0, 128, 64, custom_logo_bits);
注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。