色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美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上進行圖形的顯示。

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

    關注

    5082

    文章

    19104

    瀏覽量

    304810
  • OLED
    +關注

    關注

    119

    文章

    6198

    瀏覽量

    224102
  • IDE
    IDE
    +關注

    關注

    0

    文章

    338

    瀏覽量

    46740
  • Arduino
    +關注

    關注

    188

    文章

    6468

    瀏覽量

    186952
  • ESP8266
    +關注

    關注

    50

    文章

    962

    瀏覽量

    44963
  • u8g2
    +關注

    關注

    0

    文章

    13

    瀏覽量

    1864
收藏 人收藏

    評論

    相關推薦

    ESP8266簡易WIFI天氣時鐘

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

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

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

    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 ?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 ?2660次閱讀
    使用<b class='flag-5'>ESP8266</b>驅動<b class='flag-5'>OLED</b>屏

    ESP8266網絡天氣時鐘OLED顯示

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

    Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環境溫濕度數據及 OLED顯示

    Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環境溫濕度數據及 OLED顯示
    的頭像 發表于 08-13 18:04 ?1121次閱讀
    Arduino Nano 和 NodeMCU <b class='flag-5'>ESP8266</b> 讀取 DHT11 環境溫濕度數據及 <b class='flag-5'>OLED</b><b class='flag-5'>顯示</b>

    ESP8266 太空人動畫的 OLED 顯示

    ESP8266 太空人動畫的 OLED 顯示
    的頭像 發表于 10-08 15:06 ?266次閱讀
    <b class='flag-5'>ESP8266</b> 太空人動畫的 <b class='flag-5'>OLED</b> <b class='flag-5'>顯示</b>
    主站蜘蛛池模板: 亚洲欧美中文字幕网站大全| 城中村快餐嫖老妇对白| 亚洲黄色在线视频| 欧洲video60| 欧美日韩亚洲一区视频二区| 绝色娇嫩美人妻老师| 久久精品影视| 久久国产香蕉| 久久亚洲这里只有精品18| 久久re这里视频只精品首页| 国产婷婷色一区二区三区在线| jj插入bb| 草草色| beeg日本老师| porono日本xxx| 国产剧果冻传媒星空在线观看| 国产午夜精品理论片| 九九精彩视频在线观看视频| 浪荡女天天不停挨CAO日常视| 蜜臀AV色欲A片无码一区| 日本亚洲中文字幕无码区| 丝袜美女被啪啪不带套漫画| 夜夜穞狠狠穞| www亚洲欲色成人久久精品| ccc36色小姐电影| 俄罗斯黄色大片| 国产人妻精品无码AV在线五十路| 国产精品69人妻无码久久久| 国产扒开美女双腿屁股流白浆| 国产v综合v亚洲欧美大片| 国产乱人偷精品视频A人人澡| 好大好硬好爽好深好硬视频| 久久精品123| 欧美大片免费观看| 天美传媒在线观看完整高清 | 伊人影院综合在线| 中文字幕在线永久| 电影 qvod| 久久久高清国产999尤物| 青草国产在线视频免费| 亚洲 在线 日韩 欧美|