一開始再說一次,我玩單晶片(Arduino是單晶片嗎?我也不知道)是想把家裏改成智能家庭
所以我在網路上買了一大堆可能用到的模塊(在掏寶看習慣了,在台灣要叫什麼呢?)
我想在我每個智能裝置上都有個顯示器來顯示狀態,但我真的不知道什麼樣的顯示器適合我
以我敗家的個性.我就從掏寶上掏了各種SIZE的顯示器,有TFT,有TOUCH介面的,有OLED,有LED..
就像上圖一樣,前後買了大約20個吧...而今天要玩的就是在中上方那個小小的.號稱最小的0.49吋OLED
看不清楚那就看下圖
小到一個不行的OLED.....
這個OLED的重要參數很簡單..SSD1306, 64*32 I2C SSD1306, 64*32 I2C SSD1306, 64*32 I2C 很重要喔...說三次
知道了參數..接下來就是最麻煩的...怎麼用..啊是要怎麼用....
還好網路上有神人寫了一個萬用LIB for 各種顯示屏(又是中掏寶的毒),名叫u8glib...
這東西Google一下就知道了....ㄟ..在GOOGLE上就可以下載到哩...
Arduino IDE怎麼引入這個lib.就不多說了..玩Arduino應該會知道
引入了這個LIB後..會有很多個example
我對顯示屏的測試一向是用u8gLogo這個example來試....所以就開他吧.....
打開後..往下捲個一頁可以看到一堆的怪東西..如下圖
嘿嘿..還記得剛才說三次的東西嗎...
開始在這堆怪東西中找那三個關鍵字吧....
找找找....告訴你們...找不到啦........
最最最接近的就是下面這一條
//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
高度差了12點....這是怎樣....完了.....找不到..怎麼辦.....
不管了..拿這行來試看看
怎麼試...把前面的//拿掉..上傳到Arduino吧...
可以哩.....有東西哩......
不過太大了..沒關係...在Code中找一下有一行
//#define MINI_LOGO
把前面的//拿掉再來一次,這是小Logo
看來大小應該是OK..但..位置好像不大對...跑到上面去了...
那那那..怎麼辦.....我的開發魂跟我說..那就改吧....把Code拿出來改....
怎麼動..很簡單....
當Arduino IDE Add Zip Library 後會把Lib放在C:\Users\你的帳號\Documents\Arduino\libraries
所以我們就到這個地方來看看吧...當然會看到U8glib囉...進去可以看到u8glib.cpp跟u8glib.h
就把u8glib.h打開來...我們可以找到以下的程式碼
class U8GLIB_SSD1306_64X48 : public U8GLIB { public: U8GLIB_SSD1306_64X48(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) : U8GLIB(&u8g_dev_ssd1306_64x48_sw_spi, sck, mosi, cs, a0, reset) { } U8GLIB_SSD1306_64X48(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) : U8GLIB(&u8g_dev_ssd1306_64x48_hw_spi, cs, a0, reset) { } U8GLIB_SSD1306_64X48(uint8_t options = U8G_I2C_OPT_NONE) : U8GLIB(&u8g_dev_ssd1306_64x48_i2c, options) { } }; class U8GLIB_SSD1306_64X48_2X : public U8GLIB { public: U8GLIB_SSD1306_64X48_2X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) : U8GLIB(&u8g_dev_ssd1306_64x48_2x_sw_spi, sck, mosi, cs, a0, reset) { } U8GLIB_SSD1306_64X48_2X(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) : U8GLIB(&u8g_dev_ssd1306_64x48_2x_hw_spi, cs, a0, reset) { } U8GLIB_SSD1306_64X48_2X(uint8_t options = U8G_I2C_OPT_NONE) : U8GLIB(&u8g_dev_ssd1306_64x48_2x_i2c, options) { } }; |
Copy一份並把64X48改成64X32
存檔...然後再來改其它的部份
我們在這個目錄下可以看到一個子目錄叫utility..進去吧
在這個目錄中.我們又看到如清單上的一堆檔案...
找到64X48那個copy 並改名為64X32 如下圖所示
接下來打開建好的64x32的檔案,把可能的48改成32,怎麼改..就Replace吧.....
全部改好後.....再打開同一目錄下的u8g.h檔,並加入以下的程式碼,怎麼來的...當然是拿64X48改來的.
/* OLED 64x32 Display with SSD1306 Controller */ extern u8g_dev_t u8g_dev_ssd1306_64x32_sw_spi; extern u8g_dev_t u8g_dev_ssd1306_64x32_hw_spi; extern u8g_dev_t u8g_dev_ssd1306_64x32_i2c; extern u8g_dev_t u8g_dev_ssd1306_64x32_2x_sw_spi; extern u8g_dev_t u8g_dev_ssd1306_64x32_2x_hw_spi; extern u8g_dev_t u8g_dev_ssd1306_64x32_2x_i2c; |
存檔....
然後回到Arduino IDE 的 u8gLogo程式
把原來的
再次註解掉,並加入
好....再上傳到Arduino中吧
開心的跑下去..嗯..不幸的..結果還是一樣...
接下來..我一連串的試..中間的辛苦...對於我這個不是電子出身的人來說..是一大痛苦...
在此省略過程..直接說答案...
在整個 u8g_dev_ssd1306_64x32.c這個檔案中有一段
static const uint8_t u8g_dev_ssd1306_64x32_init_seq[] PROGMEM = {
裏面寫了一大堆的0x0??的東西....找到
0x0a8, 0x02f,/* Multiplex Ration, Jul 12, 2015: From 0.66" OLED datasheet */
把他改成
0x0a8, 0x01f,/* Multiplex Ration, Jul 12, 2015: From 0.66" OLED datasheet */
存檔..再來一次....上傳到Arduino
結果.....媽..我成功了
重點來了..為什麼知道要改這個....
這時請做做功課.去看看買菜送的蔥(datasheet)
在蔥當中看到了這一段
就照這個去改..改出來的....
累........
這是我第一次去改LIB的Code....把經驗寫下來.......當未來的參考.....
最後...datasheet真的很重要
留言列表