一開始再說一次,我玩單晶片(Arduino是單晶片嗎?我也不知道)是想把家裏改成智能家庭

所以我在網路上買了一大堆可能用到的模塊(在掏寶看習慣了,在台灣要叫什麼呢?)

我想在我每個智能裝置上都有個顯示器來顯示狀態,但我真的不知道什麼樣的顯示器適合我

以我敗家的個性.我就從掏寶上掏了各種SIZE的顯示器,有TFT,有TOUCH介面的,有OLED,有LED..

IMAG2638[1].jpg 

就像上圖一樣,前後買了大約20個吧...而今天要玩的就是在中上方那個小小的.號稱最小的0.49吋OLED

看不清楚那就看下圖

IMAG2640[1].jpg 

小到一個不行的OLED.....


這個OLED的重要參數很簡單..SSD1306, 64*32 I2C  SSD1306, 64*32 I2C  SSD1306, 64*32 I2C  很重要喔...說三次

知道了參數..接下來就是最麻煩的...怎麼用..啊是要怎麼用....

還好網路上有神人寫了一個萬用LIB for 各種顯示屏(又是中掏寶的毒),名叫u8glib...

這東西Google一下就知道了....ㄟ..在GOOGLE上就可以下載到哩...

u8gLIB就在這.....

Arduino IDE怎麼引入這個lib.就不多說了..玩Arduino應該會知道

引入了這個LIB後..會有很多個example

我對顯示屏的測試一向是用u8gLogo這個example來試....所以就開他吧.....

打開後..往下捲個一頁可以看到一堆的怪東西..如下圖

u8gLogo.png 

嘿嘿..還記得剛才說三次的東西嗎...

開始在這堆怪東西中找那三個關鍵字吧....

找找找....告訴你們...找不到啦........

最最最接近的就是下面這一條

//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI

高度差了12點....這是怎樣....完了.....找不到..怎麼辦.....

不管了..拿這行來試看看

怎麼試...把前面的//拿掉..上傳到Arduino吧...

IMAG2641[1].jpg 

可以哩.....有東西哩......

不過太大了..沒關係...在Code中找一下有一行

//#define MINI_LOGO

把前面的//拿掉再來一次,這是小Logo

IMAG2643[1].jpg 

看來大小應該是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 如下圖所示

copyfile.png 

接下來打開建好的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程式

把原來的

//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI 

再次註解掉,並加入

U8GLIB_SSD1306_64X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 

好....再上傳到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


 

IMAG2644[1].jpg 

結果.....媽..我成功了

重點來了..為什麼知道要改這個....

這時請做做功課.去看看買菜送的蔥(datasheet)

在蔥當中看到了這一段

datasheet.png 

就照這個去改..改出來的....

累........

這是我第一次去改LIB的Code....把經驗寫下來.......當未來的參考.....


最後...datasheet真的很重要

arrow
arrow
    文章標籤
    Arduino OLED U8GLIB
    全站熱搜

    yimingwu 發表在 痞客邦 留言(3) 人氣()