一个在arduino ide里把nano的程序移植到esp8266的过程

arduino ide 

arduino nano

esp8266

u8g2

这4样东西相信经常逛B站科技区的朋友们一定很熟悉吧。

至于屏幕驱动的库,除了各路大神们绞尽脑汁写的各种库之外,还有Adafruit和U8g2,当然这里就不讲Adafruit了,这里讲的是U8g2。

U8g2是我用过最简单的oled屏幕驱动库,兼容市面上你能买到的绝大多数oled模块。  

就例如我这片非主流的组装1.3寸64*128oled


别学我一开始就买裸屏,排线有些短

顺便提醒大家别学我犯二对自己的焊接技术充满信心,为了省几毛钱买了屏幕和转接板自己焊,这里有坑。

傻了吧,转接板是0.96寸屏幕的,预留的位置焊不了


忽略捉急的焊工,1.3寸屏用0.96的转接板你需要把板子锯掉一部分,放心,下面这都是地线

不过为了稳妥起见,还是直接买0.96寸的oled模块吧。




扯远了,有了屏幕,有了arduino,那么接下来怎么点亮呢?首先,下载U8g2的库,就在上面项目-》加载库-》管理库 里面搜u8g2就好了。

国内下载可能比较慢,需要点耐心下载完

然后就拿我这里显示图片的示例距离,在文件-》示例-》第三方库示例里面找到U8g2 -》page buffer-》XBM

往下翻会看到一堆被//注释掉的U8G2开头的代码,这些就是U8G2支持的屏幕驱动和对应的分辨率以及接口形式

因为我买的屏幕默认是spi接口,虽然可以靠改动一个电阻的位置变成常用的I2C接口,但是我懒。

//U8G2_SH1107_64X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

就拿这段代码前面的来说,SSH1107指的是oled的屏幕驱动是SSH1107,这个在上面卖家的屏幕介绍里有提到。64X128指的是屏幕的分辨率是64X128,至于那个1不重要,别动就是。4W指的是4线控制。HW SPI指的是硬件输出SPI信号这个是由arduino固定的端口输出(D10 cs,D11 MOSI,D12 MISO,D13 SCK)

除此之外还有SW SPI软件模拟SPI,用软件模拟SPI信号输出,优点是可以指定任意端口输出spi信号,对于部分接口未引出的nano和esp8266 d1来说这似乎是唯一的解决办法。

而后面的那段 

(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

R0指的是默认方向,改成R1就是选择90度,R2是180度,R3是270度 后面的cs,dc,reset对应屏幕上的cs,dc,res的接口是D10,D9,D8。但是到了这里你发现这里只给出3个接口,可是你的屏幕有7个接口,除去GND和VCC是电源地和5V正之外,还有SDA(数据)和SCL(时钟)没给出来。这时你可以翻翻前面的加粗红字,SDA对应的是D13的SCKSCL对应的是D11的MOSI,因为屏幕只接受不发送数据给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板子上对应的D10,D9,D8。

但是到了esp8266 D1上就不一样了,当你拿起杜邦线准备连接屏幕时你会发现。。。它只有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);

后再连上,发现还是不亮。

这是为什么呢?

因为esp8266 D1的gpio与板子上的D1-8的对应关系和arduino不一样,你需要按照下图,


//U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 8, /* data=*/ 7, /* cs=*/ 0, /* dc=*/ 5, /* reset=*/ 6);

改成对应的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的开发板写程序的话那么程序里对应端口的编号相较于arduino来说其对应的其实是芯片的实际gpio1-10,而不是arduino开发板上的D1-10。

本文为我原创

-- --
  • 投诉或建议
评论