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");
}
按下不同按键,显示不同内容,实现页面切换