ElecFun--Arduino--OLED12864和U8glib庫

簡介

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

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

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

當然我們的U8glib可是很強大的,支持的好幾款不同的芯片,這里我們只用到基于AVR芯片的Arduino系統。


文章適合對象

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

需要的硬件:

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

2. 當然你還需要有一塊12864OLED液晶顯示器,如果有其他尺寸的OLED顯示屏也是沒關系的,因為U8glib庫,支持非常多的類型,你只要在U8glib提供的例程序就能知道,這是有多么強悍的一個庫了。

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

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

支持的設備類型

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

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

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


一般步驟

當然這篇文章,主要是應用U8glib的庫,我們只需要知道怎么調用,就能夠做很多事情了。

首先我們需要打開一個ArduinoIDE(ArduinoIDE就是一個集成開發環境,包括代碼的編寫,編譯,上傳,串口調試等等內容)

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

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

E:\Arduino_code_Documents\ElecFun_Arduino_U8glib_Oled12864

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

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

前期準備--庫文件下載和硬件接線

我這里假設你已經下載好了,那我們就直接進入編程這步了,如果你還沒有知道需要怎么下載,怎么把庫放在ArduinoIDE的文件夾下面,請點擊Arduino庫文件的安裝學習。

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

接線都有以下幾種情況

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接線方式查看你需要的接線方式,然后在程序里面選擇你需要的初始化代碼。或者直接詢問你的購買商,獲取更詳細的接線信息。如果你最后還是沒能接好線,請給我留言,我幫你看看。

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

軟件代碼分析

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

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

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

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

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

//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

這行代碼前面的//

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

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

從上圖可以看出,我們屏幕的左上角就是就是整個屏幕的原點了,記住這點很重要,因為我們接下來在代碼里,要讓圖形或者文字顯示在哪里,所參照的坐標就是這個左上角的原點了。

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

不管是其他的應用也好,首先就這樣做吧

void loop()

{

// picture loop?

do {

? ? u8g.firstPage();

} while(u8g.nextPage());

delay(1000);

}

上面的

do {

}?

while();

這樣寫,是想讓Arduino一直處于圖形繪制狀態。

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

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

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

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

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

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

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

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

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

另外上面的參數可以使用操作符 | 進行組合使用。?

參數:

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

x0,y0是圓的坐標

rad 是圓的半徑

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

U8G_DRAW_UPPER_RIGHT

U8G_DRAW_UPPER_LEFT

U8G_DRAW_LOWER_LEFT

U8G_DRAW_LOWER_RIGHT

U8G_DRAW_ALL

return: 這個函數沒有返回值

這個函數在Picture loop 里面使用,舉例:

u8g.drawCircle(20,20,14);


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

得到下面的圖形:


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

void draw()

{

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

}

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


外部參考資料

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容