使用u8g2库驱动oled显示屏幕

本文介绍了用于嵌入式设备的单色图形库u8g2,它适用于多种平台和显示屏,提供通用API,支持两种模式。还阐述了采用ESP32使用u8g2库以IIC方式驱动oled屏幕的实验,包括项目创建、添加库、库的使用,以及实现oled全局刷新和按键切换页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

u8g2库介绍

U8g2库是主要用于嵌入式设备的单色图形库,适用于Arduino、STM32、ESP8266等多种平台。它支持多种单色OLED和LCD显示屏,包括SSD1306、SSD1322、SSD1325、SSD1327、SSD1329、SSD1606、SSD1607等不同的显示控制器。

U8g2提供了一套通用的API,使得用户能够在不同类型的显示屏上创建图形界面。它具有简单的API和强大的文本与图形支持功能,即使初学者也能迅速上手。

U8g2支持无缓冲模式和完整缓冲模式,前者在有限的RAM中运行复杂的图形任务,但显示更新可能更慢;后者在RAM中存储整个屏幕的图像,使得显示更新更快,但需要更多RAM。

实验介绍

采用ESP32使用u8g2库采用IIC方式驱动oled屏幕,不同按键显示不同内容

硬件

ESP32开发板、按键、杜邦线

软件

vscode+platformio、arduino框架

实验过程

项目创建

在这里插入图片描述

1.Name:填写自定义的项目名称
2.Board:Espressif Esp32 Dev module 选择合适开发版(第一次会很慢,可以科学上网)
3.Framework:Arduino开发框架
4.Location:勾选(用户默认位置),取消勾选(用户自定义位置)

添加u8g2库

添加库

1.选择Libraries
2.在搜索框搜索需要添加的库(如u8g2)
3.点击搜索到的这个库,(可以看到下面支持的设备)

添加库
在这里插入图片描述

选择添加到对应的项目

在这里插入图片描述

添加成功后会显示添加的库

u8g2库的使用

在上一步中成功在项目中添加了u8g2库,我们知道u8g2库是一个功能庞大的库,
里面包含了不同型号,不同尺寸和不同协议(如spi,iic)的的显示屏

找到正确的型号尺寸,选择正确的协议才能成功的驱动屏幕

在main.cpp中添加#include<U8g2lib.h>库
在oled屏幕显示案例

#include <Arduino.h>
#include<U8g2lib.h>
#define clk 18
#define sda 23 
//构造对象
U8G2_SSD1306_128X64_NONAME_F_SW_I2C oled(U8G2_R0,clk,sda,U8X8_PIN_NONE);

void setup() {
//初始化oled对象
  oled.begin();
//开启中文字符
  oled.enableUTF8Print();
//设置字体  
  oled.setFont(u8g2_font_wqy12_t_chinese2);
}

void loop() {
	//清除缓存区
  oled.clearBuffer();
// 绘制字符
  oled.setCursor(0,15);
// 绘制内容
  oled.printf("hello,world!");
// 绘制汉字
  oled.setCursor(0,40);
// 绘制内容
  oled.printf("你好,这个世界");
// 发送缓存区到OLED
  oled.sendBuffer(); 
}


按住ctrl键点击#include<U8g2lib.h>,可以看到u8g2库中封装很多型号的api函数接口,我们如何使用它呢,首先要创建一个对象,不同的型号屏幕对于不同的类我们要如何选择呢,以我使用的屏幕为例,采用SSD1306,采用IIC通信,尺寸大小128*64,即可在#include<U8g2lib.h>中找对应的类
U8G2_SSD1306_128X64_NONAME_F_SW_I2C
U8G2_SSD1306_128X64_NONAME_1_SW_I2C
U8G2_SSD1306_128X64_NONAME_2_SW_I2C
U8G2_SSD1306_128X64_NONAME_F_HW_I2C
U8G2_SSD1306:驱动的芯片
128X64:芯片的尺寸大小
SW:software(软件IIC(可以使用任意GPIO模拟IIC))
HW:硬件IIC
F:全局刷新
1:只存储一页
2:只存储两页

通信描述
缓冲区大小功能描述
1微控制器RAM中仅存储一页显示存储器,使用firstPage () /nextPage ()循环在显示器上绘图。
2与1相同,在微控制器RAM中保留两个页面,这将1比快两倍。
F在微控制器RAM中保留完整显示帧缓冲区的副本。使用clearBuffer ()清除RAM,使用sendBuffer ()将微控制器RAM传输到显示器。}

使用全局刷新要在每次切换页面使用clearBuffer()清除和sendBuffer()将数据发送到oled上

oled.setCursor(0,15);//设置显示的位置,从屏幕的左上角为(0,0)坐标,切记不可超过屏幕的长度

oled全局刷新,按键切换

不同按键显示不同页面

#include <Arduino.h>
#include<U8g2lib.h>

#define key1 26
#define key2 27

#define scl 18
#define sda 23
void oled_show_1();
void oled_show_2();
//构造对象
U8G2_SSD1306_128X64_NONAME_F_SW_I2C oled(U8G2_R0,scl,sda,U8X8_PIN_NONE);
uint8_t count = 0;
void setup() {
//串口波特率初始化
  Serial.begin(9600);
//初始化oled对象
  oled.begin();
//开启中文字符
  oled.enableUTF8Print();
//设置字体  
  oled.setFont(u8g2_font_wqy12_t_chinese2);
// 按键引脚初始化
  pinMode(key1,INPUT_PULLUP);
  pinMode(key2,INPUT_PULLUP);
}

void loop() {
  if(digitalRead(key1)==0){
    delay(10);
    if(digitalRead(key1)==0){
      oled_show_1();
      while(digitalRead(key1)==0);
      Serial.printf("A");
    }
  }
  if(digitalRead(key2)==0){
    delay(10);
    if(digitalRead(key2)==0){
      oled_show_2();
      while(digitalRead(key2)==0);
      Serial.printf("B");
    }
  }
 
}
void oled_show_1(){
//清除缓存区
  oled.clearBuffer();
// 绘制字符
  oled.setCursor(0,15);
// 绘制内容
  oled.printf("hello,world!");
// 绘制汉字
  oled.setCursor(0,40);
// 绘制内容
  oled.printf("你好,这个世界");
// 发送缓存区到OLED
  oled.sendBuffer();
  delay(500);
  // Serial.printf("A");

}

void oled_show_2(){
  //清除缓存区
  oled.clearBuffer();
// 绘制字符
  oled.setCursor(0,15);
// 绘制内容
  oled.printf("hello !");
// 绘制汉字
  oled.setCursor(0,40);
// 绘制内容
  oled.printf("你好啊!");
// 发送缓存区到OLED
  oled.sendBuffer();
  delay(500);
  // Serial.printf("A");

}

按下不同按键,显示不同内容,实现页面切换

在这里插入图片描述

在这里插入图片描述

欢迎大家指教

<think>嗯,用户让我介绍ESP32、U8g2OLED显示屏的组合。首先,我需要确定用户对这个主题的了解程度。可能他们刚开始接触硬件开发,想了解如何将这些组件结合起来使用。我应该从基础开始,分步骤解释每个部分的作用,然后说明它们如何协同工作。 首先,ESP32是什么?它是一个低功耗的微控制器,带有Wi-Fi和蓝牙功能,常用于物联网项目。我需要简单说明它的特点,比如处理能力、GPIO引脚数量、无线功能等,但不要过于技术化,避免让用户感到困惑。 接下来是OLED显示屏。用户可能知道这是一种显示器,但需要解释它的类型和优势,比如自发光、高对比度、低功耗等。还要提到常见的尺寸,比如0.96寸,分辨率如128x64,以及接口类型,比如I2C或SPI。这里需要强调I2C更常用,因为接线简单,适合初学者。 然后是U8g2。这个用于驱动多种单色显示器,包括OLED。需要说明它支持的功能,比如图形绘制、文本显示,以及支持的不同控制器型号,比如SSD1306或SH1106。同时要提到U8g2的优点,比如跨平台兼容性,但也要指出可能的内存消耗问题,特别是对于资源有限的设备如Arduino Uno。不过ESP32内存较大,所以问题不大。 接下来需要整合这三个部分,说明如何将它们连接起来。用户可能需要硬件连接的具体步骤,比如ESP32的引脚连接,SDA和SCL对应的GPIO,例如GPIO21和22。还要提到电源和接地的连接,确保用户知道如何正确接线。 然后,软件部分。需要提供示例代码,使用Arduino IDE的环境,包括安装U8g2的步骤,包含必要的头文件,初始化对象,设置函数和循环函数。代码中需要注释说明每一步的作用,比如begin()初始化,setFont设置字体,drawStr显示文本,以及sendBuffer刷新屏。还要提醒用户可能需要根据实际硬件调整参数,比如控制器型号、地址、尺寸和旋转方向。 常见问题部分需要考虑用户在实际操作中可能遇到的困难,比如白屏可能是接线错误,地址不正确需要检查I2C地址,内存不足的情况,以及字体选择的问题。这些问题可以帮助用户自行排查,减少重复提问的可能。 最后,应用场景部分可以激发用户的兴趣,展示这个组合的实用性,比如物联网状态显示、传感器数据可视化、小型游戏等。这有助于用户想象自己的项目应用,从而更有动力去尝试。 需要注意避免使用复杂术语,保持语言简洁明了。确保步骤清晰,用户能够一步步跟随操作。同时,检查是否有遗漏的关键点,比如的安装方法、代码中的关键函数等。如果有不确定的地方,比如ESP32的默认I2C引脚是否需要根据具体型号调整,应该查阅资料确认,或者建议用户参考官方文档。 总之,结构需要清晰,分部分介绍每个组件,然后整合硬件连接和软件设置,最后给出应用示例和常见问题解答。确保用户能够全面理解并动手实践,同时预见到可能的问题和解决方法。</think>好的,我将分步骤为您介绍ESP32、U8g2OLED显示屏的组合使用: 1. **硬件组成** - **ESP32**:双核WiFi/蓝牙物联网开发板 - 240MHz主频,520KB SRAM - 支持Arduino/ESP-IDF开发框架 - **OLED显示屏**:0.96寸单色显示屏 - 分辨率:128x64(常见型号) - 驱动芯片:SSD1306/SH1106 - 接口:I2C(常用)或SPI 2. **U8g2特性** - 支持多种单色显示屏驱动 - 提供丰富的图形绘制功能: ```cpp drawBox(x,y,w,h) // 绘制矩形 drawCircle(x,y,r) // 绘制圆形 drawXBM(x,y,w,h,bitmap) // 显示位图 ``` - 内置多种字体(需选择对应字符集) - 支持硬件/软件I2C/SPI通信 3. **硬件连接(I2C接口)** ``` ESP32 OLED 3.3V ---> VCC GND ---> GND GPIO21--> SDA GPIO22--> SCL ``` 4. **软件配置步骤** ```cpp #include <U8g2lib.h> #include <Wire.h> // 初始化对象(以SSD1306为例) U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); void setup() { u8g2.begin(); u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体 } void loop() { u8g2.clearBuffer(); u8g2.drawStr(0, 10, "Hello World!"); u8g2.drawFrame(0,15,128,30); // 绘制边框 u8g2.sendBuffer(); delay(1000); } ``` 5. **常见问题处理** - **白屏问题**:检查电源是否3.3V,I2C地址是否正确(默认0x3C) - **显示乱码**:确认setFont()选择的字体包含目标字符 - **闪烁问题**:使用双缓冲模式(`_F_`版本驱动) - **内存不足**:使用`UNICODE`精简模式编译 6. **进阶应用** - 显示传感器数据(温湿度、气压等) - 制作物联网状态显示屏 - 开发简单UI界面(配合按钮输入) - 低功耗模式实现(ESP32深度睡眠+定时唤醒) 7. **优化建议** - 使用XBM格式转换工具制作自定义图形 - 优先选择HALF/HW模式驱动提升性能 - 合理使用局部刷新减少功耗 - 采用I2C地址扫描工具排查硬件问题: ```cpp void scanI2C() { Wire.begin(); for(byte addr=1; addr<127; addr++) { Wire.beginTransmission(addr); if(Wire.endTransmission() == 0) { Serial.print("Found: 0x"); Serial.println(addr,HEX); } } } ``` 这个组合非常适合需要小型可视化界面的物联网项目,兼具低功耗和高性能的特点。建议从基础示例开始,逐步增加功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值