色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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上進行圖形的顯示。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5087

    文章

    19149

    瀏覽量

    306299
  • OLED
    +關注

    關注

    119

    文章

    6210

    瀏覽量

    224449
  • IDE
    IDE
    +關注

    關注

    0

    文章

    338

    瀏覽量

    46793
  • Arduino
    +關注

    關注

    188

    文章

    6473

    瀏覽量

    187392
  • ESP8266
    +關注

    關注

    50

    文章

    962

    瀏覽量

    45149
  • u8g2
    +關注

    關注

    0

    文章

    13

    瀏覽量

    1875
收藏 人收藏

    評論

    相關推薦

    ESP8266簡易WIFI天氣時鐘

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

    ESP8266WIFI模塊用途開發實例 連網播放視頻

    本篇介紹ESP8266OLED上播放視頻,包括ESP8266端的圖像接收與顯示程序,與電腦端的Python讀取視頻并進行編碼與數據發送程序。
    的頭像 發表于 06-06 09:34 ?6233次閱讀
    <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系列封裝資源下載
    發表于 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 ?177次下載

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

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

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

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

    ESP8266網絡天氣時鐘OLED顯示

    基于ESP8266實現網絡獲取天氣和時鐘并OLED顯示
    的頭像 發表于 06-28 04:46 ?1260次閱讀
    <b class='flag-5'>ESP8266</b>網絡天氣時鐘<b class='flag-5'>OLED</b><b class='flag-5'>顯示</b>

    ESP8266 太空人動畫的 OLED 顯示

    ESP8266 太空人動畫的 OLED 顯示
    的頭像 發表于 10-08 15:06 ?308次閱讀
    <b class='flag-5'>ESP8266</b> 太空人動畫的 <b class='flag-5'>OLED</b> <b class='flag-5'>顯示</b>
    主站蜘蛛池模板: 麻豆精品传媒2021网站入口| 久久综合九色| 女生扒开尿口| 中文视频在线| 久久影院午夜理论片无码| 亚洲专区区免费| 精品国产自在现线拍国语| 亚洲精品国产SUV| 含羞草国产亚洲精品岁国产精品| 午夜视频体内射.COM.COM| 国产精品搬运| 亚洲国产综合久久精品 | 欧美顶级情欲片免费看| 97视频免费观看2区| 欧美激情性AAAAA片欧美| jizz日本黄色| 日韩AV片无码一区二区三区不卡| 丰满少妇被猛烈进出69影院| 同时和两老师双飞| 国产中文视频无码成人精品| 伊人久久电影院| 美女内射少妇三区五区| 爱情岛aqdlttv| 午夜影院和视费x看| 国模大胆一区二区三区| 正在播放久久| 热の中文 AV天堂| 国产色精品久久人妻无码看片| 亚洲乱码日产精品BD在线下载| 久久免费资源福利资源站| TUBE19UP老师学生| 午夜伦伦电影理论片费看| 精品久久久久久久99热| 2020精品极品国产色在线| 青柠高清在线观看完整版| 国产精品午夜小视频观看| 伊人久久大香线蕉综合bd高清| 琪琪电影午夜理论片77网| 国产婷婷午夜精品无码A片| 中文字幕永久在线| 日韩做A爰片久久毛片A片毛茸茸|