0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【實例演示】ESP8266+U8g2庫,玩轉(zhuǎn)OLED顯示

碼農(nóng)愛學(xué)習(xí) ? 來源:碼農(nóng)愛學(xué)習(xí) ? 作者:碼農(nóng)愛學(xué)習(xí) ? 2022-06-06 09:30 ? 次閱讀

上篇文章,介紹了ESP8266Arduino IDE中的基礎(chǔ)使用方法,本篇,來繼續(xù)學(xué)習(xí)OLED顯示屏如何使用ESP8266來控制。

1 ESP8266引腳

首先來看一下ESP8266的引腳定義,因為本篇需要外接OLED,就要先看看ESP8266具有哪些功能的引腳。

ESP8266的引腳定義如下:

pYYBAGKbec2AT93HAADCiHUFHIo818.png

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

3個串口:TXD、RXD

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

1個IIC接口SDA、SCL

多個數(shù)字輸入/輸出接口: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 是一個用于嵌入式設(shè)備的單色圖形庫。U8g2支持單色OLED和LCD,并支持如SSD1306等多種類型的OLED驅(qū)動。

U8g2源碼的開源庫地址:https://github.com/olikraus/u8g2

U8g2專為Arduino提供的方便安裝的庫地址:https://github.com/olikraus/U8g2_Arduino

想要研究U8g2源碼的可以看看這里的源代碼,C和C++寫的。

比如畫直線這個函數(shù)和具體實現(xiàn)如下:

pYYBAGKbeeCAUc_gAABerTj0xlE530.png

3.2 U8g2庫安裝

和上篇介紹ESP8266庫的安裝類似, U8g2庫的安裝也有兩種方式:

在線安裝

在線安裝,在Arduino IDE的菜單的“項目->加載庫->管理庫”中搜索u8g2后安裝即可,對網(wǎng)絡(luò)環(huán)境要求較高

pYYBAGKbeeaAMBBSAABrWDzDS6M806.png

源碼安裝

將U8g2專為Arduino提供的庫(https://github.com/olikraus/U8g2_Arduino)整個下載下來,然后還是在Arduino IDE的菜單的“項目->加載庫”中選擇“添加.ZIP庫...”,然后選到你剛下載的U8g2_Arduino源碼文件夾后即可安裝,也十分的方便。

poYBAGKbeeuAYSUmAABplI1ssmk378.png

3.3 U8g2庫的基礎(chǔ)使用

使用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處,然后以這個點的右上區(qū)域進行字符串的顯示,這樣看起來就是顯示在OLED的第一行,如果你設(shè)置setCursor(0, 0),字符串實際是到屏幕外面了,不會顯示!

poYBAGKbefSAId6NAAFp2qiHrKc059.png

4U8g2常用API函數(shù)

4.1 基礎(chǔ)設(shè)置

setFont(font) 設(shè)置字體

font:u8g2的字體,比較常用的有u8g2_font_unifont_t_symbols(通常使用這個)和u8g2_font_wqy12_t_gb2312b(用于顯示漢字)等

setFontMode(num) 設(shè)置字體背景顏色模式

num:啟用(1)透明模式

num:禁用(0)透明模式

setDrawColor(color) 設(shè)置所有繪圖函數(shù)的位值

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

color1(設(shè)置像素值)

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豎直線的長度(高度)

測試函數(shù):

//畫直線
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圓角的半徑

測試函數(shù):

//畫空心圓角矩形
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函數(shù),也可以使用通用風(fēng)格的print函數(shù)。

drawStr(x,y,string) 繪制一個字符串

x,y起點坐標

string字符串

如果想要使用print顯示漢字,需要先設(shè)置如下兩句:

如果想要顯示變量,使用print函數(shù)即可:

字符串、漢字、變量的測試函數(shù)如下:

//字符串/文字/變量顯示測試
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);//設(shè)置中文字符集
  u8g2.setCursor(0, 48);
  u8g2.print("碼農(nóng)愛學(xué)習(xí)");
  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 畫內(nèi)置圖標

drawGlyph(x,y,addr) 繪制U8g2內(nèi)置的圖標

x,y起點坐標

addr內(nèi)置圖標的地址

U8g2庫內(nèi)置了需要預(yù)先定義的圖形,通過drawGlyp函數(shù)以及指定的地址,即可看OLED上顯示對應(yīng)的圖標:

各個圖形的地址定義如下:

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圖片(數(shù)組)的地址

自定義圖片的顯示,需要先將圖形轉(zhuǎn)換為數(shù)組,可以使用如下工具進行圖片到數(shù)組的轉(zhuǎn)換:

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 總結(jié)

本篇介紹了ESP8266的引腳定義以及U8g2庫在OLED的使用基礎(chǔ),并重點介紹了U8g2庫的各種畫圖函數(shù),這個函數(shù)總結(jié)下來如下下表所示:

poYBAGKbekyABR8NAACmZntqV18236.png

借助U8g2庫,可以十分方便的在OLED上進行圖形的顯示。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5060

    文章

    18975

    瀏覽量

    302093
  • OLED
    +關(guān)注

    關(guān)注

    119

    文章

    6171

    瀏覽量

    223689
  • IDE
    IDE
    +關(guān)注

    關(guān)注

    0

    文章

    334

    瀏覽量

    46614
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6458

    瀏覽量

    186504
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    44757
  • u8g2
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    1836
收藏 人收藏

    評論

    相關(guān)推薦

    ESP8266簡易WIFI天氣時鐘

    本篇介紹了http獲取網(wǎng)絡(luò)天氣的基本原理,并通過實踐,使用ESP8266連網(wǎng)獲取網(wǎng)絡(luò)天氣和網(wǎng)絡(luò)時間,借助U8g2,在OLED顯示當(dāng)前時間
    的頭像 發(fā)表于 06-06 09:31 ?7348次閱讀
    <b class='flag-5'>ESP8266</b>簡易WIFI天氣時鐘

    ESP8266WIFI模塊用途開發(fā)實例 連網(wǎng)播放視頻

    本篇介紹ESP8266OLED上播放視頻,包括ESP8266端的圖像接收與顯示程序,與電腦端的Python讀取視頻并進行編碼與數(shù)據(jù)發(fā)送程序。
    的頭像 發(fā)表于 06-06 09:34 ?6067次閱讀
    <b class='flag-5'>ESP8266</b>WIFI模塊用途開發(fā)<b class='flag-5'>實例</b> 連網(wǎng)播放視頻

    ESP8266 nodemcu是如何使用arduino編程點亮OLED

    --管理工具--開發(fā)板---開發(fā)板管理器文件-示例菜單,選擇的第三方U8G2logo接線編譯測試芯片了解《Nodemcu指引PDF.pdf》使用 ESP8266LUAloader 測試串口收集信息菜單欄有個connectNot
    發(fā)表于 11-01 07:25

    esp8266oled屏幕的顯示

    esp8266oled屏幕的顯示初識esp8266:Wi-Fi 主要特性1、?持 802.11 b/g/n
    發(fā)表于 01-26 08:21

    esp8266,tcp通信實例詳解

    ESP8266工作在station模式下,需確認ESP8266已經(jīng)連接AP(路由器)并分配到IP地址,啟用client連接,ESP8266工作在soft-AP模式下,需確認連接ESP8266
    發(fā)表于 11-04 10:14 ?4.3w次閱讀
    <b class='flag-5'>esp8266</b>,tcp通信<b class='flag-5'>實例</b>詳解

    ESP8266系列封裝資源下載

    ESP8266系列封裝資源下載
    發(fā)表于 05-20 16:04 ?0次下載

    ESP8266 nodemcu使用arduino編程點亮OLED測試

    --管理工具--開發(fā)板---開發(fā)板管理器文件-示例菜單,選擇的第三方U8G2logo接線編譯測試芯片了解《Nodemcu指引PDF.pdf》使用 ESP8266LUAloader 測試串口收集信息菜單欄有個connectNot
    發(fā)表于 10-26 18:21 ?23次下載
    <b class='flag-5'>ESP8266</b> nodemcu使用arduino編程點亮<b class='flag-5'>OLED</b>測試

    ESP8266 PCB的模塊封裝下載

    ESP8266 PCB的模塊封裝下載
    發(fā)表于 10-28 14:50 ?177次下載

    esp8266學(xué)習(xí)筆記⑨:OLED 屏幕的使用(u8g2圖形模塊)

    一、使用前的準備首先先將u8g2的模塊燒錄到nodemcu中,選擇OLED 屏幕所支持的u8g圖形,和所需要的字體,如下圖:構(gòu)建完成之后,下載燒錄到開發(fā)板中。二、
    發(fā)表于 11-26 09:36 ?15次下載
    <b class='flag-5'>esp8266</b>學(xué)習(xí)筆記⑨:<b class='flag-5'>OLED</b> 屏幕的使用(<b class='flag-5'>u8g2</b>圖形<b class='flag-5'>庫</b>模塊)

    ESP8266驅(qū)動SH1306-1.3寸OLED屏幕(u8g2圖形

    OLED屏模塊的同學(xué)幾乎離不開u8g2開源,因為…真的很強大!目前在github上1.7K star,接近2000次commit,基本支持主流的OLED驅(qū)動。具體可以看圖中支持的型
    發(fā)表于 12-22 18:43 ?14次下載
    <b class='flag-5'>ESP8266</b>驅(qū)動SH1306-1.3寸<b class='flag-5'>OLED</b>屏幕(<b class='flag-5'>u8g2</b>圖形<b class='flag-5'>庫</b>)

    使用ESP8266從NTP服務(wù)器獲取時間并在OLED顯示器上顯示

    在本教程中,我們將使用 ESP8266 NodeMCU 從 NTP 服務(wù)器獲取當(dāng)前時間和日期,并將其顯示OLED 顯示屏上。
    的頭像 發(fā)表于 09-01 16:09 ?1.9w次閱讀
    使用<b class='flag-5'>ESP8266</b>從NTP服務(wù)器獲取時間并在<b class='flag-5'>OLED</b><b class='flag-5'>顯示</b>器上<b class='flag-5'>顯示</b>

    SSD1306 OLED上的ESP8266 NTP時鐘

    電子發(fā)燒友網(wǎng)站提供《SSD1306 OLED上的ESP8266 NTP時鐘.zip》資料免費下載
    發(fā)表于 11-09 11:28 ?0次下載
    SSD1306 <b class='flag-5'>OLED</b>上的<b class='flag-5'>ESP8266</b> NTP時鐘

    使用ESP8266驅(qū)動OLED

    在進行后續(xù)的ESP8266學(xué)習(xí)前,我們先來對OLED屏進行驅(qū)動,為后續(xù)學(xué)習(xí)提供直觀的信息顯示。
    的頭像 發(fā)表于 05-19 14:37 ?2514次閱讀
    使用<b class='flag-5'>ESP8266</b>驅(qū)動<b class='flag-5'>OLED</b>屏

    ESP8266網(wǎng)絡(luò)天氣時鐘OLED顯示

    基于ESP8266實現(xiàn)網(wǎng)絡(luò)獲取天氣和時鐘并OLED顯示
    的頭像 發(fā)表于 06-28 04:46 ?948次閱讀
    <b class='flag-5'>ESP8266</b>網(wǎng)絡(luò)天氣時鐘<b class='flag-5'>OLED</b><b class='flag-5'>顯示</b>

    ESP8266 太空人動畫的 OLED 顯示

    ESP8266 太空人動畫的 OLED 顯示
    的頭像 發(fā)表于 10-08 15:06 ?184次閱讀
    <b class='flag-5'>ESP8266</b> 太空人動畫的 <b class='flag-5'>OLED</b> <b class='flag-5'>顯示</b>