介紹
OLED顯示模塊
上圖所示的 OLED 模塊是市場上非常流行的模塊。
市場上有許多該模塊的變體,具有不同的分辨率、通信協議或像素顏色。
它們不需要背光,因為顯示器會產生自己的光。因此,它們消耗的功率更少。市場上有基於 I2C 和 SPI 的 OLED 模塊。
有關 OLED 顯示結構及其命令的更多信息,請參閱SD1306 OLED 顯示
NodeMCU 可以使用 I2C 通信協議與該模塊進行通信。要了解有關 NodeMCU 中 I2C 功能的更多信息,請參閱 NodeMCU I2C with ESPlorer IDE或NodeMCU I2C with Arduino IDE
引腳說明
上圖顯示了一個基於 128x64 I2C 的 OLED 模塊。
VCC:這是模塊的電源引腳。可向該引腳提供 3.3V 或 5V 電源為顯示器供電。
GND: 這是模塊的接地引腳。
SCL 和 SDA: 這些是 I2C 接口的串行時鐘和串行數據引腳。
接口圖
連接 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 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 中編譯程序時出現以下錯誤
然後它會告訴我們我們選擇了不正確的顯示高度。
128x64 顯示器有 64 高,
128x32 顯示器有 32 高,
因此,我們需要選擇合適的顯示器。
我們可以在 Adafruit ssd1306 庫文件夾中的 Adafruit_SSD1306.h 文件中選擇顯示幀大小(我們之前已將其複製到 Arduino 庫文件夾中)。
只需取消註釋我們正在使用的正確顯示行並註釋掉其他人。這裡我們使用的是 128x64 幀大小的顯示器,因此我們取消了它的註釋,如下圖所示。
視頻
資料來源:https://www.electronicwings.com/nodemcu/oled-graphic-display-interfacing-with-nodemcu
沒有留言:
張貼留言