2022年8月23日 星期二

OLED 圖形顯示接口與 NodeMCU

 

介紹

OLED顯示模塊

OLED顯示模塊

上圖所示的 OLED 模塊是市場上非常流行的模塊。

市場上有許多該模塊的變體,具有不同的分辨率、通信協議或像素顏色。

它們不需要背光,因為顯示器會產生自己的光。因此,它們消耗的功率更少。市場上有基於 I2C 和 SPI 的 OLED 模塊。

有關 OLED 顯示結構及其命令的更多信息,請參閱SD1306 OLED 顯示

NodeMCU 可以使用 I2C 通信協議與該模塊進行通信。要了解有關 NodeMCU 中 I2C 功能的更多信息,請參閱 NodeMCU I2C with ESPlorer IDENodeMCU I2C with Arduino IDE

 

引腳說明

OLED顯示引腳

 

上圖顯示了一個基於 128x64 I2C 的 OLED 模塊。

 

VCC:這是模塊的電源引腳。可向該引腳提供 3.3V 或 5V 電源為顯示器供電。

GND: 這是模塊的接地引腳。

SCL 和 SDA: 這些是 I2C 接口的串行時鐘和串行數據引腳。

 

接口圖

OLED 與 NodeMCU 的接口

連接 OLED 顯示器與 NodeMCU

例子

在 128x64 OLED 顯示模塊上顯示基於延遲功能的計時器。

 

首先,按照上面的接口圖進行連接。

我們可以用 Lua 腳本或 C/C++ 語言為 NodeMCU DevKit 編寫代碼。我們使用 ESPlorer IDE 用 Lua 腳本編寫代碼,使用 Arduino IDE 用 C/C++ 編寫代碼。要了解更多信息,請參閱 使用 ESPlorer IDE 開始使用 NodeMCU(對 NodeMCU 使用 Lua 腳本)和使用 Arduino IDE 開始使用 NodeMCU(對 NodeMCU 使用基於 C/C++ 語言的 Arduino 草圖)。

 

讓我們首先使用 ESPlorer IDE 為 NodeMCU 編寫 Lua 腳本

 

NodeMCU 的 Lua 腳本

sda = 2 -- SDA Pin
scl = 1 -- SCL Pin

s=0
m=0
h=0
         
function init_OLED(sda,scl) --Set up the u8glib lib
    sla = 0x3C
    i2c.setup(0, sda, scl, i2c.SLOW)
    disp = u8g.ssd1306_128x64_i2c(sla)
    disp:setFont(u8g.font_6x10)
    disp:setFontRefHeightExtendedText()
    disp:setDefaultForegroundColor()
    disp:setFontPosTop()
    --disp:setRot180()           -- Rotate Display if needed
end

function write_OLED() -- Write Display
    disp:firstPage()
    repeat
     disp:drawStr(50, 10, "Timer")
     disp:drawStr(40, 30,  string.format("%02d:%02d:%02d",h,m,s))
     disp:drawStr(20, 50, "ElectronicWings")
    until disp:nextPage() == false
end

-- Main Program 
init_OLED(sda,scl)

tmr.alarm(0, 1000, 1, function() -- Every second increment clock and display
    s = s+1
    if s==60 then
     s=0
     m=m + 1
    end
    if m==60 then
     m=0
     h=h + 1
    end
    if h==13 then
     h=1
    end
    write_OLED()
end)

 

現在讓我們使用 Arduino IDE 為 NodeMCU 編寫一個 Arduino 草圖。

在這裡,我們使用 SSD1306 的 Adafruit 庫。這個庫在 GitHub 上可用。

從這裡下載 Adafruit ssd1306 庫

注意:此庫僅適用於單色顯示器。

 

我們將需要 Adafruit GFX 庫以及我們將在顯示屏上顯示的模式和文本。

從這裡下載 Adafruit GFX 庫

 

提取這些庫並將它們添加到 Arduino IDE 的庫文件夾路徑中。

有關如何將自定義庫添加到 Arduino IDE 並使用其中的示例的信息,請參閱 基礎部分中的將庫添加到 Arduino IDE

 

SSD1306 的 Adafruit 庫帶有 4 個示例草圖。您可以直接將其中一個草圖(取決於您的設備和支持的通信協議)上傳到您的設備。

 

在這裡,我們根據兩個庫中定義的函數編寫了自己的示例草圖。

 

注意:如果您使用示例草圖,請確保使用適當的 I2C 設備地址。在 Adafruit 庫中,使用的設備地址是 0x3C 或 0x3D。使用這些地址之一。您必須找出哪一個是您設備的地址。該地址不是 8 位設備地址;它是由 7 位組成的地址,不考慮讀取或寫入位。嘗試這些地址之一,如果它不起作用,請使用另一個。

 

用於 NodeMCU 的 Arduino 草圖

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET D5
/* Object named display, of the class Adafruit_SSD1306 */
Adafruit_SSD1306 display(OLED_RESET);

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

uint8_t s = 0, m = 0, h = 0;

void setup()   {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); /* Initialize display with address 0x3C */
  display.clearDisplay();  /* Clear display */
  display.setTextSize(1);	/* Select font size of text. Increases with size of argument. */
  display.setTextColor(WHITE);	/* Color of text*/
}

void loop() {
  updateWatch();/* Every second increment clock and display */
  delay(1000);
}

void updateWatch() {
  s = s + 1;
  if (s == 60) {
    s = 0;
    m = m + 1;
  }
  if (m == 60) {
    m = 0;
    h = h + 1;
  }
  if (h == 13)
    h = 1;

  writeOLED();
}

void writeOLED(){
  char time[30];
  display.clearDisplay();  /* Clear display */
  sprintf(time, "%02d:%02d:%02d", h, m, s);
  drawStr(50, 10, "Timer");
  drawStr(40, 30, time);
  drawStr(20, 50, "ElectronicWings");
  display.display();
}

void drawStr(uint8_t x, uint8_t y, char* str){
  display.setCursor(x, y);  /* Set x,y coordinates */
  display.println(str);
}

 

筆記:

如果在 Arduino IDE 中編譯程序時出現以下錯誤

adafruit ssd1306 驅動庫錯誤

 

然後它會告訴我們我們選擇了不正確的顯示高度。

128x64 顯示器有 64 高,

128x32 顯示器有 32 高,

因此,我們需要選擇合適的顯示器。

 

我們可以在 Adafruit ssd1306 庫文件夾中的 Adafruit_SSD1306.h 文件中選擇顯示幀大小(我們之前已將其複製到 Arduino 庫文件夾中)。

 

只需取消註釋我們正在使用的正確顯示行並註釋掉其他人。這裡我們使用的是 128x64 幀大小的顯示器,因此我們取消了它的註釋,如下圖所示。

在 adafruit 庫中選擇顯示類型

 

視頻

 


資料來源:https://www.electronicwings.com/nodemcu/oled-graphic-display-interfacing-with-nodemcu

沒有留言: