【花雕学编程】Arduino OLED 之逐字显示文本信息

在这里插入图片描述
《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之逐字显示文本信息(Character-by-Character Text Display on OLED) 是一种提升用户体验、增加互动性的方法。通过逐字或逐行显示文本,可以模拟打字机效果,适用于需要引导用户注意力或提供逐步信息的场景。以下从 主要特点、应用场景 和 注意事项 三个方面进行详细解析。

一、主要特点

  1. 增强视觉体验
    • 逐字显示文本能够吸引用户的注意力,并给予其足够的时间来阅读和理解每一段文字内容。
    • 可以根据文本长度自动调整显示速度,确保信息传递的有效性。
  2. 节省屏幕资源
    • 在小尺寸OLED屏幕上,逐字显示可以避免一次性显示过多信息导致的拥挤感,有助于保持界面清晰简洁。
    • 特别适合字符数较多但每次只需展示部分内容的应用。
  3. 灵活的控制方式
    • 开发者可以根据需求设置字符之间的间隔时间,实现不同的动画效果(如快速滚动、慢速呈现等)。
    • 支持动态更新文本内容,适应实时变化的信息流。
  4. 易于集成与扩展
    • Arduino平台支持多种OLED驱动库(如Adafruit_SSD1306、U8g2),这些库通常提供了丰富的文本处理函数,便于开发者快速实现功能。
    • 可与其他传感器或输入设备结合使用,响应外部事件触发文本显示。
  5. 低功耗优势
    • OLED屏幕本身具有低功耗特性,而逐字显示进一步减少了同时点亮的像素数量,有助于延长电池供电设备的工作时间。

二、应用场景

  1. 智能穿戴设备
    • 在手表或健身追踪器上逐字显示通知消息,确保用户不会错过重要信息的同时,也避免了频繁查看手机的不便。
    • 示例:收到新短信时,在OLED屏幕上逐字显示发件人姓名及简短内容摘要。
  2. 智能家居控制面板
    • 当用户操作设备时,通过逐字显示状态提示或操作结果,提高交互友好度。
    • 示例:当调节灯光亮度时,OLED屏上逐字显示“正在调整亮度至50%”。
  3. 教育与培训工具
    • 制作基于Arduino的学习装置,用于教授编程概念或语言学习,逐字显示代码解释或单词释义。
    • 示例:电子词典设备,逐字显示单词定义。
  4. 工业自动化系统
    • 在工业环境中,用于显示机器运行状态、故障报警等信息,帮助维护人员及时了解设备状况。
    • 示例:生产设备出现异常时,OLED显示屏逐字显示错误代码及其含义。
  5. 艺术装置与创意项目
    • 结合传感器数据或其他输入源,创建具有互动性的艺术作品或游戏,逐字显示故事叙述或得分情况。
    • 示例:基于声音强度变化的互动艺术装置,逐字显示观众产生的音量等级描述。

三、注意事项

  1. 帧率与刷新频率
    • 确保逐字显示的速度适中,既能让用户舒适地阅读,又不至于因过慢影响整体流畅度。
    • 避免过高频率刷新导致屏幕闪烁或增加不必要的功耗。
  2. 内存管理
    • 对于较长的文本串,需考虑Arduino内存限制,防止超出容量引发崩溃。
    • 可采用分段加载策略,仅在需要时加载部分文本到内存中进行显示。
  3. 字体大小与间距
    • 合理选择字体大小以适应屏幕分辨率,避免文字过小难以辨认或过大造成浪费空间。
    • 调整字符间的水平和垂直间距,保证文本排版美观易读。
  4. 兼容性测试
    • 不同型号的OLED屏幕可能有不同的物理尺寸和分辨率,开发过程中应充分测试以确保显示效果一致。
    • 使用标准库函数编写代码,以便更容易移植到其他硬件平台上。
  5. 电源稳定性
    • 尤其是在电池供电的情况下,注意电源电压波动对OLED显示质量的影响。
    • 若发现显示不稳定或出现残影现象,检查电源电路设计是否合理,必要时添加滤波电容。
  6. 调试与优化
    • 利用串口输出或其他调试手段监控程序执行流程,排查潜在问题。
    • 通过实验确定最佳的字符间歇时间和移动速度参数值,优化用户体验。

在这里插入图片描述

1、基础逐字显示文本

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素计
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素计
#define OLED_RESET     -1 // 不使用复位引脚

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const char* message = "Hello, OLED!";

void setup() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 连接到OLED显示屏
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // 进入无限循环,无法初始化显示屏
  }
  display.clearDisplay(); // 清屏
  display.setTextSize(1); // 设置文本大小
  display.setTextColor(SSD1306_WHITE); // 设置文本颜色为白色
  display.setCursor(0, 10); // 设置文本起始位置
}

void loop() {
  for (int i = 0; i < strlen(message); i++) {
    display.clearDisplay(); // 清屏
    display.setCursor(0, 10); // 设置文本起始位置
    display.print(message[i]); // 显示当前字符
    display.display(); // 刷新显示
    delay(500); // 每个字符显示500毫秒
  }
}

要点解读:
逐字显示:通过循环逐个字符显示文本。
清屏操作:每次显示一个字符前清屏,避免字符叠加。
显示更新:使用display.display函数刷新屏幕,显示当前字符。
延迟控制:通过delay函数控制每个字符的显示时间。

2、逐字显示带滚动效果

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素计
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素计
#define OLED_RESET     -1 // 不使用复位引脚

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const char* message = "Hello, OLED!";

void setup() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 连接到OLED显示屏
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // 进入无限循环,无法初始化显示屏
  }
  display.clearDisplay(); // 清屏
  display.setTextSize(1); // 设置文本大小
  display.setTextColor(SSD1306_WHITE); // 设置文本颜色为白色
  display.setCursor(0, 10); // 设置文本起始位置
}

void loop() {
  int cursorX = 0;
  for (int i = 0; i < strlen(message); i++) {
    display.setCursor(cursorX, 10); // 设置文本起始位置
    display.print(message[i]); // 显示当前字符
    display.display(); // 刷新显示
    cursorX += 8; // 每个字符宽度为8像素
    delay(500); // 每个字符显示500毫秒
  }
}

要点解读:
滚动效果:通过逐步增加cursorX实现文本的滚动效果。
逐字显示:每次显示一个字符,并逐步移动光标位置。
显示更新:使用display.display函数刷新屏幕,显示当前字符。
延迟控制:通过delay函数控制每个字符的显示时间。

3、逐字显示带动态清屏

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素计
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素计
#define OLED_RESET     -1 // 不使用复位引脚

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const char* message = "Hello, OLED!";

void setup() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 连接到OLED显示屏
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // 进入无限循环,无法初始化显示屏
  }
  display.clearDisplay(); // 清屏
  display.setTextSize(1); // 设置文本大小
  display.setTextColor(SSD1306_WHITE); // 设置文本颜色为白色
  display.setCursor(0, 10); // 设置文本起始位置
}

void loop() {
  for (int i = 0; i < strlen(message); i++) {
    display.clearDisplay(); // 清屏
    display.setCursor(0, 10); // 设置文本起始位置
    display.print(message[i]); // 显示当前字符
    display.display(); // 刷新显示
    delay(500); // 每个字符显示500毫秒
  }
  delay(2000); // 全部字符显示完毕后延迟2秒
  display.clearDisplay(); // 清屏
  display.display(); // 刷新显示
}

要点解读:
动态清屏:在所有字符显示完毕后清屏,避免文本残留。
逐字显示:通过循环逐个字符显示文本。
显示更新:使用display.display函数刷新屏幕,显示当前字符。
延迟控制:通过delay函数控制每个字符的显示时间。

在这里插入图片描述

4、基础逐字打印效果(基于U8g2库)

#include <U8g2lib.h>
#include <Wire.h>
 
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
 
const char* text = "Hello, Arduino OLED!";
int currentIndex = 0;
 
void setup() {
  u8g2.begin();
  u8g2.setContrast(200);
}
 
void loop() {
  if (currentIndex < strlen(text)) {
    u8g2.firstPage();
    do {
      char buffer[20];
      strncpy(buffer, text, currentIndex + 1);  // 逐字复制到缓冲区
      buffer[currentIndex + 1] = '\0';          // 确保字符串终止
      u8g2.setFont(u8g2_font_ncenB08_tr);
      u8g2.drawStr(10, 20, buffer);
    } while (u8g2.nextPage());
    
    currentIndex++;
    delay(200);  // 控制打印速度
  } else {
    delay(1000);  // 显示完成后暂停1秒
    currentIndex = 0;  // 重置索引以重新开始
  }
}

要点解读:

逐字控制:通过currentIndex逐字符复制到缓冲区,实现打字机效果。
字符串处理:strncpy和终止符\0确保每次仅显示部分文本。
循环重置:文本显示完成后重置索引,实现循环播放。

5、带缓冲区的多行逐字显示(基于Adafruit GFX库)

#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);
 
String receivedText = "";
int displayLine = 0;
 
void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}
 
void loop() {
  if (Serial.available()) {
    receivedText = Serial.readStringUntil('\n');  // 读取串口数据
    displayLine = 0;
  }
 
  if (millis() % 500 < 50) {  // 模拟逐字显示延迟
    static int charIndex = 0;
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    
    // 提取当前行并逐字显示
    int nextLine = receivedText.indexOf('\n', charIndex);
    String line = (nextLine == -1) ? 
                  receivedText.substring(charIndex) : 
                  receivedText.substring(charIndex, nextLine);
    
    for (int i = 0; i <= line.length(); i++) {
      display.clearDisplay();
      display.setCursor(0, displayLine * 10);
      display.print(line.substring(0, i));
      display.display();
      delay(50);  // 逐字延迟
    }
    
    if (nextLine != -1) {
      charIndex = nextLine + 1;
      displayLine++;
    } else {
      charIndex = 0;
    }
  }
}

要点解读:
多行处理:通过\n分隔多行文本,动态计算行高。
串口交互:从串口接收数据,支持实时更新显示内容。
缓冲区管理:使用String类型和substring逐字截取,避免固定数组限制。

6、交互式动态文本(圆弧+椭圆动态组合)

#include <U8g2lib.h>
#include <Wire.h>
 
U8g2_SSD1306_128X32_NONAME_F_HW_I2C u8g2(U8g2_R0, /* reset=*/ U8X8_PIN_NONE);
 
const char* menuItems[] = {"Start", "Settings", "About", "Exit"};
int selectedItem = 0;
int highlightIndex = 0;
 
#define BUTTON_PIN 2
 
void setup() {
  u8g2.begin();
  u8g2.setContrast(200);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}
 
void loop() {
  if (digitalRead(BUTTON_PIN) == LOW) {
    selectedItem = (selectedItem + 1) % 4;  // 切换选项
    highlightIndex = 0;
    delay(300);  // 防抖延迟
  }
 
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB08_tr);
    
    // 逐字高亮显示当前选项
    for (int i = 0; i <= strlen(menuItems[selectedItem]); i++) {
      u8g2.clearBuffer();
      char buffer[20];
      strncpy(buffer, menuItems[selectedItem], i);
      buffer[i] = '\0';
      
      if (i == strlen(menuItems[selectedItem])) {
        u8g2.drawStr(0, 20, "> ");  // 添加光标
      }
      u8g2.drawStr(20, 20, buffer);
      u8g2.sendBuffer();
      delay(100);  // 高亮动画速度
    }
  } while (u8g2.nextPage());
}

要点解读:
交互设计:按钮切换选项,结合digitalRead和防抖逻辑。
高亮效果:通过逐字打印和光标符号(>)指示当前选中项。
动态更新:clearBuffer()和sendBuffer()实现局部刷新,提升性能。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值