ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP32零基础入门:0.96寸OLED显示屏接线与驱动教程

ESP32零基础入门:0.96寸OLED显示屏接线与驱动教程 说实话很多零基础玩ESP32的朋友第一块外设都会选LED灯能亮能灭确实挺有成就感但玩几天就腻了。等你开始想做点“有信息量”的东西比如想看看传感器读了多少温湿度、想显示一下当前WiFi的IP地址、想做个桌面小时钟你就会发现——串口打印真的不方便总不能每次都连着电脑看吧。这时候给ESP32配一块0.96寸OLED显示屏几乎是绕不开的一步。这篇博文就专门写给刚接触ESP32、之前没碰过OLED的朋友。我会从硬件怎么选、怎么接线、开发环境怎么搭、代码怎么写一路讲到常见故障怎么排查全程按我自己当初踩坑的思路来讲。0.96寸OLED大概是目前性价比最高的“微型显示器”几十块钱以内能买到一块通上电就能显示文字、数字、图形甚至可以放动画而驱动它只需要四根线。学完这篇你手头的ESP32就算真正“长眼睛”了。1. 为什么一上来就玩OLED一个屏幕能省下多少事1.1 串口打印的局限和OLED的不可替代不少教程会让你用Serial.print()往串口监视器里打数据这对于调试确实有用。但问题来了你的ESP32一旦做成一个小设备不可能永远拿USB线插着电脑就算插着串口输出也是“只在连接时看得到”的东西没法摆在桌面上当显示用。OLED的意义在于它把“数据输出”这个动作从电脑屏幕上搬到了设备本身。我自己的体会是OLED带来的反馈感是串口完全替代不了的。你写一个程序让屏幕显示一行“Hello”ESP32上电的那一刻屏幕真的亮起来了这种正反馈会让你非常愿意继续往下去写更多功能。而串口你得打开监视器、选择波特率、点连接流程又多了一步体验差不少。另外OLED的显示可以做到非常精确。0.96寸这个规格分辨率通常是128x64像素虽然听起来不大但足够显示很多有用信息。拿温湿度传感器来说你可以把温度、湿度、体感、时间四个数据放在同一个画面里清清楚楚。用串口输出的话每次刷新都要滚动一屏找数据反而费劲。1.2 0.96寸OLED模块的硬件版型辨析市面上的0.96寸OLED模块外观上看起来都差不多但你下手买之前得会分辨几件事否则后面容易踩坑。第一是驱动IC。绝大多数0.96寸OLED用的是SSD1306这颗驱动芯片这也是Arduino生态里支持最完善的。但同样尺寸的模块也有人用SH1106的两者指令集不完全一样。SSD1306库通常也能兼容SH1106但需要做一些额外设置新手最好认准SSD1306的版本。第二是接口方式。0.96寸OLED模块常见的有I2C和SPI两种某些模块还同时留了两种接口的焊盘通过背面的电阻选择。I2C版本一般引出四个引脚VCC、GND、SCL、SDA接线最省。SPI版本通常会多出几个引脚比如DC、RES、CS接线多一点但刷新速度快一些。对零基础入门来说我强烈建议选I2C版本。第三是供电电压。OLED模块一般都带稳压电路标称支持3.3V和5V两种供电但很多模块的I2C逻辑电平只能接受3.3V千万不能用5V直接怼在SCL和SDA上。ESP32的GPIO输出是3.3V正好匹配这也是ESP32比Arduino Uno更适合直接驱动I2C OLED的原因之一。1.3 给新手的选型建议I2C优先我能给出的最直白的建议就是第一块OLED选0.96寸、I2C接口、SSD1306驱动、白字或蓝字的版本。原因很简单——整个学习链条里变量越少越好。I2C只占两个GPIO在ESP32这种引脚本来就不算紧张的芯片上你还能把其他引脚留给传感器、按键、电机驱动。再加上Adafruit SSD1306库和U8g2库对I2C的支持都非常完善示例代码基本是拿来就能跑这比自己用SPI去研究引脚时序要省心太多。等到你把I2C版本玩透了再去试SPI版本也不迟。SPI的刷新速度确实更快动画会更流畅但那是后续优化的事入门阶段完全没必要纠结。2. 硬件接线与上电自检四根线背后的门道2.1 一套最简的物料清单接OLED之前先把你需要的东西列清楚一块ESP32开发板常见的是ESP32 DevKit V1上面是ESP32-WROOM-32模组。一块0.96寸I2C OLED模块驱动芯片SSD1306。几根母对母杜邦线用来连接开发板和OLED模块。一个面包板不是必须的但如果OLED模块脚距比较宽面包板能让接线更稳定。一根Micro USB或Type-C数据线用来给ESP32供电和烧录程序注意要选能传数据的线有些线只能充电不能烧录。我见过很多新手卡在最后这条线上。数据线插上之后电脑没反应或者刷固件一直失败换一根线就好了。所以拿到线之后先在电脑上确认能识别出串口再继续往下走。2.2 I2C接线表与GPIO选择ESP32的I2C引脚不是锁死的理论上你可以把SCL和SDA分配在任何支持输出的GPIO上。但新手最好还是用默认引脚因为绝大多数的库和示例代码都默认这两个引脚OLED VCC → ESP32 3.3VOLED GND → ESP32 GNDOLED SCL → ESP32 GPIO22OLED SDA → ESP32 GPIO21对于ESP32 DevKit V1这种常见的开发板GPIO22和GPIO21被引到了排针上位置在板子左侧一列的中段具体看板子上的丝印。这里有个小细节值得注意部分开发板丝印上写的是22和21但有些板子比如ESP32-S3或ESP32-C3的默认I2C引脚又不一样所以你如果用非标准型号的板子最好查一下对应管脚或者先用代码扫描I2C设备确认屏幕地址和引脚是否匹配。接线时还有一个容易忽略的点ESP32的3.3V引脚虽然标称能提供数百毫安电流但OLED模块本身的功耗很低正常点亮也就二三十毫安供电压力不大。但如果你在同一个3.3V引脚上又接了传感器又接屏幕就要注意总电流别超标了不然电压一跌落屏幕会出现时序错乱显示乱码。2.3 上电前的自检清单接线看起来简单但我还是建议你在上电之前养成检查的习惯因为这种错误属于“看似简单但返工率极高”的确认VCC接的是3.3V不是5V虽然多数OLED模块标称供电3.3V-5V但初次测试统一用3.3V最稳。确认GND接了地不能漏。确认SCL和SDA没有接反这是最常见的接错原因。确认杜邦线插到底半插会导致接触不良屏幕时亮时不亮。确认没有把GPIO22或GPIO21接到其他外设上否则I2C总线可能被占用或干扰。都确认无误之后先不要急着写代码直接给ESP32上电。此时屏幕一般不会亮因为OLED模块上电后默认是黑屏驱动芯片还没有收到初始化命令。如果此时屏幕亮了一格一格的像素或者只有背光亮那并不用担心说明供电是通的。真正要做的是一步步让代码来接管它。3. Arduino IDE下安装ESP32支持与OLED库环境里的那些坑3.1 添加ESP32板卡支持包的常见问题玩ESP32最主流的入门工具还是Arduino IDE别纠结它是不是不够专业零基础阶段用起来最快。打开Arduino IDE之后需要先让IDE认识ESP32这块板卡。路径是“文件 → 首选项 → 附加开发板管理器网址”填上ESPressif官方维护的board manager地址。这个地址在很多教程里都有这里就不重复写了但我要说的是填完之后可能会遇到的两个典型问题。一个是下载板卡支持包时特别慢甚至报错。这是因为板卡描述文件从国外服务器拉取网络状况不好的时候很容易卡住。解决思路是换源网上有国内镜像的配置方法本质就是改一个JSON地址。另一个问题是添加完地址后在“工具 → 开发板 → 开发板管理器”搜索ESP32结果搜不到。这时候可以先点“网络”刷新或者检查Arduino IDE版本是不是太老有些旧版本不太兼容新的板卡JSON格式。装好之后在“工具 → 开发板”下拉菜单里找一个叫“ESP32 Dev Module”的选项选上它。这一步不代表选完就万事大吉不同板子可能要在“Tools”里选不同的Partition Scheme或Flash大小但对跑OLED显示程序来说默认配置足够。3.2 OLED驱动库怎么选Adafruit还是U8g2环境搭好后需要装OLED驱动库。这一步真的是选择困难症的重灾区因为网上教程一半在用Adafruit SSD1306一半在用U8g2还有人用ESP32内置的SSD1306Wire库。我给零基础朋友的建议是先用Adafruit SSD1306再用U8g2两个都装先跑的用Adafruit。Adafruit SSD1306库的好处是结构清晰封装得比较“像样子”。它依赖Adafruit GFX库后者提供了一套强大的绘图API包括画矩形、画圆、画线、显示数字显示字符等等。你只要会调用函数不需要关心屏幕底层怎么刷像素。它的初始化流程很直观特别适合理解OLED的工作方式。U8g2库则更强大支持的字库极其丰富中文字符显示特别方便还有各种绘图模式。但它的API风格偏底层函数命名和参数顺序不如Adafruit那么友好。等你在Adafruit下把显示逻辑都搞明白了再看U8g2很快就能上手。在“工具 → 管理库”里搜“SSD1306”就能找到Adafruit SSD1306安装时它会提示安装依赖Adafruit GFX直接确认就好。搜“U8g2”也能找到对应库。两个库互不冲突可以共存。3.3 利用示例代码做首次点亮烧录前的同步问题装完库之后不需要自己从零写先用库自带的示例代码跑通。在“文件 → 示例 → Adafruit SSD1306”里找“ssd1306_128x64_i2c”打开。打开后你可能会发现示例代码里默认模块地址是0x3C这是绝大多数I2C OLED模块的地址但也有少数模块是0x3D。如果烧录后屏幕没反应第一件事就是检查地址。怎么检查可以用一个简单的I2C扫描程序把ESP32挂在I2C总线上的所有设备地址扫出来。另外一个新手特别容易卡住的点是烧录成功后Arduino IDE的串口监视器可能会占用了串口导致第二次烧录失败。如果你烧录报错“A fatal error occurred: Failed to connect to ESP32: Timed out...”先关掉串口监视器再烧。这个错误其实不一定是线的问题很多时候就是串口占用。烧录时还有个技巧ESP32进入烧录模式一般不需要手动按BOOT键因为开发板上的自动下载电路会处理。但如果你用的是某些精简板可能需要按住BOOT键再按一下EN键才能进入下载模式。遇到一直烧不进去的情况就试一下这个操作。首次点亮成功后屏幕上会显示一个Adafruit的标志动画说明你的ESP32和OLED之间的链路已经通了。到这一步硬件部分就算完全过关剩下的就是自己改程序、写自己的显示内容了。4. 点亮屏幕核心代码怎么写每一步到底在干什么4.1 初始化的骨架先理解Display对象很多新手拿到示例代码喜欢直接改里面的内容改完发现显示乱了又不知道从哪下手。我建议你先把初始化的那部分看懂因为它包含了一个非常重要的概念——所有显示操作都是先画在内存缓冲区里然后再一次性刷到屏幕上。看这段最简示例#include Wire.h #include Adafruit_SSD1306.h #include Adafruit_GFX.h #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define OLED_I2C_ADDR 0x3C Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire, OLED_RESET);这里有几个关键点。SCREEN_WIDTH和SCREEN_HEIGHT定义了分辨率是128x64。如果你的OLED是0.91寸那种128x32的这里就要改成128和32否则显示内容会跑到屏幕外面去。OLED_RESET传的是-1是因为大多数I2C OLED模块没有独立复位引脚直接让Arduino库用一个假的复位过程就行。这里很多教程没有解释清楚导致新手以为要接一根复位线其实不用。然后初始化void setup() { Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDR); display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(20, 20); display.println(Hello!); display.display(); }Wire.begin()是启动ESP32的I2C总线不调用它后面所有I2C通信都不会工作。display.begin()是让SSD1306驱动芯片完成上电初始化第二个参数传0x3C就是告诉它设备地址。clearDisplay()清空缓冲区display()把缓冲区内容推到屏幕。这两个配合是典型的“画布-上屏”模式所有操作都是画在画布上最后刷一次才显示。你如果忘了调用display()哪怕写了再多的文字屏幕还是黑的。4.2 坐标定位和文字绘制setCursor的参照点OLED的坐标系原点在左上角X轴向右Y轴向下。setCursor(x, y)设置的是文字左上角的起始位置。这个知识点很简单但它决定了你能不能把一个标题放在屏幕正中间。以128x64的屏幕为例如果文字字号是1每个字符占6x8像素。你要显示一行“ESP32”里面有5个字符总宽度是30像素那要让它在水平方向居中起始X坐标就是(128-30)/2也就是49。用这种方式推算比肉眼瞎调坐标要靠谱得多。setTextSize(n)是放大倍率字号2意味着每个字符占12x16像素。注意放大之后坐标系统依然按左上角计算所以排版的时候要考虑放大后的实际像素尺寸。我的习惯是先在纸上画一个128x64的格子标出想放的内容再换算成坐标。这样虽然看似原始但在零基础阶段非常有效。4.3 显示动态数据把变量“塞”进屏幕学会了显示固定文字你肯定想让屏幕显示传感器数据这种变化的数值。核心方法就是把数值转换成字符串然后拼到你要显示的“模板”里。比如显示一个浮点数温度float temp 26.5; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.print(Temp: ); display.print(temp); display.println( C); display.setCursor(0, 16); display.print(Humidity: ); display.print(67); display.println( %); display.display();这段代码真正想让你理解的是print()和println()的区别println在输出内容之后会自动换行下一次打印会从下一行开始。你不需要手动把Y坐标往下移只要调用println光标就会自动移动到下一行的开头。还有一个很容易踩的坑如果你在loop循环里反复显示数据一定要在每次更新时先clearDisplay()再重画否则旧的文字会和新文字重叠产生残影效果。等你看懂了display.display()的刷新机制之后就会明白为什么会这样。4.4 在屏幕上画图形圆形、矩形、直线都是基础操作OLED不仅能显示文字还能画图形。Adafruit GFX库提供了一堆现成函数display.drawLine(x0, y0, x1, y1, SSD1306_WHITE); // 画直线 display.drawRect(x, y, w, h, SSD1306_WHITE); // 画空心矩形 display.fillRect(x, y, w, h, SSD1306_WHITE); // 画实心矩形 display.drawCircle(x, y, r, SSD1306_WHITE); // 画空心圆 display.fillCircle(x, y, r, SSD1306_WHITE); // 画实心圆 display.drawPixel(x, y, SSD1306_WHITE); // 画一个像素点这些函数在做一个“模拟仪表盘”的项目时特别好用。你可以先用drawArc或者drawCircle画一个半圆表盘再用drawLine画指针让指针位置跟着传感器数值走看起来就非常“产品化”。不过零基础阶段至少先把矩形和圆形玩明白就已经能让界面好看不少了。4.5 一个可直接抄作业的完整示例显示IP地址和运行时间下面这个示例非常实用适合WiFi联网场景。它会在OLED上轮流显示当前IP地址和系统运行时间#include Wire.h #include Adafruit_SSD1306.h #include Adafruit_GFX.h #include WiFi.h #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_I2C_ADDR 0x3C Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire, -1); void setup() { Serial.begin(115200); Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDR); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(10, 20); display.print(Booting...); display.display(); WiFi.begin(your_ssid, your_password); while (WiFi.status() ! WL_CONNECTED) { delay(500); } } void loop() { display.clearDisplay(); display.setTextSize(2); display.setCursor(0, 0); display.println(IP:); display.setTextSize(1); display.setCursor(0, 20); display.println(WiFi.localIP()); display.setCursor(0, 40); display.print(Up: ); display.print(millis() / 1000); display.println(s); display.display(); delay(100); }这个程序会直接把ESP32连上WiFi后的IP显示在屏幕上省得再打开串口看一堆日志。对于做一个智能家居小设备来说这种显示方式比串口直观多了。5. 那些年我踩过的显示坑从“没反应”到“乱码”的排查链路5.1 屏幕完全不亮从供电和地址入手首先做减法。屏幕不亮先用手摸一下模块上的驱动芯片微微发热说明供电正常。如果完全不发热大概率是供电没进来检查VCC和GND是不是接反了。供电正常但还是黑的那就可以怀疑I2C地址。跑一个I2C扫描程序代码很简单#include Wire.h void setup() { Serial.begin(115200); Wire.begin(); Serial.println(\nI2C Scanner); } void loop() { byte error, address; int nDevices 0; Serial.println(Scanning...); for (address 1; address 127; address) { Wire.beginTransmission(address); error Wire.endTransmission(); if (error 0) { Serial.print(Device found at 0x); if (address 16) Serial.print(0); Serial.println(address, HEX); nDevices; } } if (nDevices 0) Serial.println(No device found); delay(2000); }如果扫描出来0x3C那屏幕是活的问题在代码里的地址或初始化参数。如果扫描出来什么也没有但模块又发热有可能是SCL和SDA接反了或者杜邦线接触不良。把两根线对调再扫一遍。还有一种隐蔽问题ESP32开发板的GPIO22和GPIO21默认在板子上接了其他上拉电阻或外设有的人会用这两脚接按键也会导致扫描失败所以先保证这两个引脚只接OLED。5.2 显示花屏、只亮一半、出现噪点花屏的原因比完全不亮更复杂我总结下来主要是以下几种一是分辨率设置错误。你的屏幕是128x32但代码里创建对象时写了128x64那初始化时向SSD1306发送的列地址扫描范围就超过了硬件支持的范围显示就会出现错乱。遇到这种情况先确认屏幕规格改代码里的SCREEN_HEIGHT。二是电源不稳。OLED模块如果供电电压过低驱动芯片内部电荷泵可能工作异常导致屏幕亮度不均或者花屏。这时候检查是否在同一个3.3V电源上带了太多外设或者杜邦线太长导致线路压降。三是刷新太频繁。有些库在刷新高复杂度画面时如果连续调用display()会因为I2C速率受限而产生闪烁或撕裂感。不是严格意义的“花屏”但观感很像有问题。解决办法是降低刷新频率只在数据变化时调用display()。四是SSH1106误当成SSD1306。虽然这两个芯片都是128*64的OLED但内部显存的组织方式不同。如果你买的是写着SH1106的模块库仍按SSD1306初始化屏幕可能只显示左半部分。你可以尝试在代码里做列偏移或者换成U8g2库并配置SH1106驱动。5.3 加了OLED代码之后程序卡死I2C总线冲突和阻塞延迟热词里有一条“加了oled函数 卡死”这问题我遇到过太多次了。最常见的原因是你在程序里用了多个I2C设备比如OLED和还在扫描中的传感器都挂在同一条总线上其中一个传感器地址冲突或者从机设备没有正确应答导致Wire库在通信时一直等待表现得像程序卡死。排查方法是不要同时初始化所有设备先只初始化OLED跑通显示再逐个加上其他外设每加一个就重启测试。这样能很快定位是哪个设备把总线拉死了。另一个原因是你在loop里使用了delay()而且延迟时间很长比如几秒钟。这本身不会卡死OLED但如果同时有外部中断或者看门狗超时长时间阻塞会让系统重启。所以做显示刷新时我习惯用millis()做非阻塞定时而不是傻傻地delay(1000)。5.4 屏幕出现残影、亮度下降、永久烧屏OLED的像素是自发光长时间显示同一个画面那个区域的老化速度会比周围快留下“残影”或“烧屏”现象。这在0.96寸这种小屏幕上同样存在只是周期更长。我自己的经验是不要把OLED当成显示器一直刷静态内容尤其是固定显示一个界面从早到晚不变化。到后面你会发现换个页面时之前那个页面的阴影还在。所以项目做完长期运行时可以加一个屏保逻辑比如2分钟无操作就全屏清空或者显示随机变化的内容。同时OLED亮度不要总是开到最大。和LCD不同OLED的功耗和亮度关系很大长期高亮度驱动也会加速像素老化。既然你的代码里可以通过display.dim(true)来降低亮度那就不需要一直满亮度运行。6. 从“能显示”到“会显示”进阶玩法清单6.1 局部刷新和缓冲区操作display.display()会把整个128x64的缓冲区全部通过I2C推到屏幕如果你只是改了一个数字全量刷新是浪费的而且刷新频率一高I2C就卡在了瓶颈上。Adafruit库其实不支持真正的局部刷新任何display()都是整屏刷新。但你可以从软件层面优化不改变的部分不重画只把变化区域重新绘制。比如时钟界面秒数每秒变但分钟和小时90秒才变一次那你完全可以在秒数变化时只clearDisplay()重画秒数而不是把全部元素都刷新一遍。虽然底层还是要整屏刷新但至少减少了Adafruit GFX在缓冲区上画的时间。如果用U8g2库它提供了updateDisplayArea()这样的函数可以只刷新某个矩形区域在画进度条或仪表盘时效果非常明显帧率能提高不少。6.2 跑个简单动画利用缓冲区反复重画动画的原理很简单快速切换的画面利用人眼的视觉暂留形成动态效果。OLED的刷新速度本身就快真彩动画做不了但画一个移动的小方块完全没问题。比如做一个呼吸灯效果就是不断改变一个圆形的半径void loop() { for (int r 1; r 30; r) { display.clearDisplay(); display.drawCircle(64, 32, r, SSD1306_WHITE); display.display(); delay(30); } for (int r 30; r 1; r--) { display.clearDisplay(); display.drawCircle(64, 32, r, SSD1306_WHITE); display.display(); delay(30); } }这里的delay(30)是控制动画帧率的关键。但要注意Arduino的delay是阻塞的如果你还要同时处理传感器数据就不能用这种方式了。更好的做法是把动画状态保存在变量里用millis()定时器驱动状态更新这样主循环还能干别的事。6.3 显示中文字库和取模两个路线很多新手想把中文显示在OLED上这就有两种路线。一种是用U8g2库它内部带了很多语言的字库包括中文。你只要调用u8g2.setFont(u8g2_font_wqy12_t_chinese)这样的中文字体然后u8g2.drawStr(0, 10, 你好)就能显示。U8g2的中文字库用得比较多显示效果也还行但中文编码在Arduino的字符串里可能乱码需要处理编码集。另一种是图片取模。你把想显示的汉字在取模软件里做成位图数组然后通过drawBitmap()绘制。这种方式比较麻烦但显示效果是点阵风格很适合做复古感UI。而且不止汉字你也可以用同样的方式显示自定义的logo图片。取模时要留意“阴码/阳码”和扫描方向设置如果取模参数和OLED库的绘制算法不匹配显示出来就是镜像或者乱码。6.4 再往上走ESP-IDF、MicroPython、LVGL当你把Arduino下的OLED玩明白了迟早会接触到更复杂的开发环境。如果走ESP-IDF官方框架OLED依然用SSD1306驱动但API完全不同了你需要手动安装esp_idf_lib或者ssd1306的组件配置好I2C端口和地址。流程更繁琐但能精确控制底层资源适合产品化开发。热词里提到的esp32 micro_ros_espidf_component ros 2 humble其实也走这条路底层传感器和显示设备都要在IDF组件里配好。如果从Arduino换到MicroPython那OLED驱动就更简单了直接ssd1306模块几行代码就能点亮。但MicroPython的流畅度不如原生Arduino做复杂动画会吃力。如果你想把界面做得非常漂亮可以上LVGL这个图形库。它在ESP32上运行支持触摸、控件、动画画面效果远超裸画drawPixel。而且LVGL也有针对SSD1306的驱动你可以先跑一个LVGL的Demo体验一下真正的“屏幕UI”是什么感觉。6.5 功耗不是小事OLED在电池项目里的取舍最后提一个很多人到后期才会关心的问题功耗。OLED模块全亮的时候功耗不低大概在20到40mA左右。对USB供电来说无所谓但如果你做一个电池供电的小设备比如温湿度计、手表这个屏幕就是耗电大户之一。所以做低功耗项目时通常的做法是让OLED休眠只在需要显示的时候唤醒。SSD1306有一个省电命令display.ssd1306_command(0xAE)可以关闭显示但驱动芯片还在耗电想彻底省电可以直接断开模块的VCC供电用一个MOS管或GPIO控制的电源开关来实现“软开关”。等需要读数时再上电重新初始化整个过程也就几百毫秒用户体验基本不受影响。我自己的习惯是调试阶段无限刷新产品化阶段加屏保和休眠逻辑。这块屏幕的响应速度很快随时唤醒都不会让人觉得迟钝。零基础阶段把OLED玩到“能显示、不乱码、不卡死、不烧屏”这四个境界你就已经超过大多数“只跑过示例代码”的初学者了。剩下的光靠看教程用处不大接一个传感器连一个网络做一个具体的项目在项目里不断折腾屏幕的显示逻辑进步会非常快。
返回列表