簡介
這邊文章將會演示的是使用一個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庫里面的方法和函數