NodeMCU ESP8266使用U8G2驱动7针SPI 1306 OLED屏

本实验将7针SPI由SSD1306驱动的0.96寸OLED屏(128*64像素)与NodeMCU ESP8266连接。使用的是arduino的U8g2库。用两种构造器方法进行字符和汉字的输出。

一、NodeMCU和OLED显示器之间的SPI引脚连接
可以使用硬件SPI和软件SPI。
使用硬件SPI时,通信速度较快,OLED的sck和mosi引脚应对应连接到NodeMCU SPI接口的sck、mosi引脚,其他引脚用户可以随意指定。例如:D0(closck)接HSCLK(GPIO14 D5),D1接HMOSI(GPIO13 D7),其他引脚随便接都可以。
使用模拟SPI时,通信速度较慢,但OLED 的所有引脚可以连接到NodeMCU 任意引脚。

我使用的模拟SPI。
GND引脚连接到NodeMCU GND,VDD引脚可以连接到3.3V或5V,
SCK时钟引脚连接到NodeMCU的D1(GPIO5).
SDA引脚(MOSI数据引脚)连接到NodeMCU的D2(GPIO4)。
RESET引脚转到D5(GPIO14)。
DC数据命令引脚连接到NodeMCU的D6(GPIO12) 。
CS引脚连接NodeMCU的D7(GPIO13)。
二、添加U8g2库
不论是Arduino IDE还是vscode platform直接搜索U8g2库,下载就好了,下载好后可以查看例子。在主程序中记得添加头文件#include
另外要会选择构造器,就是根据自己OLED具体情况选择。在例子中可以查看有很多。

我的构造器如下:

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 5, /* data=*/ 4, /* cs=*/ 13, /* dc=*/ 12, /* reset=*/ 14);

构造器的名字包括以下几方面:
U8G2是前缀,
SSD1306是显示器的驱动芯片型号,
128X64_NONAME显示器像素,
1表示缓存大小Buffer Size,可取如下:
1 保持一页的缓冲区,用于firstPage/nextPage的PageMode.
2 保持两页的缓冲区,用于firstPage/nextPage的PageMode…
F 获取整个屏幕的缓冲区,ram消耗大,一般用在ram空间比较大的arduino板子.
4W_SW_SPI表示的是Communication通信协议:
4W_SW_SPI 4-wire (clock, data, cs and dc) software emulated SPI
4W_HW_SPI 4-wire (clock, data, cs and dc) hardware SPI (based on Arduino SPI library)
2ND_4W_HW_SPI If supported, second 4-wire hardware SPI (based on Arduino SPI library)
3W_SW_SPI 3-wire (clock, data and cs) software emulated SPI
SW_I2C Software emulated I2C/TWI
HW_I2C Hardware I2C based on the Arduino Wire library
2ND_HW_I2C If supported, use second hardware I2C (Arduino Wire lib)
6800 8-bit parallel interface, 6800 protocol
8080 8-bit parallel interface, 8080 protocol

参数除了第一个,后面的看注释就知道是什么意思了,但要***注意***填写的数字是ESP8266的GPIOx的数字x。
第一个参数U8G2_R0 是旋转(rotation): 指定大局显示的基本布局:布局 描述
U8G2_R0 正常显示
U8G2_R1 90度顺时针旋转
U8G2_R2 180度顺时针旋转
U8G2_R3 270度顺时针旋转
U8G2_MIRROR 正常显示镜像内容(v2.6.x版本以上使用) 注意:U8G2_MIRROR需要与setFlipMode()配搭使用.

三、编写函数
U8G2使用两种构造器显示字符串和汉字,程序中有多种方法,可以通过取消或者加上注释的方法来选择调试自己想用的模式和构造器。

/*
* 软件模拟7线SPI OLED
* 使用两种构造器Page mode和Full screen buffer mode
* 输出字符和汉字   
*/
#include 
#include 

//Page mode构造器带有“1”或者2,
//软件SPI
// U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 5, /* data=*/ 4, /* cs=*/ 13, /* dc=*/ 12, /* reset=*/ 14);
//Full screen buffer mode构造器用带F的全屏缓存模式
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 5, /* data=*/ 4, /* cs=*/ 13, /* dc=*/ 12, /* reset=*/ 14);
//硬件spi:注意D0(closck)接HSCLK(GPIO14 D5),D1接HMOSI(GPIO13  D7),其他引脚如下随便接都可以
// U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 2, /* dc=*/ 5, /* reset=*/ 4);	// Arduboy (Production, Kickstarter Edition)

/*Page mode构造器:
构造器必须带有“1”或者2,比如:
U8G2_ST7920_128X64_ 1 _SW_SPI(rotation, clock, data, cs [, reset])
用法:
调用 u8g2.firstPage()
开始一个 do while 循环
在循环内部 操作一些绘制方法
不断判断 u8g2.nextPage()
*/
//显示字符串
/*
void setup(void) {
  u8g2.begin();  
}

void loop(void) {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.drawStr(0,24,"Hello China!");
  } while ( u8g2.nextPage() );
  //delay(1000);
}
*/


//显示汉字
/*
void setup(void) {
  u8g2.begin();
  u8g2.enableUTF8Print();		// enable UTF8 support for the Arduino print() function
}

void loop(void) {
  u8g2.setFont(u8g2_font_unifont_t_chinese2);  // use chinese2 for all the glyphs of "你好世界"
  //u8g2.setFont(u8g2_font_b10_t_japanese1);  // all the glyphs of "こんにちは世界" are already included in japanese1: Lerning Level 1-6
  u8g2.setFontDirection(0);
  u8g2.firstPage();
  do {
    u8g2.setCursor(0, 15);
    u8g2.print("Hello World!");
    u8g2.setCursor(0, 40);
    u8g2.print("你好世界");		// Chinese "Hello World" 
    //u8g2.print("こんにちは世界");		// Japanese "Hello World" 
  } while ( u8g2.nextPage() );
  delay(1000);
}
*/

/*Full screen buffer mode
构造器必须带有F,比如:
U8G2_ST7920_128X64_F_SW_SPI(rotation, clock, data, cs [, reset])
用法:
清除缓冲区 u8g2.clearBuffer()
操作一些绘制方法
发送缓冲区的内容到显示器 u8g2.sendBuffer().
*/
/*
void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB14_tr);
  u8g2.drawStr(0,20,"Hello sea!");
  u8g2.sendBuffer();
}
*/
//此方式必须要用F构造器才行,用page模式显示不全
void setup(void) {
  u8g2.begin();
  u8g2.enableUTF8Print();		// enable UTF8 support for the Arduino print() function
}

void loop(void) {
  u8g2.setFont(u8g2_font_unifont_t_chinese2);  // use chinese2 for all the glyphs of "你好世界"
  u8g2.setFontDirection(0);
  u8g2.clearBuffer();
  u8g2.setCursor(0, 15);
  u8g2.print("Hello World!");
  u8g2.setCursor(0, 40);
  u8g2.print("你好世界");		// Chinese "Hello World" 
  u8g2.sendBuffer();
  
  delay(1000);
}

你可能感兴趣的:(ESP8266,U8G2,ESP8266,OLED,NODEMCU,SPI)