步驟1:我們要做的事情今日學(xué)習(xí)
我們將討論:
-什么是OLED顯示器?
-然后我們將仔細(xì)研究0.91(128x32)和0.96(128x64)I2C OLED顯示器
-接下來(lái),我們將討論將Adafruit庫(kù)安裝到Arduino IDE
-然后我們將NodeMCU和Arduino連接到OLED顯示器
-接下來(lái),我們將看一下代碼并在其中顯示一些圖形和文本
-我們還將討論應(yīng)用自定義字體和顯示圖像
-然后,我們將使用I2C多路復(fù)用器將多個(gè)OLED連接到微控制器
-最后,我們將討論人們?cè)谑褂肙LED顯示器時(shí)犯的一些常見(jiàn)錯(cuò)誤
步驟2:硬件要求
對(duì)于本教程,我們需要:
-A面包板
-一個(gè)0.91英寸(128x32)和0.96英寸(128x64)I2C OLED顯示器
-Arduino UNO/NANO(方便使用)
-NodeMCU
-TCA9548A I2C多路復(fù)用器
-很少使用連接電纜
-和一根USB電纜來(lái)上傳代碼
步驟3:什么是OLED顯示器?
OLED或有機(jī)發(fā)光二極管是發(fā)光的
二極管(LED),其中的電致發(fā)光元件該層是一層有機(jī)化合物薄膜(數(shù)百萬(wàn)個(gè)小的LED燈),可響應(yīng)電流而發(fā)光。
OLED用于在電視屏幕,計(jì)算機(jī)顯示器,便攜式系統(tǒng)等設(shè)備中創(chuàng)建數(shù)字顯示器。例如手機(jī),手持游戲機(jī)和PDA。 OLED顯示器不發(fā)光,因?yàn)樗l(fā)出可見(jiàn)光。
步驟4:
OLED顯示器的類型很多
市場(chǎng)上的
-尺寸
-顏色
-品牌
-協(xié)議
-SPI(串行外圍接口)或I2C
-無(wú)源矩陣(PMOLED)或有源矩陣(AMOLED)控制方案
我將討論將藍(lán)色的0.91(128x32 OLED)和0.96(128x64 OLED)I2C OLDE顯示器連接到Arduino NANO和NodeMCU。 I2C總線技術(shù)僅使用MCU的2個(gè)引腳,因此我們可以為其他傳感器提供堆。
步驟5:細(xì)看
在這兩個(gè)顯示器上放個(gè)更近些。
在這些顯示器的背面,有很多貼片SMD電容器和電阻器焊接在板上。但是,由于它是I2C設(shè)備,我們只關(guān)心這2個(gè)引腳(SCL和SDA)
顯示器僅使用四根電線連接到Arduino –兩根用于電源(VCC和GND),兩根用于數(shù)據(jù)(串行)時(shí)鐘SCL和
串行數(shù)據(jù)SDA),從而使接線非常簡(jiǎn)單。數(shù)據(jù)連接為I2C(I2C,IIC或內(nèi)部集成電路),該接口也稱為T(mén)WI(兩線接口)。
-板載引腳的順序可以不同,因此始終為三重在將其連接到項(xiàng)目之前,請(qǐng)進(jìn)行檢查。
-工作電壓在3v至5v之間,但是,最好使用制造商數(shù)據(jù)表中的指導(dǎo)。
-有時(shí)我們需要在項(xiàng)目中使用2個(gè)顯示器。那么,我們?nèi)绾螌?shí)現(xiàn)呢?
訣竅是在顯示器上顯示一個(gè)可配置的地址。該單元的可配置地址在0x78和0x7A之間。只需從一側(cè)解焊0Ohm電阻器并將其連接到另一側(cè),或者僅通過(guò)放置全局焊料即可更改地址。在本教程后面的部分中,當(dāng)我們將多個(gè)顯示器連接到Arduino時(shí),我們將深入討論它。
在圖中,這些顯示器看起來(lái)非常大。但是,實(shí)際上,它們很小。它們由128 x 32/64個(gè)單獨(dú)的OLED像素制成,不需要任何背光。看看這個(gè),看看它有多小。即使它們很小,它們也可以在任何電子項(xiàng)目中非常有用。
步驟6:庫(kù)
有幾個(gè)庫(kù)可以控制這些顯示
。過(guò)去我曾經(jīng)使用過(guò)“ u8glib庫(kù)”,但是我發(fā)現(xiàn)AdaFruit庫(kù)在我們的項(xiàng)目中非常易于理解和使用。因此,我將在本教程中使用AdaFruit庫(kù)。
要控制OLED顯示,您需要“ adafruit_GFX.h”庫(kù)和“ adafruit_SSD1306.h”庫(kù)。
有兩種下載庫(kù)并將其安裝到Arduino IDE的方法。
方法1
轉(zhuǎn)到“庫(kù)管理器”并搜索“ adafruit_SSD1306”和“ adafruit_gfx” “
選擇最新版本,然后單擊“安裝”按鈕。
安裝后,您可以在程序中使用這些庫(kù)。
方法2
這兩個(gè)庫(kù)也可以從github下載(兩者都需要):
我將在下面的描述中提供鏈接。
顯示庫(kù):https://github.com/adafruit/Adafruit_SSD1306
GFX庫(kù):https://github.com/adafruit/Adafruit-GFX-Library
下載后,從以下位置復(fù)制Adafruit_SSD1306-master文件夾將下載的壓縮文件下載到Arduino庫(kù)文件夾中。通常在Windows系統(tǒng)上的文檔》 Arduino》庫(kù)中可以找到此文件夾。在Linux上,通常位于主文件夾》 Arduino》庫(kù)中。最后,在Arduino庫(kù)文件夾中,將Adafruit_SSD1306-master文件夾重命名為Adafruit_SSD1306。
步驟7:
現(xiàn)在,讓我們看一下“ Adafruit_SSD1306” .h“
文件
在此庫(kù)中我們需要了解兩件事:
1。如果要使用較小的顯示器,請(qǐng)使用默認(rèn)的128_32,否則對(duì)于較大的顯示器請(qǐng)注釋128_32,然后取消注釋128_64
2。如果您已將0x7A地址焊接在板上(稍后將討論),則將7位0x3D地址用于較大的顯示器,否則使用默認(rèn)的0x3C地址。對(duì)于較小的顯示器,地址為0x3C。
步驟8:為128 X 64/32 OLED布線
讓我們從連接開(kāi)始
要注意的第一件事,也是最重要的一點(diǎn)是,某些顯示器可能會(huì)交換GND和VCC電源引腳。檢查您的顯示器以確保它與圖像相同。如果引腳被交換,請(qǐng)確保更改與Arduino或NodeMCU的連接。
-NodeMCU OLED接線
OLED VCC – NodeMCU 3.3V
OLED GND – NodeMCU GND
OLED SCL – NodeMCU D1
OLED SDA – NodeMCU D2
-Arduino Uno OLED接線
OLED VCC – Arduino 5V
OLED GND – Arduino GND
OLED SCL – Arduino Uno A5
OLED SDA – Arduino Uno A4
-Arduino MEGA 2560 OLED接線
OLED VCC – Arduino 5V
OLED GND – Arduino GND
OLED SCL – Arduino MEGA 2560引腳21
OLED SDA – Arduino MEGA 2560引腳20
第9步:代碼
Adafruit庫(kù)提供了非常好的示例,用于顯示128x32和128x64。
該庫(kù)位于“文件”》“示例”》“ Adafruit SSD1306”下,然后顯示
我們將使用128x32 I2C示例,并將其修改為可與128x64和128x32顯示器一起使用通過(guò)將其連接到Arduino,然后連接到NodeMCU板。
代碼首先包括兩個(gè)Adafruit庫(kù)。在本教程中,我將只強(qiáng)調(diào)代碼的那些部分,這些部分是我們?cè)诎迳虾惋@示器上加載所必需的。如果您想了解更多有關(guān)代碼的信息,請(qǐng)?jiān)谖业牟┛突蛳旅娴脑u(píng)論部分中添加評(píng)論,我會(huì)盡力與您聯(lián)系。
-首先,我們將代碼加載到Arduino Nano連接到128x32顯示器。
我們可以按原樣使用該代碼,而無(wú)需進(jìn)行任何修改。
128x32使用0x3C地址,因此此位看起來(lái)很好,讓我們仔細(xì)檢查標(biāo)頭庫(kù),是的,它也使用0x3C地址,顯示類型為128x32。
-現(xiàn)在可以連接128x64顯示器。我們知道它默認(rèn)情況下使用0x3C地址,因此我們不需要在代碼或庫(kù)中更新地址。
我們只需要注釋128_32并在注釋中取消注釋128_64。標(biāo)頭庫(kù),然后在我們的代碼中將LCDHEIGHT更改為64。
-現(xiàn)在要在NodeMCU上運(yùn)行相同的代碼,我們需要在代碼中再更改一行。
“ #define OLED_RESET 4”》“ #define OLED_RESET LED_BUILTIN”其余部分代碼與Arduino
差不多,顯示所有我們首先需要使用
display.clearDisplay()清除上一個(gè)屏幕的內(nèi)容。//清除緩沖區(qū)
然后繪制對(duì)象
testdrawline();//畫(huà)一條線
在硬件上顯示它
display.display();//使它們?cè)陲@示硬件上可見(jiàn)!
等待一段時(shí)間,然后顯示下一個(gè)項(xiàng)目。
delay(2000);//等待2秒
在此示例中,我們將顯示一些項(xiàng)目,例如文本,線條,圓圈,滾動(dòng)文本,三角形等等。繼續(xù)發(fā)揮您的想象力,并在這些微型顯示屏上顯示任何內(nèi)容。
步驟10:自定義文本和添加圖像
有時(shí)您的代碼需要顯示自定義字體和
圖像。如果您在位映射方面非常擅長(zhǎng),那么您只需要通過(guò)打開(kāi)或關(guān)閉顯示器的微小LED來(lái)創(chuàng)建自定義字體和圖像來(lái)創(chuàng)建字節(jié)數(shù)組即可。
但是,我在進(jìn)行這些映射,并且不想花費(fèi)數(shù)小時(shí)來(lái)創(chuàng)建位圖表。
那么,我有什么選擇?我通常使用兩個(gè)網(wǎng)站來(lái)生成自定義字體和圖像。鏈接在下面的描述中提供。
自定義字體
------------
轉(zhuǎn)到字體轉(zhuǎn)換器網(wǎng)站,選擇字體系列,樣式,大小,庫(kù)版本作為“ Adafruit GFX字體”,然后單擊“創(chuàng)建”按鈕。在此頁(yè)面的右側(cè),您可以看到實(shí)際顯示的字體。
根據(jù)您的選擇,網(wǎng)頁(yè)將生成字體頭文件。在您的代碼所在的文件夾中創(chuàng)建一個(gè)名為“ modified_font.h”的文件,并將生成的代碼復(fù)制并保存到其中。然后,您只需要在代碼中包括頭文件即可使用自定義字體。
#include“ modified_font.h”
然后,您只需要在顯示之前設(shè)置字體即可
display.setFont(&Your_Fonts_Name);
您可以從剛添加到項(xiàng)目中的頭文件中獲取字體的名稱。就是這樣,很容易。
使用自定義字體時(shí),內(nèi)存始終是個(gè)問(wèn)題,因此請(qǐng)始終考慮內(nèi)存將消耗的字節(jié)。只要記住Arduino UNO只有32K的內(nèi)存即可。
自定義圖像
-------------
顯示位圖屏幕上的圖像,您首先需要?jiǎng)?chuàng)建一個(gè)128 x 64/32尺寸的圖像。
我正在使用舊的“ MS Paint”創(chuàng)建一個(gè)128 x 64位圖圖像,然后將其上傳到此圖像。圖像轉(zhuǎn)換器網(wǎng)站。該網(wǎng)站將圖像轉(zhuǎn)換為字節(jié)串,可與Arduino和OLED顯示器一起使用。
首先將圖像上傳到網(wǎng)站。然后選中“反轉(zhuǎn)圖像顏色”復(fù)選框,然后將“輸出代碼格式”更改為“ Arduino代碼”,然后選擇方向并單擊“生成代碼”按鈕以生成字節(jié)數(shù)組。 “預(yù)覽”部分向您顯示圖像在實(shí)際顯示器上的外觀。
我在本教程中隨附了代碼,可用于顯示圖像。您只需要用剛生成的陣列替換我的代碼中的陣列,然后將其加載到Arduino。
步驟11:連接2臺(tái)顯示器
將兩個(gè)128 x 64顯示器連接到您的項(xiàng)目很容易。
您只需要從0x78地址上拆下0Ohm電阻并將其放在0x7A上,然后在代碼中使用0x3D地址而不是默認(rèn)的0x3C。
您一定想知道為什么我們使用0x3C和0x3D地址而不是實(shí)際的0x78和0x7A。 Arduino接受7位地址,而不接受8位硬件地址。因此,我們首先需要將8位地址轉(zhuǎn)換為二進(jìn)制,然后將最低有效位切掉以獲得7位。然后將7位轉(zhuǎn)換為十六進(jìn)制,以獲取您在代碼中輸入的0x3C或0x3D地址。
首先,通過(guò)為顯示指定一個(gè)唯一的名稱來(lái)初始化顯示:
Adafruit_SSD1306 display1( OLED_REST);
Adafruit_SSD1306 display2(OLED_REST);
然后在代碼中使用顯示1和顯示2調(diào)用帶有其中設(shè)備地址的begin語(yǔ)句:
display1.begin(SSD1306_SWITCHCAPVCC,0x3C);//顯示1個(gè)op地址0x3C
display2.begin(SSD1306_SWITCHCAPVCC,0x3D);//顯示2個(gè)操作地址0x3D
就是這樣,您現(xiàn)在可以繼續(xù)使用其余代碼中的Display 1或Display 2來(lái)做您想做的任何事情。我在本教程中提供了一個(gè)示例。
接線與我們之前所做的完全相同,幾乎您只需要在Arduino或NodeMCU的相同I2C引腳上添加另一個(gè)顯示器即可。然后,MCU將根據(jù)這些地址在I2C數(shù)據(jù)線上發(fā)送數(shù)據(jù)。
步驟12:連接2個(gè)以上的顯示器
現(xiàn)在,如果要連接兩個(gè)以上的顯示器怎么辦?
Arduino的引腳數(shù)量有限,因此您所連接的屏蔽數(shù)量不能超過(guò)一定數(shù)量。而且,它只有一對(duì)I2C總線。
那么,如何將兩個(gè)以上的I2C顯示器連接到Arduino?訣竅是使用TCA9548多路復(fù)用器。
TCA9548通過(guò)為每個(gè)傳感器從屬子分配一個(gè)唯一的通道,使單個(gè)微控制器可以與多達(dá)64個(gè)具有相同或不同I2C地址的傳感器進(jìn)行通信。 -bus。
當(dāng)我們談?wù)撏ㄟ^(guò)2根線將數(shù)據(jù)發(fā)送到多個(gè)設(shè)備時(shí),我們需要一種解決它們的方法。就像郵遞員走一條路,將郵件包投到不同的房子一樣,因?yàn)樗鼈兩厦鎸?xiě)有不同的地址。
多路復(fù)用器連接到微型計(jì)算機(jī)的3V3,GND,SDA和SCL線路控制器。從傳感器連接到板上的八個(gè)SCL/SDA從端口之一。通過(guò)向TCA9548A發(fā)送其I2C地址(0x70 {默認(rèn)}-0x77),然后是通道號(hào)(0b00000001-0b10000000)來(lái)選擇通道。為了控制64個(gè)相同的I2C尋址部分,您最多可以將8個(gè)這些多路復(fù)用器連接在一起在0x70-0x77地址上。通過(guò)將三個(gè)地址位A0,A1和A2連接到VIN,您可以獲得地址的不同組合。我將在我的下一個(gè)關(guān)于TCA9548A突破板的教程中對(duì)此進(jìn)行深入解釋。現(xiàn)在,讓我們將8個(gè)OLED連接到該板上并快速查看代碼。
連接:
VIN至5V(或3.3V)
GND接地
SCL到I2C時(shí)鐘
SDA到I2C數(shù)據(jù)
然后將傳感器連接到VIN,GND并使用SCn/SDn多路復(fù)用總線
現(xiàn)在,Int代碼首先要包含“ Wire”庫(kù)并定義多路復(fù)用器地址。
#include“ Wire.h”
#include
#define MUX_Address 0x70//TCA9548A編碼器地址
然后我們需要使用此功能選擇我們要通信的端口并在其上發(fā)送數(shù)據(jù):
void tcaselect(uint8_t i){
if(i》 7)return;
Wire.beginTransmission(MUX_Address);
Wire.write(1 《
Wire.endTransmission();
}
接下來(lái),我們將通過(guò)調(diào)用“ u8g.begin();”來(lái)初始化設(shè)置部分的顯示。對(duì)于連接到MUX“ tcaselect(i);”的每個(gè)顯示,一旦初始化,我們就可以通過(guò)調(diào)用函數(shù)“ tcaselect(i);”來(lái)完成我們想要的任何操作。其中“ i”是多路復(fù)用總線的值,然后相應(yīng)地發(fā)送數(shù)據(jù)和時(shí)鐘。
步驟13:優(yōu)點(diǎn)和缺點(diǎn)
OLED的圖像很漂亮。但是,OLED也有
的缺點(diǎn)。由于OLED屏幕包含有機(jī)材料,因此其壽命比LCD顯示器短。此外,許多OLED顯示器長(zhǎng)時(shí)間顯示同一圖像后會(huì)出現(xiàn)烙印。老化后,即使顯示了其他圖像,圖像仍保留在屏幕上。因此,請(qǐng)確保每隔幾秒鐘不斷刷新屏幕。水會(huì)立即損壞這些顯示器的有機(jī)材料。
優(yōu)點(diǎn)
無(wú)需背光
顯示器非常薄且輕巧
低功耗
視角比LCD寬
亮度和對(duì)比度都很好
高速且響應(yīng)時(shí)間短
深黑色
缺點(diǎn)
昂貴的技術(shù)
壽命短
OLEDS更容易老化
水災(zāi)
第14步:常見(jiàn)錯(cuò)誤
總而言之,本教程僅討論一些常見(jiàn)錯(cuò)誤
人們?cè)谑褂眠@些顯示器時(shí)所做的事情:
-在項(xiàng)目中使用它之前,請(qǐng)務(wù)必三遍檢查引腳
-在頭文件和代碼中選擇正確的庫(kù)地址
#define SSD1306_I2C_ADDRESS 0x3C//在Adafruit_SSD1306.h
和
display.begin(SSD1306_SWITCHCAPVCC,0x3C);//在代碼中//
如果地址錯(cuò)誤,則OLED將不會(huì)顯示任何內(nèi)容
-必須在驅(qū)動(dòng)程序中更改顯示大小,然后才能使用它。如果未更改,則在嘗試驗(yàn)證代碼時(shí)會(huì)收到錯(cuò)誤消息
#error(“高度不正確,請(qǐng)修復(fù)Adafruit_SSD1306.h!”);
-如果使用NodeMCU確保將OLED_RESET從4替換為L(zhǎng)ED_BUILTIN
#define OLED_RESET LED_BUILTIN
我有現(xiàn)場(chǎng)人員使用此OLED顯示器進(jìn)行各種操作。有些甚至制作了電子游戲。我真的對(duì)使用這種小顯示屏制作視頻游戲不感興趣。但是,我現(xiàn)在將離開(kāi)您去探索您的想象力,并提出令人驚訝的想法。
步驟15:鏈接
-博客:http://diyfactory007.blogspot.com.au
-添加圖像:http://javl.github.io/image2cpp/
-自定義文本:http://oleddisplay.squix.ch/#/home
-Adafruit顯示庫(kù):https://github.com/adafruit/Adafruit_SSD1306
- Adafruit GFX庫(kù):https://github.com/adafruit/Adafruit -GFX庫(kù)
-u8glib庫(kù):https://code.google.com/archive/p/u8glib/或https://github.com/olikraus/u8glib
如果要使用較小的顯示器,請(qǐng)使用默認(rèn)的128_32,否則,對(duì)于較大的顯示器請(qǐng)注釋128_32并取消注釋代碼中的128X64 NO_ACK(只需取消注釋所使用的屏幕類型)(字體在字體庫(kù)中)
責(zé)任編輯:wv
-
微控制器
+關(guān)注
關(guān)注
48文章
7906瀏覽量
153707 -
顯示器
+關(guān)注
關(guān)注
21文章
5064瀏覽量
141368 -
Arduino
+關(guān)注
關(guān)注
188文章
6492瀏覽量
190105
發(fā)布評(píng)論請(qǐng)先 登錄
使用RT1060的mcuboot開(kāi)源sdk示例擦除主插槽中的錯(cuò)誤鏡像怎么解決?
讓顯示器NHD 1.9 176176UBC3顯示“hello world”,怎么不起作用?
在mimxrt1170_evk調(diào)試hello_world出現(xiàn)硬件傳輸錯(cuò)誤怎么解決?
加載示例圖像時(shí),COM7的調(diào)試控制臺(tái)hello_world不顯示消息怎么解決?
天馬微電子亮相Embedded World 2025
使用MCUXpresso for VS Code插件開(kāi)發(fā)Zephyr的hello world

評(píng)論