自己做小车或者机器人,最直观的反馈就是给它加一块小屏幕,能直接看到电量和传感器数值。OLED比老式LCD强太多:自发光、高对比、视角几乎无死角,最关键是I2C接口只要四根线就能点亮。这篇把0.96寸SSD1306从接线到点亮再到排错的坑一次讲清,都是我自己焊过的血泪。
四根线别接错:VCC GND SCL SDA
I2C版的SSD1306屏背面就四根针:VCC、GND、SCL、SDA,焊接时先确认丝印顺序,不同厂家模块引脚排列不一样,有的VCC和GND换个位置,接之前一定要对丝印,不能只看示意图。
接开发板的对应引脚很关键。Arduino Uno和Nano的I2C脚固定在A4(SDA)和A5(SCL);Mega是20(SDA)和21(SCL);ESP32默认是GPIO21(SDA)和GPIO22(SCL);NodeMCU是D2和D1。
供电上,模块标称3.3V到5V都行,因为板上有稳压。但SSD1306芯片本身的逻辑电平和屏体是3.3V的,如果你用的是纯3.3V的裸屏(比如专门给ESP32做的),硬拿5V怼上去会让屏发热,严重了会烧屏。用Arduino这种5V板时,稳妥做法是从3.3V脚供电。
库装对,三步点亮
Arduino IDE里先装两个库:Adafruit SSD1306和Adafruit GFX Library。装好后示例里就有现成的,核心就三件事。
一是构造显示对象,指定分辨率128x64。
二是初始化,调begin(SSD1306_SWITCHCAPVCC, 0x3C),这里0x3C就是I2C地址。
三是在画完内容后,一定要调一次display()把缓存刷到屏上。这条太常见了,很多人写完clearDisplay、setCursor、print之后忘了display(),结果屏幕一直黑着,其实程序早跑起来了。
大白屏,九成是这五个原因
屏幕死活不亮的时候,按这个顺序查,基本能命中。
第一,I2C地址不对。默认是0x3C,但有一部分模块出厂配成了0x3D。最靠谱的办法是先跑一遍I2C探测器(I2C Scanner),看它扫出来的真实地址,再把代码改成这个地址。
第二,SDA和SCL接反了。四根线最容易错的就是这两根,VCC和GND对了但屏不亮,先把这两根对调试试。
第三,驱动芯片搞混了。长得一样的0.96寸屏,有很多是SH1106驱动的,不是SSD1306,这两者RAM结构和偏移不一样,拿SSD1306的库去驱动SH1106,画面就会错位或者乱码。
第四,供电电压不对。上面说的3.3V裸屏被5V供电,或者Arduino 5V板用3.3V屏供不上电,都会有各种灵异表现,先拿万用表量一下VCC。
第五,内存不够。一块128x64的单色屏帧缓存就要1KB,对只有2KB SRAM的Arduino Uno来说占了将近一半,代码里变量一多可能莫名其妙重启,这种情况该考虑换带更多内存的板子。
上手就为了给小车加个表盘
点亮之后,给小车加个简易表盘就顺手了:屏幕上显示电池电压、前方障碍距离、当前速度,一行一个数值,跑起来一眼就看清状态。OLED刷新一张完整的图大约十几毫秒,显示这种实时数值绰绰有余。
装在车体上注意把排线固定好,OLED排线很脆,来回弯几次容易断,屏幕突然黑屏先怀疑排线而不是驱动。
总结:SSD1306这块屏贵在接线少、上手快,坑主要藏在地址、驱动型号和供电这三处。对照上面五条排一遍,小白半小时就能点亮自己的第一块OLED。



做成表盘实测不错,一行电压一行距离,刷新十几毫秒完全跟得上,OLED排线是真的脆,固定好别来回拽。
大白屏第一条命中过,跑I2C Scanner扫出来是0x3D,代码里写死0x3C就一直黑,跟地址死磕了半天,血的教训。
SH1106和SSD1306这个坑太关键了,我手上一块1.3寸的其实很多是SH1106,拿SSD1306库驱动出来全是错位乱码,后来换了对应库马上正常。
SDA和SCL真的最容易接反,四根线就这俩永远分不清,感谢给出按丝印对引脚这条,不然我还对着一堆通用图硬接。
3.3V裸屏拿5V怼那块我似曾相识,一块屏手一摸烫手然后就没然后了,后来统一用3.3V供电乖多了。