ElecFun--Arduino--OLED12864和U8glib庫

簡介

這邊文章將會演示的是使用一個U8glibOLED圖形庫,如果你剛剛接觸,可以點(diǎn)擊這個鏈接,了解更多U8glib庫(可能被墻,所以你的會翻墻)這里面是英文資料,所以,你得準(zhǔn)備好一個電子詞典,在閱讀的時候,隨時查詢(U8glib是一個圖形庫來的,支持很多種類的OLED)來點(diǎn)亮OLED12864液晶顯示器,這是一個非常好用的圖形庫,能夠讓我們非常快捷開發(fā)Arduino的OLED驅(qū)動程序。而且最大的好處是開源。

我用到的是一個朋友做好的OLED手表來演示這個程序,關(guān)于這個我將要作為演示的硬件的更多資料,你可以訪問他的網(wǎng)頁!

下面的圖片是我從Github里面找到的。

當(dāng)然我們的U8glib可是很強(qiáng)大的,支持的好幾款不同的芯片,這里我們只用到基于AVR芯片的Arduino系統(tǒng)。


文章適合對象

本文適合的對象是對Arduino編程有一定了解的人,比如知道Arduino的庫使用,同時對Arduino編程語言有一定了解的人。當(dāng)然如果你對Arduino有非常大的熱情的話,也可以先了解一下這些內(nèi)容,再繼續(xù)往下面看。不然可能會給你帶來一定的難度。

需要的硬件:

1. 同時你需要手頭上有一塊Arduino 主控板,建議購買Arduino UNO 或者是 Arduino pro mini 因?yàn)檫@個對于新手來說比較容易入門。

2. 當(dāng)然你還需要有一塊12864OLED液晶顯示器,如果有其他尺寸的OLED顯示屏也是沒關(guān)系的,因?yàn)閁8glib庫,支持非常多的類型,你只要在U8glib提供的例程序就能知道,這是有多么強(qiáng)悍的一個庫了。

支持的類型有:SSD1325, ST7565, ST7920, UC1608, UC1610, UC1701, PCD8544, PCF8812, KS0108, LC7981, SBN1661, SSD1306, SH1106, T6963, LD7032 等等

你可以在這里查到所有完整支持的設(shè)備類型:

支持的設(shè)備類型

現(xiàn)在很多OLED模塊都是寬電壓輸入的,支持3.3到5.5V輸入,但是無論如何你都得仔細(xì)查看一下你的OLED究竟支持多少伏輸入,在使用一個新元器件之前,查看他的數(shù)據(jù)手冊或者電氣資料對一個工程師來說,是一個非常好的習(xí)慣。

3. 必要的杜邦線,一根micro USB線,給主控板通電,還有給Arduino主控板下載程序使用。

下面就是我使用的硬件背面圖,里面已經(jīng)集成了Arduino Nano主控板和OLED12864,所以這里沒有演示怎么接線,但是是遵從I2C接線的。


一般步驟

當(dāng)然這篇文章,主要是應(yīng)用U8glib的庫,我們只需要知道怎么調(diào)用,就能夠做很多事情了。

首先我們需要打開一個ArduinoIDE(ArduinoIDE就是一個集成開發(fā)環(huán)境,包括代碼的編寫,編譯,上傳,串口調(diào)試等等內(nèi)容)

我們在編譯環(huán)境里面最先要做的事情,就是先保存好這份代碼文件,我一般都存在自己私人的文件夾。當(dāng)然保存的路徑盡量不要帶中文,不然后IDE會識別不出來的。導(dǎo)致很多不必要的事情。

比如你可以保存在一個叫做E盤下面Arduino_code_Documents下的ElecFun_Arduino_U8glib_Oled12864這里面,當(dāng)然這個路徑是我演示的,

E:\Arduino_code_Documents\ElecFun_Arduino_U8glib_Oled12864

如果你文件夾下面沒有這個文件,完全可以自己建一個來的,都以英文命名會是一個好習(xí)慣來的。

不過我們最后存的Arduino程序的命名要跟這個文件所在的文件夾同名,因?yàn)檫@是ArduinoIDE要求的。我們只要遵循就行了。

前期準(zhǔn)備--庫文件下載和硬件接線

我這里假設(shè)你已經(jīng)下載好了,那我們就直接進(jìn)入編程這步了,如果你還沒有知道需要怎么下載,怎么把庫放在ArduinoIDE的文件夾下面,請點(diǎn)擊Arduino庫文件的安裝學(xué)習(xí)。

還有一個很重要的一點(diǎn),就是Arduino 主控板和OLED接線的,如果你沒有接好線,那么你可以看一下這篇文章--OLED12864和Arduino主控板(當(dāng)然你如果手頭上,不是12864也沒有關(guān)系,因?yàn)镺LED不同尺寸的接線都遵循一定的規(guī)則)

接線都有以下幾種情況

1. I2C接線 (我得就是這種情況)

Arduino GND接OLED GND

Arduino 3.3V 接 OLED VCC 我的Arduino是Nano是3.3V系列

Arduino A4 接 OLED SDA

Arduino A5 接 OLED SCL

2. SPI接線?

3. 并行接線

如果你的跟我不同,那么你就需要參考一下Arduino和OLED接線方式查看你需要的接線方式,然后在程序里面選擇你需要的初始化代碼?;蛘咧苯釉儐柲愕馁徺I商,獲取更詳細(xì)的接線信息。如果你最后還是沒能接好線,請給我留言,我?guī)湍憧纯础?/p>

如果你很擅長看文檔資料,或者這些對你都是簡單的事情,那么你就是一個動手能力很強(qiáng)的人,當(dāng)然如果這些對你來說有點(diǎn)難,沒有關(guān)系,多試幾遍就能發(fā)現(xiàn),這些都差不多一成不變的步驟。

軟件代碼分析

嗯,經(jīng)過一番的努力,我想你已經(jīng)把需要的前期工作準(zhǔn)備好了,那么接下來,我們就開始使用U8glib庫文件來點(diǎn)亮一個12864的液晶顯示器。

接下來我們會演示一個簡單的點(diǎn)亮OLED屏幕的程序

首先我們需要做的,當(dāng)然就是把庫文件引入進(jìn)來,我們手動敲一行代碼進(jìn)入到這里,就像上面圖片顯示的那樣

#include "U8glib.h" //這句話是把U8glib庫包含到這個程序文件里面

我們可以根據(jù)自己實(shí)際的OLED顯示器,取消需要的那行代碼的注釋就行了。比如我的是12864OLED是SSD1306驅(qū)動的,所以我這里就刪除

//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

這行代碼前面的//

這行代碼告訴我們幾個信息,其中一個就是屏幕尺寸是12864的,驅(qū)動IC是SSD1306,這個驅(qū)動IC一般裝在屏幕里面,比較難找,使用的是I2C通訊。

我們在屏幕上畫圖,是靠坐標(biāo)定位的,所以我們需要知道我們的坐標(biāo)原點(diǎn)在哪里(下圖取自U8glib的Github里面的介紹)

從上圖可以看出,我們屏幕的左上角就是就是整個屏幕的原點(diǎn)了,記住這點(diǎn)很重要,因?yàn)槲覀兘酉聛碓诖a里,要讓圖形或者文字顯示在哪里,所參照的坐標(biāo)就是這個左上角的原點(diǎn)了。

接下來,我們就在void loop() 里面添加一個picture loop

不管是其他的應(yīng)用也好,首先就這樣做吧

void loop()

{

// picture loop?

do {

? ? u8g.firstPage();

} while(u8g.nextPage());

delay(1000);

}

上面的

do {

}?

while();

這樣寫,是想讓Arduino一直處于圖形繪制狀態(tài)。

我們需要顯示的圖形將會在函數(shù)draw()里面。所以上面是固定結(jié)構(gòu)來的,也就是無論你做什么開發(fā),就按照上面那樣子來就行了。我們需要做的就是在draw()里面畫出我們需要的內(nèi)容就好了。

比如我想在屏幕的正中間畫一個圓,那么我需要做的就是先根據(jù)OLED的尺寸,確定128*64這塊屏幕的正中間坐標(biāo)就行了。

坐標(biāo)(128/2,64/2)=(64,32)就是這個屏幕的中點(diǎn)了。等下我們畫圓的時候會用到這個參數(shù),接下來我們看看U8glib給我們畫圓的方法。

這里我們使用U8glib的C prototype(C語言畫圓函數(shù)原型)

voidu8g_DrawCircle(u8g_t*u8g,u8g_uint_t x0,u8g_uint_t y0,u8g_uint_t rad,uint8_t opt)

描述:在坐標(biāo)(x0, y0)這里畫一個半徑為rad的圓,圓的直徑是2*rad+1,另外這個取決于參數(shù)opt,我們可以在屏幕上只畫出圓的一部分,可以作為opt參數(shù)的值有以下一些:U8G_DRAW_UPPER_RIGHT(這個參數(shù)只畫出圓的右上1/4部分)

U8G_DRAW_UPPER_LEFT(這個參數(shù)只畫出圓的左上1/4部分)

U8G_DRAW_LOWER_LEFT(這個參數(shù)只畫出圓的左下1/4部分)

U8G_DRAW_LOWER_RIGHT(這個參數(shù)只畫出圓的右下1/4部分)U8G_DRAW_ALL(這個參數(shù)只畫出圓全部,函數(shù)默認(rèn)是畫出整個圓)

另外上面的參數(shù)可以使用操作符 | 進(jìn)行組合使用。?

參數(shù):

u8g: 指向u8g的數(shù)據(jù)結(jié)構(gòu)(僅支持C接口,注意這里還有一個C++畫圓函數(shù)原型,那里是沒有u8g函數(shù)原型的)

x0,y0是圓的坐標(biāo)

rad 是圓的半徑

opt 的參數(shù)就是上面提到的那些,不選表示完整畫出整個圓出來。

U8G_DRAW_UPPER_RIGHT

U8G_DRAW_UPPER_LEFT

U8G_DRAW_LOWER_LEFT

U8G_DRAW_LOWER_RIGHT

U8G_DRAW_ALL

return: 這個函數(shù)沒有返回值

這個函數(shù)在Picture loop 里面使用,舉例:

u8g.drawCircle(20,20,14);


u8g.drawCircle(20,20,14,U8G_DRAW_UPPER_RIGHT);

得到下面的圖形:


接下來我在我的函數(shù)里面在寫一些代碼:

void draw()

{

? u8g.drawCircle(64,32,10);

}

到此,所有的編程工作完成了,你可以在這里下載完整的代碼,盡量不要拷貝我這里面的代碼,畢竟拷貝的話,難免會出錯,所以直接下載我的代碼,然后在你的編譯器里面編譯就好了。


外部參考資料

U8glib wiki資料?里面能告訴你很多關(guān)于硬件接線,代碼的使用等等

U8glib in Google Code 訪問這個頁面需要翻墻,否則無法閱讀

U8glib 使用手冊查詢 英文 需要翻墻使用,里面能夠讓你了解到很多U8glib庫里面的方法和函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容