一個在arduino ide里把nano的程序移植到esp8266的過程
arduino ide?
arduino nano
esp8266
u8g2
這4樣?xùn)|西相信經(jīng)常逛B站科技區(qū)的朋友們一定很熟悉吧。
至于屏幕驅(qū)動的庫,除了各路大神們絞盡腦汁寫的各種庫之外,還有Adafruit和U8g2,當(dāng)然這里就不講Adafruit了,這里講的是U8g2。
U8g2是我用過最簡單的oled屏幕驅(qū)動庫,兼容市面上你能買到的絕大多數(shù)oled模塊。??
就例如我這片非主流的組裝1.3寸64*128oled


順便提醒大家別學(xué)我犯二對自己的焊接技術(shù)充滿信心,為了省幾毛錢買了屏幕和轉(zhuǎn)接板自己焊,這里有坑。


不過為了穩(wěn)妥起見,還是直接買0.96寸的oled模塊吧。



扯遠(yuǎn)了,有了屏幕,有了arduino,那么接下來怎么點亮呢?首先,下載U8g2的庫,就在上面項目-》加載庫-》管理庫 里面搜u8g2就好了。

然后就拿我這里顯示圖片的示例距離,在文件-》示例-》第三方庫示例里面找到U8g2 -》page buffer-》XBM

因為我買的屏幕默認(rèn)是spi接口,雖然可以靠改動一個電阻的位置變成常用的I2C接口,但是我懶。
//U8G2_SH1107_64X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
就拿這段代碼前面的來說,SSH1107指的是oled的屏幕驅(qū)動是SSH1107,這個在上面賣家的屏幕介紹里有提到。64X128指的是屏幕的分辨率是64X128,至于那個1不重要,別動就是。4W指的是4線控制。HW SPI指的是硬件輸出SPI信號這個是由arduino固定的端口輸出(D10?cs,D11 MOSI,D12 MISO,D13 SCK)

除此之外還有SW SPI,軟件模擬SPI,用軟件模擬SPI信號輸出,優(yōu)點是可以指定任意端口輸出spi信號,對于部分接口未引出的nano和esp8266 d1來說這似乎是唯一的解決辦法。
而后面的那段?
(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
R0指的是默認(rèn)方向,改成R1就是選擇90度,R2是180度,R3是270度 后面的cs,dc,reset對應(yīng)屏幕上的cs,dc,res的接口是D10,D9,D8。但是到了這里你發(fā)現(xiàn)這里只給出3個接口,可是你的屏幕有7個接口,除去GND和VCC是電源地和5V正之外,還有SDA(數(shù)據(jù))和SCL(時鐘)沒給出來。這時你可以翻翻前面的加粗紅字,SDA對應(yīng)的是D13的SCK,SCL對應(yīng)的是D11的MOSI,因為屏幕只接受不發(fā)送數(shù)據(jù)給arduino。
U8G2_SH1107_64X128_1_4W_HW_SPI u8g2(U8G2_R2, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
SCL接data D11,SDA接D13,剩下的cs,dc,res接arduino板子上對應(yīng)的D10,D9,D8。
但是到了esp8266 D1上就不一樣了,當(dāng)你拿起杜邦線準(zhǔn)備連接屏幕時你會發(fā)現(xiàn)。。。它只有D0到D8。問題不大,這難不倒聰明的你。按照我前面的分析,改用軟件模擬spi,并且把
//U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
改成
//U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 8,?/* data=*/ 7,?/*?cs=*/ 0,?/*?dc=*/?5,?/* reset=*/?6);
后再連上,發(fā)現(xiàn)還是不亮。
這是為什么呢?
因為esp8266 D1的gpio與板子上的D1-8的對應(yīng)關(guān)系和arduino不一樣,你需要按照下圖,

把
//U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 8, /* data=*/ 7,?/* cs=*/ 0,?/* dc=*/?5,?/* reset=*/?6);
改成對應(yīng)的gpio編號
U8G2_SH1107_64X128_1_4W_SW_SPI u8g2(U8G2_R1, /* clock=*/ 15, /* data=*/ 13, /* cs=*/ 16, /* dc=*/ 14, /* reset=*/ 12);
這樣你就可以用esp8266的硬件spi來點亮屏幕了。
用arduino?ide給esp8266的開發(fā)板寫程序的話那么程序里對應(yīng)端口的編號相較于arduino來說其對應(yīng)的其實是芯片的實際gpio1-10,而不是arduino開發(fā)板上的D1-10。