本文开发环境:
- MCU型号:ESP8266
- IDE环境 : Arduino IDE 1.8.9
- 0.96寸 OELD模块
本文内容:
- esp8266 使用 u8g2图形库 驱动 OELD 显示字符和图标
- 自定义软件IIC的接口
一、简介
使用ESP8266模块(LoLin)驱动0.96寸OLED:
二、u8g2 图形库
u8g2 是一个强大的图形库,支持多种控制器,当然包括本文所用 oled模块的驱动IC (SSD1306),图形库通过提供API函数的方法,使用户可以非常方便的显示各种各样图标,字符甚至动效等。详见 u8g2 wiki。在 wiki 中,我们可以看到该库提供的控制器:
1. u8g2 图形库的安装
在使用功 u8g2 库之前,需要在Arduino IDE(以下简称IDE)中安装 u8g2 图形库,该库和其他库的安装相同:
- 在 IDE 中按住:Ctrl + Shift + I 打开库管理器:
- 在库管理中搜索 u8g2 并点击右下角 “安装” :
(本文已经安装最新版本,固右下角不显示安装按钮) - 测试库的安装
在 IDE 编辑窗口中,输入以下简单的测试程序,并编译,通过即表示安装已经成功:
#include <Arduino.h>
#include <U8g2lib.h> //引用 u8g2 图形库
void setup(void)
{
}
void loop(void)
{
}
2. 运行一个示例
本小结首先通过一个简单的示例,让OLED显示一个“HELLO WORLD!”字符串
2.1 接线
MCU | OLED |
---|---|
D1 | SCL |
D2 | SDA |
2.2 打开一个示例
当我们安装好u8g2库以后,在【文件】-【示例】-【第三方库】中,就可以找到 u8g2 官方给我们提供的各种 demo:
我们在 full_buffer 目录中,选择一个简单的程序:HelloWorld :
如果我们直接编译的话,将会报错,原因是我们没有u8g2
这个对象,之所以示例程序没有给我们创建,是因为它无法预知我们使用的是什么oled驱动器,接线方式如何,所以需要用户自己实例化一个u8g2
对象,方法只需要在上文注释掉的内容中,找到合适的代码,取消注释即可,本文使用的oled控制器为SSD1306,IIC驱动,并使用默认的IIC口,无Reset引脚,故选择取消以下这一行的注释:
如上图所示,打开注释以后,既可编译,编译完成即可下载(由于官方的示例是只读的,所以需要另存为一份,或者是整体复制出来):
在运行一个示例以后,其他示例的方法是一致的,本文简介运行的示例为:Weather:
重要提示
注意,这里是 page_buffer 中的 Weather 而不是 full_buffer 中的Weather ,在 1.8.13 测试中,full_buffer 的例子是无法正常运行的,原因应该是显存方式不同:
/*
U8g2lib Example Overview:
Frame Buffer Examples: clearBuffer/sendBuffer. Fast, but may not work with all Arduino boards because of RAM consumption
Page Buffer Examples: firstPage/nextPage. Less RAM usage, should work with all Arduino boards.
U8x8 Text Only Example: No RAM usage, direct communication with display controller. No graphics, 8x8 Text only.
This is a page buffer example.
*/
从上文提示可获取到的信息,Frame Buffer 的例子可能不合适所有的arduino板子,因为他需要更大的内存空间来保证更快的速度。
3. 修改接线引脚
上文我们直接将SCL和SDA和MCU的D1,D2连接,若我们想要使用其他的IO口来驱动OLED,只需要在实例化对象的时候,输入对应的SCL,和SDA脚即可。
比如,我们想要SDA接开发板上的D5,SCL接开发板上的D6,这个时候我们可以通过原理图查看,D5,D6对应的GPIO口编号:
这样,SDA接D5,对应接的是GPIO14,SCL接的是D6,对应接的是GPIO12我们就可以编写如下程序:
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 14, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,10,"Hello SSD1306!"); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
}
运行如下: