簡介
這邊文章將會演示的是使用一個U8glibOLED圖形庫,如果你剛剛接觸宛乃,可以點擊這個鏈接带欢,了解更多U8glib庫(可能被墻,所以你的會翻墻)這里面是英文資料烤惊,所以,你得準備好一個電子詞典吁朦,在閱讀的時候柒室,隨時查詢(U8glib是一個圖形庫來的,支持很多種類的OLED)來點亮OLED12864液晶顯示器逗宜,這是一個非常好用的圖形庫雄右,能夠讓我們非常快捷開發(fā)Arduino的OLED驅動程序纺讲。而且最大的好處是開源擂仍。
我用到的是一個朋友做好的OLED手表來演示這個程序,關于這個我將要作為演示的硬件的更多資料熬甚,你可以訪問他的網頁逢渔!
下面的圖片是我從Github里面找到的。
當然我們的U8glib可是很強大的乡括,支持的好幾款不同的芯片肃廓,這里我們只用到基于AVR芯片的Arduino系統(tǒng)智厌。
文章適合對象
本文適合的對象是對Arduino編程有一定了解的人,比如知道Arduino的庫使用盲赊,同時對Arduino編程語言有一定了解的人铣鹏。當然如果你對Arduino有非常大的熱情的話,也可以先了解一下這些內容哀蘑,再繼續(xù)往下面看诚卸。不然可能會給你帶來一定的難度。
需要的硬件:
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 等等
你可以在這里查到所有完整支持的設備類型:
現(xiàn)在很多OLED模塊都是寬電壓輸入的,支持3.3到5.5V輸入依疼,但是無論如何你都得仔細查看一下你的OLED究竟支持多少伏輸入痰腮,在使用一個新元器件之前,查看他的數(shù)據(jù)手冊或者電氣資料對一個工程師來說律罢,是一個非常好的習慣膀值。
3. 必要的杜邦線,一根micro USB線误辑,給主控板通電沧踏,還有給Arduino主控板下載程序使用。
下面就是我使用的硬件背面圖巾钉,里面已經集成了Arduino Nano主控板和OLED12864翘狱,所以這里沒有演示怎么接線,但是是遵從I2C接線的砰苍。
一般步驟
當然這篇文章潦匈,主要是應用U8glib的庫,我們只需要知道怎么調用赚导,就能夠做很多事情了茬缩。
首先我們需要打開一個ArduinoIDE(ArduinoIDE就是一個集成開發(fā)環(huán)境,包括代碼的編寫吼旧,編譯凰锡,上傳,串口調試等等內容)
我們在編譯環(huán)境里面最先要做的事情,就是先保存好這份代碼文件寡夹,我一般都存在自己私人的文件夾处面。當然保存的路徑盡量不要帶中文,不然后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不同尺寸的接線都遵循一定的規(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接線方式查看你需要的接線方式蛋铆,然后在程序里面選擇你需要的初始化代碼馋评。或者直接詢問你的購買商刺啦,獲取更詳細的接線信息栗恩。如果你最后還是沒能接好線,請給我留言洪燥,我?guī)湍憧纯础?/p>
如果你很擅長看文檔資料,或者這些對你都是簡單的事情乳乌,那么你就是一個動手能力很強的人捧韵,當然如果這些對你來說有點難,沒有關系汉操,多試幾遍就能發(fā)現(xiàn)再来,這些都差不多一成不變的步驟。
軟件代碼分析
嗯,經過一番的努力芒篷,我想你已經把需要的前期工作準備好了搜变,那么接下來,我們就開始使用U8glib庫文件來點亮一個12864的液晶顯示器针炉。
接下來我們會演示一個簡單的點亮OLED屏幕的程序
首先我們需要做的挠他,當然就是把庫文件引入進來,我們手動敲一行代碼進入到這里篡帕,就像上面圖片顯示的那樣
#include "U8glib.h" //這句話是把U8glib庫包含到這個程序文件里面
我們可以根據(jù)自己實際的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一直處于圖形繪制狀態(tài)杈笔。
我們需要顯示的圖形將會在函數(shù)draw()里面闪水。所以上面是固定結構來的,也就是無論你做什么開發(fā)蒙具,就按照上面那樣子來就行了球榆。我們需要做的就是在draw()里面畫出我們需要的內容就好了。
比如我想在屏幕的正中間畫一個圓禁筏,那么我需要做的就是先根據(jù)OLED的尺寸持钉,確定128*64這塊屏幕的正中間坐標就行了。
坐標(128/2,64/2)=(64,32)就是這個屏幕的中點了篱昔。等下我們畫圓的時候會用到這個參數(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)
描述:在坐標(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ù)默認是畫出整個圓)
另外上面的參數(shù)可以使用操作符 | 進行組合使用。?
參數(shù):
u8g: 指向u8g的數(shù)據(jù)結構(僅支持C接口邢羔,注意這里還有一個C++畫圓函數(shù)原型驼抹,那里是沒有u8g函數(shù)原型的)
x0,y0是圓的坐標
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資料?里面能告訴你很多關于硬件接線握玛,代碼的使用等等
U8glib in Google Code 訪問這個頁面需要翻墻够傍,否則無法閱讀
U8glib 使用手冊查詢 英文 需要翻墻使用,里面能夠讓你了解到很多U8glib庫里面的方法和函數(shù)