Arduino通过u8g2库驱动OLED

示例ssd-1306

  • Arduino驱动OLED屏幕
      • 关于oled一二
      • oled有两种通讯方式
    • 一、u8g2库控制4线OLED屏幕
      • 引脚
      • 代码:
    • 二、u8g2库控制6线OLED屏幕
      • 引脚介绍:
      • 程序1(显示汉字):
      • 程序2:
    • 三、总结
    • 四、注意事项

Arduino驱动OLED屏幕

参考1:
0. Arduino驱动LED128X64 - U8g2 自定义中文字库_

  1. SPI通讯 + Arduino Uno + 六针 0.96 OLED + U8g2
  2. Arduino驱动OLED屏幕
  3. Arduino使用u8g2库函数驱动4线/6线OLED屏幕
  4. 深入学习Arduino u8g2 OLED库,一篇就够
  5. arduino OLED显示温度 ,二氧化碳,和空气质量,使用u8g2库(4线)
  6. arduino+u8g2库+OLED屏-U8glib库 增强版 U8G2库(6线)
  7. U8G2库官方测试程序,
  8. OLED显示屏与Arduino_蔚蓝慕的博客

常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制

Arduino通过u8g2库驱动OLED_第1张图片

Arduino通过u8g2库驱动OLED_第2张图片
Arduino通过u8g2库驱动OLED_第3张图片

本人推荐u8g2这个库函数来控制,不管是4线还是6线都可以用u8g2这个库函数来控制。

关于oled一二

  • 其一 像素点点阵
OLED其实就是一个M x n 的像素点阵,想显示什么就得把具体位置的像素点亮起来。对于每一个像素点,有可能是1点亮,也有可能是0点亮;
1
  • 其二 坐标系

Arduino通过u8g2库驱动OLED_第4张图片
在坐标系中,左上角是原点,向右是X轴,向下是Y轴。

oled有两种通讯方式

只需要了解原理即可,不需要了解很深入。

I2C通讯:I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

SPI通讯:SPI总线是一种4线总线,因其硬件功能很强,所以与SPI有关的软件就相当简单,使中央处理器(Central Processing Unit,CPU)有更多的时间处理其他事务。

一、u8g2库控制4线OLED屏幕

对于4线OLED,直接使用I2C通讯。(u8g2库)

引脚

OLED0.96 IIC模块使用IIC通信接口,只需要接4根线就可以完成OLED屏数据通信

  • VCC:电源正极(接5V电源)
  • GND:电源负极(接地)
  • SCL:IIC时钟信号线
  • SDA:IIC数据信号线

VCC接到开发板的5V电源引脚上,GND接到开发板GND引脚上,SCL和SDA需要根据不同的开发板引脚定义来接线Arduino – Wire 库 – 太极创客
Arduino通过u8g2库驱动OLED_第5张图片

代码:

用OLED模块显示英文用的最多,显示汉字、显示图片,这类不常用的。

#include 
#include 

#ifdef U8X8_HAVE_HW_I2C
#include 
#endif

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,SCL,SDA,U8X8_PIN_NONE);

void setup(void) 
{
  u8g2.begin();
}

void loop(void) 
{
  u8g2.clearBuffer();  //清除缓存         
  u8g2.setFont(u8g2_font_ncenB08_tr); 
  u8g2.drawStr(0,10,"Hello World!");  
  u8g2.drawStr(0,20,"This is bro cainiao!");  
  u8g2.drawStr(0,30,"Welcome to U8G2!");  
  u8g2.sendBuffer();  //显示      
  delay(1000);  
}


二、u8g2库控制6线OLED屏幕

对于6线OLED,直接使用SPI通讯。(u8g2库)

六针oled屏没有CS接口,其在硬件中直接接地(只有一个SPI从机时,CS可以不使用);此外,Arduino发送指令和数据到 OLED,OLED 并不需要反馈任何数据。因此, OLED 模块是只有 MOSI(SDA)引脚,没 有 MISO 引脚的。

引脚介绍:

GND:电源地
VCC:2.2V~5.5V
SCL(D0):CLK 时钟 (高电平 2.2V~5.5V)
SDA(D1):MOSI 数据(高电平 2.2V~5.5V)
RST:复位(高电平 2.2V~5.5V)
D/C:数据/命令(高电平 2.2V~5.5V)

接线:颜色对颜色线连接。
Arduino通过u8g2库驱动OLED_第6张图片

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI  u8g2 (U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);    //这个定义脚代码细心看就懂了。

U8G2_R0 是一个参数: 指定大局显示的基本布局:

布局 描述
U8G2_R0 正常显示
U8G2_R1 90度顺时针旋转
U8G2_R2 180度顺时针旋转
U8G2_R3 270度顺时针旋转
U8G2_MIRROR 正常显示镜像内容(v2.6.x版本以上使用) 注意:U8G2_MIRROR需要与setFlipMode()配搭使用.

U8G2支持的OLED控制芯片: https://github.com/olikraus/u8g2/wiki/gallery
不同芯片的不同脚定义代码: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp

通过这段程序的定义,我们知道:
OLED模块上的 SCL 对应于 clock
OLED模块上的 SDA 对应于 data
OLED模块上的 RES 对应于 reset
OLED模块上的 DC 对应于 dc

其中CS不管,CS是应用在7线OLED屏幕上面的,用的少!((CS脚可以不接)

对于使用SPI通讯控制6线OLED,OLED与主控板的连线可以自定义,读者可以自己编辑。 但这些需要连接到数字IO 上面。

程序1(显示汉字):

/*

  PrintUTF8.ino
  
  Use the (Arduino compatible) u8g2 function "print"  to draw a text.

  Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
*/

#include 
#include 

#ifdef U8X8_HAVE_HW_SPI
#include 
#endif
#ifdef U8X8_HAVE_HW_I2C
#include 
#endif


/*
  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.
    翻译:U8g2lib 示例概览:
    帧缓冲区示例:clearBuffer/sendBuffer。速度快,但由于占用 RAM,可能不适用于所有 Arduino 板
    页面缓冲区示例:firstPage/nextPage。内存占用较少,适用于所有 Arduino 板。
    U8x8 纯文本示例: 不使用 RAM,直接与显示控制器通信。无图形,仅 8x8 文本。
*/


U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);



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);
}


Arduino通过u8g2库驱动OLED_第7张图片

程序2:

#include 
#include 
#include 

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

void setup(void) 
{
  u8g2.begin();   //选择U8G2模式,或者U8X8模式
}

void loop(void) 
{
  u8g2.clearBuffer();         // 清除内部缓冲区
  u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  u8g2.drawStr(0,10,"Hello World!");  // write something to the internal memory
  u8g2.drawStr(0,20,"This is EHANG!");  // write something to the internal memory
  u8g2.drawStr(0,30,"Welcome to U8G2!");  // write something to the internal memory
  u8g2.sendBuffer();          // transfer internal memory to the display
  delay(1000);  
}

效果图:
Arduino通过u8g2库驱动OLED_第8张图片

三、总结

网上很多类似这种的语法,个人建议不要这样使用,代码的移植性会很差的:不要按照此例程来书写!!!

void loop(void) {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB14_tr);
    u8g2.drawStr(0,15,"Hello World!");
  } while ( u8g2.nextPage() );
  delay(1000);
}

用Arduino控制OLED,就用U8G2这个库函数就可以了,直接点击“加载库”,就可以在IDE里面自行安装库函数的。

四、注意事项

使用上述例程就能达到显示多行英文的目的,如果读者做实验出现显示不全等现象,可能是:

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

这个引脚定义出了问题。关于如何定义,参考此篇文章:点击进入

前面的一串英文定义很讲究的**(U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI)**
显示不全,就去检查这个函数。

通过SPI通讯时,引脚可以自定义,但是需要接在数字引脚上;使用I2C通讯时,OLED上面的引脚必须要和开发板上面的I2C引脚对应起来接线!

你可能感兴趣的:(#,Arduino,传感器相关,arduino)