0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【实例演示】ESP8266+U8g2库,玩转OLED显示

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-06-06 09:30 次阅读

上篇文章,介绍了ESP8266Arduino IDE中的基础使用方法,本篇,来继续学习OLED显示屏如何使用ESP8266来控制。

1 ESP8266引脚

首先来看一下ESP8266的引脚定义,因为本篇需要外接OLED,就要先看看ESP8266具有哪些功能的引脚。

ESP8266的引脚定义如下:

pYYBAGKbec2AT93HAADCiHUFHIo818.png

可以看出,ESP8266的功能引脚包括:

3个串口:TXD、RXD

2个SPI接口:MOSI、MISO、SCLK、CS

1个IIC接口SDA、SCL

多个数字输入/输出接口:D1~D8

1个模拟输入/输出接口:A0

2 OLED简介

OLED模块的尺寸多种多样,比较常用的是0.96寸的矩形的,也有其它尺寸的OLED。

此外,屏幕的接口,一般有IIC接口和SPI接口两种。加上电源,IIC接口需要4根线,而SPI接口需要6根线,IIC的通信比SPI通信慢,但4线接线更方便。

本篇使用最为常用的0.96寸的OLED,分辨率128x64,黄蓝双色

注意这里的双色,不是值一个像素点可以显示两种颜色,而是屏幕的上部1/4只能显示黄色,下部的3/4只能显示蓝色,并且黄色和蓝色之间,不是紧密靠在一起的,而是有约一个像素点的间隙。

poYBAGKbedqAJM06AAGOjIHeZDY420.png

3 U8g2库简介与安装

3.1 U8g2库简介

U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。

U8g2源码的开源库地址:https://github.com/olikraus/u8g2

U8g2专为Arduino提供的方便安装的库地址:https://github.com/olikraus/U8g2_Arduino

想要研究U8g2源码的可以看看这里的源代码,C和C++写的。

比如画直线这个函数和具体实现如下:

pYYBAGKbeeCAUc_gAABerTj0xlE530.png

3.2 U8g2库安装

和上篇介绍ESP8266库的安装类似, U8g2库的安装也有两种方式:

在线安装

在线安装,在Arduino IDE的菜单的“项目->加载库->管理库”中搜索u8g2后安装即可,对网络环境要求较高

pYYBAGKbeeaAMBBSAABrWDzDS6M806.png

源码安装

将U8g2专为Arduino提供的库(https://github.com/olikraus/U8g2_Arduino)整个下载下来,然后还是在Arduino IDE的菜单的“项目->加载库”中选择“添加.ZIP库...”,然后选到你刚下载的U8g2_Arduino源码文件夹后即可安装,也十分的方便。

poYBAGKbeeuAYSUmAABplI1ssmk378.png

3.3 U8g2库的基础使用

使用U8g2库进行OLED的显示十分简单,首先要包含两个库,U8g2lib和Wire,后者是IIC通信需要用。

对于IIC接口的OLED,需要在程序中指定一下引脚的接口定义,如果是SPI接口,可以参考U8g2库自带例程中SPI接口是使用方法。

然后在Ardunio的setup中进行u8g2的初始化。

最后在Ardunio的loop中就可以编写自己的逻辑了。

另外,U8g2库在loop中的通用写法是使用do{}while()的形式:

  u8g2.firstPage();
  do
  {
    //自己的的逻辑
  } while (u8g2.nextPage());
  delay(1000);

一个简单的HelloWord在OLED中的显示如下:

#include 
#include 

#define SCL 5
#define SDA 4

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE);   

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

void loop()
{
  u8g2.setFont(u8g2_font_unifont_t_symbols);
  u8g2.firstPage();
  do
  {
    u8g2.setCursor(0, 15); //指定显示位置
    u8g2.print("Hello World!"); //使用print来显示字符串
  } while (u8g2.nextPage());
  delay(1000);
}

注意,setCursor(0, 15),是将画图位置移动到x=0,y=15处,然后以这个点的右上区域进行字符串的显示,这样看起来就是显示在OLED的第一行,如果你设置setCursor(0, 0),字符串实际是到屏幕外面了,不会显示!

poYBAGKbefSAId6NAAFp2qiHrKc059.png

4U8g2常用API函数

4.1 基础设置

setFont(font) 设置字体

font:u8g2的字体,比较常用的有u8g2_font_unifont_t_symbols(通常使用这个)和u8g2_font_wqy12_t_gb2312b(用于显示汉字)等

setFontMode(num) 设置字体背景颜色模式

num:启用(1)透明模式

num:禁用(0)透明模式

setDrawColor(color) 设置所有绘图函数的位值

color0(显示RAM中的清晰像素值)

color1(设置像素值)

color2(异或模式)

4.2 画像素点

drawPixel(x,y)

只有指定位置即可显示像素点,比如把所有的点都显示出来:

//画像素点-填充屏幕
void testDrawPixelToFillScreen()
{
  int t = 1000;
  u8g2.clearBuffer();

  for (int j = 0; j < 64; j++)
  {
    for (int i = 0; i < 128; i++)
    {
      u8g2.drawPixel(i, j);
    }
  }
  SEND_BUFFER_DISPLAY_MS(t);
}

效果如下面的右图:

pYYBAGKbegGASuKhAAE_ou6Afi8923.png

注意测试程序中,我定义了一个宏定义,用于延时显示每一次的画图,方便观察OLED的显示过程:

#define SEND_BUFFER_DISPLAY_MS(ms)
  do {
    u8g2.sendBuffer(); 
    delay(ms);
  }while(0);

可以指定延时时间,如500毫秒或1000毫秒等。

4.3 画直线

drawLine(x0,y0,x1,y1) 画一条线

x0,y0线的起点

x1,y1线的终点

drawHLine(x,y,w) 画一条水平线

x,y线的起点

w水平线的长度(宽度)

drawVLine(x,y,h) 画一条竖直线

x,y线的起点

h竖直线的长度(高度)

测试函数:

//画直线
void testDrawLine()
{
  int t = 500;
  u8g2.clearBuffer();
  u8g2.drawStr(33, 14, "drawLine");

  u8g2.drawLine(0, 0, 127, 63);
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawLine(0, 0, 127, 0);
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawLine(32, 15, 127, 15);
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawLine(33, 16, 127, 16);
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawLine(127, 0, 127, 15);
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawLine(127, 16, 127, 63);
  SEND_BUFFER_DISPLAY_MS(t);
}

显示效果如下面的左上图:

pYYBAGKbeg2AI_qMAAIA8-fyAy4317.png

4.4 画空心/实心(圆角)矩形

drawFrame(x,y,w,h) 绘制一个空心框

drawBox(x,y,w,h) 绘制一个实心矩形

drawRFrame(x,y,w,h,r) 绘制一个空心框(圆角)

drawRBox(x,y,w,h,r) 绘制一个实心矩形 (圆角)

x,y起点坐标

w,h框的宽度和高度

r圆角的半径

测试函数:

//画空心圆角矩形
void testDrawRFrame()
{
  int t = 500;
  int x = 16;
  int y = 32;
  int w = 50;
  int h = 20;
  int r = 3;
  u8g2.clearBuffer();
  u8g2.drawStr(0, 15, "drawRFrame");

  u8g2.drawRFrame(x, y, w, h, r);
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawRFrame(x+w+5, y-10, w-20, h+20, r);
  SEND_BUFFER_DISPLAY_MS(t);
}

显示效果如下面的右下图:

poYBAGKbeheAC37HAAKcbUQAVco034.png

4.5 画空心/实心圆

drawCircle(x,y,rad,opt) 绘制一个空心圆

drawDisc(x,y,rad,opt) 绘制一个实心圆

x,y为圆心坐标

rad为圆的半径

opt为选择画的部分,分为:

U8G2_DRAW_UPPER_RIGHT(右上)

U8G2_DRAW_UPPER_LEFT(左上)

U8G2_DRAW_LOWER_LEFT(左下)

U8G2_DRAW_LOWER_RIGHT(右下)

U8G2_DRAW_ALL(全部)

空心圆

//画空心圆
void testDrawCircle()
{
  int t = 500;
  int stx = 0;  //画图起始x
  int sty = 16; //画图起始y
  int with = 16;//一个图块的间隔
  int r = 15;   //圆的半径
  u8g2.clearBuffer();
  u8g2.drawStr(0, 15, "drawCircle");

  u8g2.drawCircle(stx, sty - 1 + with, r, U8G2_DRAW_UPPER_RIGHT); //右上
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawCircle(stx + with, sty, r, U8G2_DRAW_LOWER_RIGHT); //右下
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawCircle(stx - 1 + with * 3, sty - 1 + with, r, U8G2_DRAW_UPPER_LEFT); //左上
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawCircle(stx - 1 + with * 4, sty, r, U8G2_DRAW_LOWER_LEFT); //左下
  SEND_BUFFER_DISPLAY_MS(t);
  u8g2.drawCircle(stx - 1 + with * 2, sty - 1 + with * 2, r, U8G2_DRAW_ALL);//整个圆
  SEND_BUFFER_DISPLAY_MS(t);
}

显示效果如下面的左图:

poYBAGKbeiGAMvz_AAFhBefIXCo882.png

注意,U8g2库画出的圆,因像素点的显示原理,圆的直径占用的宽度不是半径的2倍,而是2倍再加一个像素点

4.6 画空心/实心椭圆

drawEllipse(x,y,rx,ry,opt) 绘制一个空心椭圆

drawFilledEllipse(x,y,rx,ry,opt) 绘制一个实心椭圆

x,y为圆心坐标

rx,ry为与椭圆x和y方向的半径

opt与画圆时的作用一致

椭圆的显示与圆的显示类似,只是椭圆可以分别指定x和y方向的半径

pYYBAGKbeiiAcBsqAAFueLnZB2E095.png

4.7 字符串、汉字和变量显示

字符串的显示,可以使用drawStr函数,也可以使用通用风格的print函数。

drawStr(x,y,string) 绘制一个字符串

x,y起点坐标

string字符串

如果想要使用print显示汉字,需要先设置如下两句:

如果想要显示变量,使用print函数即可:

字符串、汉字、变量的测试函数如下:

//字符串/文字/变量显示测试
void testDrawStr()
{
  int t = 1000;
  u8g2.clearBuffer();
  u8g2.drawStr(0, 14, "drawStr / print");
  SEND_BUFFER_DISPLAY_MS(t);

  u8g2.drawStr(0, 32, "~!@#$%^&*()_+");
  SEND_BUFFER_DISPLAY_MS(t);

  u8g2.enableUTF8Print();//enable UTF8
  u8g2.setFont(u8g2_font_wqy12_t_gb2312b);//设置中文字符集
  u8g2.setCursor(0, 48);
  u8g2.print("码农爱学习");
  SEND_BUFFER_DISPLAY_MS(t);

  int a = 234;
  u8g2.setCursor(0, 64);
  u8g2.print("int a = ");
  u8g2.setCursor(40, 64);
  u8g2.print(a);//显示变量
  SEND_BUFFER_DISPLAY_MS(t);
}

显示效果:

poYBAGKbei6AKiXzAAE3Itt8FjQ874.png

4.8 画内置图标

drawGlyph(x,y,addr) 绘制U8g2内置的图标

x,y起点坐标

addr内置图标的地址

U8g2库内置了需要预先定义的图形,通过drawGlyp函数以及指定的地址,即可看OLED上显示对应的图标:

各个图形的地址定义如下:

pYYBAGKbejSAe_9sAABSE2pKprM819.png

编写一个测试程序:

void testGlyph()
{
  int t = 1000;
  u8g2.clearBuffer();
  u8g2.drawStr(0, 14, "drawGlyph");

  u8g2.drawGlyph(0, 32, 0x23f0);
  SEND_BUFFER_DISPLAY_MS(t);

  u8g2.drawGlyph(16, 32, 0x23f3);
  SEND_BUFFER_DISPLAY_MS(t);

  u8g2.drawGlyph(32, 32, 0x2603);
  SEND_BUFFER_DISPLAY_MS(t);

  u8g2.drawGlyph(48, 32, 0x2615);
  SEND_BUFFER_DISPLAY_MS(t);

  u8g2.drawGlyph(64, 32, 0x2618);
  SEND_BUFFER_DISPLAY_MS(t);
}

测试效果如下:

poYBAGKbejqAD5Y4AAFsG5VIg5E365.png

4.9 画自定义图片

drawXBM(x,y,w,h,addr) 绘制一个实心矩形 (圆角)

x,y起点坐标

w,h图片的宽度和高度`

addr图片(数组)的地址

自定义图片的显示,需要先将图形转换为数组,可以使用如下工具进行图片到数组的转换:

https://tools.clz.me/image-to-bitmap-array

poYBAGKbekKAD1kgAACT-KGgdJg541.png

编写测试程序:

// width: 128, height: 48
const unsigned char bilibili[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ... 省略若干行 };

void testDrawXBM()
{
  int t = 1000;
  u8g2.clearBuffer();
  u8g2.drawStr(0, 14, "drawXBM");
  u8g2.drawXBM(0, 16, 128, 48, bilibili);
  SEND_BUFFER_DISPLAY_MS(t);
}

效果如下:

pYYBAGKbekeAHKyXAAFGB-9-O74723.png

5 总结

本篇介绍了ESP8266的引脚定义以及U8g2库在OLED的使用基础,并重点介绍了U8g2库的各种画图函数,这个函数总结下来如下下表所示:

poYBAGKbekyABR8NAACmZntqV18236.png

借助U8g2库,可以十分方便的在OLED上进行图形的显示。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5020

    文章

    18505

    浏览量

    293569
  • OLED
    +关注

    关注

    119

    文章

    6075

    浏览量

    222303
  • IDE
    IDE
    +关注

    关注

    0

    文章

    329

    浏览量

    46444
  • Arduino
    +关注

    关注

    186

    文章

    6446

    浏览量

    185474
  • ESP8266
    +关注

    关注

    50

    文章

    952

    浏览量

    44262
  • u8g2
    +关注

    关注

    0

    文章

    13

    浏览量

    1763
收藏 人收藏

    评论

    相关推荐

    ESP8266简易WIFI天气时钟

    本篇介绍了http获取网络天气的基本原理,并通过实践,使用ESP8266连网获取网络天气和网络时间,借助U8g2,在OLED显示当前时间
    的头像 发表于 06-06 09:31 6846次阅读
    <b class='flag-5'>ESP8266</b>简易WIFI天气时钟

    ESP8266WIFI模块用途开发实例 连网播放视频

    本篇介绍ESP8266OLED上播放视频,包括ESP8266端的图像接收与显示程序,与电脑端的Python读取视频并进行编码与数据发送程序。
    的头像 发表于 06-06 09:34 5703次阅读
    <b class='flag-5'>ESP8266</b>WIFI模块用途开发<b class='flag-5'>实例</b> 连网播放视频

    ESP8266 nodemcu是如何使用arduino编程点亮OLED

    --管理工具--开发板---开发板管理器文件-示例菜单,选择的第三方U8G2logo接线编译测试芯片了解《Nodemcu指引PDF.pdf》使用 ESP8266LUAloader 测试串口收集信息菜单栏有个connectNot
    发表于 11-01 07:25

    esp8266oled屏幕的显示

    esp8266oled屏幕的显示初识esp8266:Wi-Fi 主要特性1、⽀持 802.11 b/g/n
    发表于 01-26 08:21

    esp8266,tcp通信实例详解

    ESP8266工作在station模式下,需确认ESP8266已经连接AP(路由器)并分配到IP地址,启用client连接,ESP8266工作在soft-AP模式下,需确认连接ESP8266
    发表于 11-04 10:14 4.3w次阅读
    <b class='flag-5'>esp8266</b>,tcp通信<b class='flag-5'>实例</b>详解

    esp8266中文资料汇总(esp8266引脚图_与单片机连接_串口wifi实例

    本文首先介绍了esp8266引脚图功能与esp8266特性,其次介绍了 单片机与ESP8266串口连接及最小系统连接与程序分享,最后介绍了esp8266串口wifi
    发表于 05-24 08:36 22.3w次阅读
    <b class='flag-5'>esp8266</b>中文资料汇总(<b class='flag-5'>esp8266</b>引脚图_与单片机连接_串口wifi<b class='flag-5'>实例</b>)

    ESP8266系列封装资源下载

    ESP8266系列封装资源下载
    发表于 05-20 16:04 0次下载

    ESP8266 nodemcu使用arduino编程点亮OLED测试

    --管理工具--开发板---开发板管理器文件-示例菜单,选择的第三方U8G2logo接线编译测试芯片了解《Nodemcu指引PDF.pdf》使用 ESP8266LUAloader 测试串口收集信息菜单栏有个connectNot
    发表于 10-26 18:21 23次下载
    <b class='flag-5'>ESP8266</b> nodemcu使用arduino编程点亮<b class='flag-5'>OLED</b>测试

    ESP8266 PCB的模块封装下载

    ESP8266 PCB的模块封装下载
    发表于 10-28 14:50 171次下载

    esp8266学习笔记⑨:OLED 屏幕的使用(u8g2图形模块)

    一、使用前的准备首先先将u8g2的模块烧录到nodemcu中,选择OLED 屏幕所支持的u8g图形,和所需要的字体,如下图:构建完成之后,下载烧录到开发板中。二、
    发表于 11-26 09:36 15次下载
    <b class='flag-5'>esp8266</b>学习笔记⑨:<b class='flag-5'>OLED</b> 屏幕的使用(<b class='flag-5'>u8g2</b>图形<b class='flag-5'>库</b>模块)

    esp8266 nodemcu oled_esp8266开发笔记(二):OLED显示屏制作网络时钟

    大家好,我是阿普。搬运知识,分享经验的Joker在开发笔记(一)中,我们已经对ESP8266有了一个比较基础的了解了。这期我们用ESP8266OLED显示屏来做一个网络时钟。事不宜迟
    发表于 12-17 18:00 14次下载
    <b class='flag-5'>esp8266</b> nodemcu <b class='flag-5'>oled_esp8266</b>开发笔记(二):<b class='flag-5'>OLED</b><b class='flag-5'>显示</b>屏制作网络时钟

    ESP8266驱动SH1306-1.3寸OLED屏幕(u8g2图形

    OLED屏模块的同学几乎离不开u8g2开源,因为…真的很强大!目前在github上1.7K star,接近2000次commit,基本支持主流的OLED驱动。具体可以看图中支持的型
    发表于 12-22 18:43 14次下载
    <b class='flag-5'>ESP8266</b>驱动SH1306-1.3寸<b class='flag-5'>OLED</b>屏幕(<b class='flag-5'>u8g2</b>图形<b class='flag-5'>库</b>)

    SSD1306 OLED上的ESP8266 NTP时钟

    电子发烧友网站提供《SSD1306 OLED上的ESP8266 NTP时钟.zip》资料免费下载
    发表于 11-09 11:28 0次下载
    SSD1306 <b class='flag-5'>OLED</b>上的<b class='flag-5'>ESP8266</b> NTP时钟

    使用ESP8266驱动OLED

    在进行后续的ESP8266学习前,我们先来对OLED屏进行驱动,为后续学习提供直观的信息显示
    的头像 发表于 05-19 14:37 2059次阅读
    使用<b class='flag-5'>ESP8266</b>驱动<b class='flag-5'>OLED</b>屏

    ESP8266网络天气时钟OLED显示

    基于ESP8266实现网络获取天气和时钟并OLED显示
    的头像 发表于 06-28 04:46 126次阅读
    <b class='flag-5'>ESP8266</b>网络天气时钟<b class='flag-5'>OLED</b><b class='flag-5'>显示</b>