尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

TTGO T-OI PLUS开发指南:ESP32-S3圆形屏物联网终端实战

TTGO T-OI PLUS开发指南:ESP32-S3圆形屏物联网终端实战 1. 项目概述为什么是TTGO T-OI PLUS如果你玩过ESP8266或者ESP32的开发板可能会觉得它们已经足够小巧和强大了。但当我第一次拿到LilyGo的TTGO T-OI PLUS时还是被它的设计思路惊艳到了。这不仅仅是一块开发板更像是一个为特定场景“量身定做”的解决方案。它的核心是一颗ESP32-S3芯片但真正让它与众不同的是那块1.14英寸的IPS圆形显示屏、板载的锂电池充电管理电路以及那个极具辨识度的圆形PCB造型。简单来说TTGO T-OI PLUS是一个高度集成、开箱即用的物联网显示终端原型平台。你不需要再额外连接屏幕、电池和充电模块所有东西都集成在一块比硬币大不了多少的板子上。这极大地降低了从想法到原型的时间成本。我最初用它来做一些智能家居的状态显示终端比如显示温湿度、空气质量或者作为一个小型的信息看板。后来发现它的应用场景远不止于此——可穿戴设备、便携式传感器节点、迷你游戏机甚至是桌面小摆件都能看到它的身影。它的名字里“T-OI”可能就暗示了“Thing of Internet”或者“Tiny Open-source IoT”之类的含义而“PLUS”则代表了它在初代T-OI基础上的升级主要是屏幕从方形变成了更高清的圆形芯片也从ESP32升级到了性能更强的ESP32-S3。对于开发者、电子爱好者和创客来说它提供了一个近乎完美的画布让你可以专注于应用逻辑和交互设计而不是繁琐的硬件连线。2. 核心硬件深度解析与选型思考拿到一块开发板第一步永远是“读懂”它。TTGO T-OI PLUS的硬件设计有很多值得细品的地方理解这些能帮助你在项目开发中避开很多坑也能更好地发挥其潜力。2.1 心脏ESP32-S3芯片的能耐与局限TTGO T-OI PLUS搭载的是ESP32-S3芯片这是乐鑫在ESP32系列中的一款重要产品。相较于经典的ESP32如ESP32-D0WDS3版本有几个关键升级首先CPU性能更强。它采用了Xtensa® 32位LX7双核处理器主频高达240MHz并且支持向量指令扩展对于需要处理图形、音频或复杂算法的应用性能提升是实实在在的。我在驱动那块圆形屏幕进行动态刷新时能明显感觉到比老款ESP32更流畅。其次内存更大。板载的通常是8MB PSRAM伪静态随机存储器和4MB或8MB的Flash。大内存意味着你可以存储更多的字体、图片资源或者运行更复杂的程序逻辑。这对于拥有显示屏的设备至关重要。第三更好的USB支持。ESP32-S3原生支持USB OTG这意味着它不仅可以作为USB设备被电脑识别用于编程和日志输出理论上还可以作为USB主机连接其他外设。虽然T-OI PLUS板子上只引出了一个USB-C口用于供电和编程但这个特性为未来扩展留下了可能。然而选择ESP32-S3也意味着一些“代价”。最直接的就是开发环境的微调。如果你从ESP8266或老款ESP32迁移过来需要确保Arduino IDE或PlatformIO中的开发板支持包是最新的并且选择了正确的板型例如ESP32S3 Dev Module。早期的一些库可能对S3的支持不完善需要检查兼容性。注意在Arduino IDE中配置时务必在“Tools”菜单下正确选择“PSRAM”为“OPI PSRAM”并根据你的板子实际Flash大小选择“Partition Scheme”。一个常见的错误是分区方案选择不当导致程序过大无法上传或运行时出现异常。2.2 灵魂之窗1.14英寸圆形IPS屏的驱动奥秘这块圆形屏幕是T-OI PLUS的视觉核心。它是一块1.14英寸、240x240分辨率的IPS液晶屏驱动芯片通常是ST7789。圆形设计带来了独特的UI挑战和机遇。驱动原理屏幕通过SPI接口与ESP32-S3通信。你需要一个支持ST7789的图形库最常用的是TFT_eSPI。在TFT_eSPI库中你需要正确配置引脚定义。对于T-OI PLUS典型的配置如下在User_Setup.h文件中#define TFT_CS 5 // 片选 #define TFT_DC 4 // 数据/命令选择 #define TFT_RST 48 // 复位如果连接了的话有些板子可以接-1 #define TFT_MOSI 6 // SPI数据线主机输出 #define TFT_SCLK 7 // SPI时钟线 #define TFT_BL 45 // 背光控制SPI的时钟频率SPI_FREQUENCY可以设置到40MHz甚至更高以获得更快的刷新率。圆形UI的挑战在方形屏幕上绘图是常规操作但在圆形屏幕上你需要考虑内容的布局和裁剪。一个常见的技巧是定义圆形区域你可以将屏幕中心设为原点只在这个圆形区域内绘制内容区域外的像素点忽略。这可以通过计算每个像素点到圆心的距离来实现。使用圆形遮罩更高效的方法是在内存中创建一个圆形的Alpha遮罩mask绘制时应用这个遮罩只显示圆形内的部分。TFT_eSPI库的sprite精灵功能结合Alpha混合可以很好地实现这一点。利用环形布局将信息以环形方式排列例如环形菜单、环形进度条、环形图表这能充分利用屏幕形状视觉效果也更好。功耗管理屏幕背光TFT_BL是主要的耗电源之一。在电池供电的场景下务必通过PWM脉冲宽度调制来控制背光亮度在不需要高亮时如夜间调暗甚至关闭背光能显著延长续航。2.3 能量核心电池管理与低功耗设计板载的TP4056锂电池充电管理芯片和AXP192电源管理芯片根据版本不同可能有所差异是保证其便携性的关键。充电管理TP4056这是一个线性的单节锂电池充电芯片最大充电电流可通过外部电阻设置通常板子已设定好如500mA。它提供了充电状态指示通常通过LED当电池充满时会自动切换为涓流充电保护电池。你需要做的就是通过USB-C口接入5V电源。电源路径管理更高级的板子可能集成像AXP192这样的PMIC电源管理集成电路。它可以管理电池的充放电实现有电池时用电池供电插入USB时自动切换为外部供电并为电池充电同时还能为ESP32和屏幕提供多个不同的电压轨如3.3V, 2.5V等效率更高。低功耗实践要让设备长时间待机必须利用ESP32-S3的深度睡眠Deep Sleep模式。进入深度睡眠调用esp_deep_sleep_start()函数。在此模式下CPU、大部分RAM和外围设备都会断电仅保留RTC实时时钟控制器和RTC快速内存的一小部分维持工作电流可降至10μA级别。唤醒源T-OI PLUS通常会将某个按键如BOOT键连接到ESP32的RTC GPIO上配置为外部唤醒源。这样按下按键就能唤醒设备。也可以使用定时器唤醒。保存状态深度睡眠前如果需要保存变量状态可以将其存入RTC慢速内存RTC_DATA_ATTR修饰符或Preferences偏好设置中。外围设备断电在睡眠前务必通过代码将屏幕背光关闭并将屏幕置于睡眠模式通过发送特定的命令给ST7789。同时确保其他可能耗电的GPIO引脚设置为输入模式或输出低电平避免漏电。一个典型的低功耗loop结构如下RTC_DATA_ATTR int bootCount 0; // 保存在RTC内存睡眠后不丢失 void setup() { Serial.begin(115200); // 初始化屏幕等外设 tft.init(); tft.setRotation(1); // 显示一些信息例如 bootCount tft.printf(Boot number: %d\n, bootCount); bootCount; // 业务逻辑... delay(5000); // 模拟工作5秒 // 进入深度睡眠前准备 tft.writecommand(ST7789_SLPIN); // 让屏幕进入睡眠模式 digitalWrite(TFT_BL, LOW); // 关闭背光 // 配置唤醒源例如GPIO0BOOT键高电平唤醒 esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 1); Serial.println(Going to sleep now); delay(100); esp_deep_sleep_start(); // 进入深度睡眠 } void loop() { // Deep Sleep模式下loop永远不会执行 }3. 开发环境搭建与第一个项目实战理论说得再多不如动手做一遍。我们从零开始让T-OI PLUS显示出“Hello World”。3.1 工具链准备PlatformIO vs Arduino IDE我强烈推荐使用PlatformIO作为VSCode插件或独立IDE进行开发原因如下项目管理更专业它以项目为单位自动管理库依赖和编译配置非常适合稍复杂的项目。库管理强大依赖库在platformio.ini中声明一键下载版本清晰。调试支持更好与VSCode深度集成可以方便地设置断点、查看变量虽然对于ESP32硬件调试需要额外适配器但日志输出非常方便。当然如果你习惯Arduino IDE也完全没问题。只需在“开发板管理器”中添加ESP32的支持乐鑫的官方开发板地址然后选择正确的板子型号如ESP32S3 Dev Module即可。这里以PlatformIO为例展示初始配置。在项目根目录的platformio.ini文件中典型配置如下[env:ttgo-t-oi-plus] platform espressif32 board esp32s3-devkitc-1 ; 这是一个通用的S3开发板配置最接近T-OI PLUS framework arduino monitor_speed 115200 lib_deps bodmer/TFT_eSPI^2.5.0 ; 使用TFT_eSPI库驱动屏幕 ; 其他需要的库... board_build.partitions huge_app.csv ; 如果程序很大使用大分区方案 build_flags -DBOARD_HAS_PSRAM ; 启用PSRAM支持 -mfix-esp32-psram-cache-issue ; 修复PSRAM缓存问题某些版本需要实操心得board选项可能没有直接的ttgo-t-oi-plus选择esp32s3-devkitc-1通常能工作因为核心芯片相同。关键是通过lib_deps和build_flags来适配具体外设。如果遇到上传失败可以尝试在platformio.ini中指定上传端口upload_port COMx(Windows) 或/dev/cu.usbmodemXXX(Mac)。3.2 “Hello World”与图形库基础首先我们需要让屏幕亮起来并显示文字。确保已按照上一节配置好TFT_eSPI库和引脚。创建一个main.cpp文件写入以下代码#include Arduino.h #include TFT_eSPI.h TFT_eSPI tft TFT_eSPI(); void setup() { Serial.begin(115200); Serial.println(T-OI PLUS Start...); // 初始化屏幕 tft.init(); tft.setRotation(1); // 根据你的安装方向调整旋转角度0-3 tft.fillScreen(TFT_BLACK); // 清屏为黑色 // 设置文本颜色和背景色 tft.setTextColor(TFT_WHITE, TFT_BLACK); tft.setTextSize(2); // 设置字体大小1为最小每个像素点放大倍数 // 在屏幕中央显示“Hello World” // 先计算文本的像素宽度以便居中 String msg Hello World; int16_t x (tft.width() - tft.textWidth(msg)) / 2; int16_t y (tft.height() - 16) / 2; // 假设字体高度约为16像素2号字 tft.setCursor(x, y); tft.println(msg); // 打开背光假设背光控制引脚为45高电平点亮 pinMode(45, OUTPUT); digitalWrite(45, HIGH); } void loop() { // 主循环这里可以添加动态效果或响应事件 delay(1000); // 例如让文本颜色渐变简单示例 static uint16_t color TFT_RED; tft.setTextColor(color, TFT_BLACK); tft.setCursor(10, 50); tft.println(Dynamic Color); color 0x100; // 简单改变颜色值 if (color TFT_WHITE) color TFT_RED; }代码解析tft.setRotation(1)设置屏幕旋转。由于屏幕是圆形的旋转主要影响坐标系的起点0,0位置。你需要根据板子的物理摆放方向试验哪个值最符合直觉。tft.textWidth()这是一个非常实用的函数用于获取字符串在当前字体和大小下的像素宽度是实现UI元素居中对齐的关键。背光控制代码中我们直接给背光引脚输出高电平。更佳实践是使用PWManalogWrite来控制亮度但需要确认该引脚是否支持PWM输出。编译并上传代码到板子你应该能看到屏幕中央显示“Hello World”下方有一行变色的文字。恭喜你的T-OI PLUS已经成功运行了第一个程序3.3 绘制图形与加载图片显示文字只是基础图形界面离不开绘制基本图形和显示图片。绘制基本图形TFT_eSPI库提供了丰富的绘图函数。// 画一个填充的蓝色圆圆心在x120, y120半径50 tft.fillCircle(120, 120, 50, TFT_BLUE); // 画一个红色的空心圆 tft.drawCircle(120, 120, 60, TFT_RED); // 画一条线 tft.drawLine(0, 0, 240, 240, TFT_GREEN); // 画一个填充的矩形 tft.fillRect(50, 50, 100, 60, TFT_YELLOW);加载并显示图片对于小尺寸屏幕图片需要先转换为位图格式并尽可能压缩。通常使用TFT_eSPI的pushImage函数。图片转换使用工具如Image2Lcd、LCD Image Converter或在线转换器将你的PNG/JPG图片转换为C语言数组。设置输出格式为16位色RGB565宽度和高度不超过240。确保生成数组格式与pushImage兼容。在程序中使用// 假设你有一个转换好的图片数组 myImage // 它的尺寸是 100x100 像素 #include myImage.h // 将生成的数组保存在一个头文件中 void showImage() { // 在坐标 (70, 70) 处显示图片 tft.pushImage(70, 70, 100, 100, myImage); }pushImage会直接将像素数据推送到屏幕的指定区域速度很快。注意事项将大图片存入Flash程序存储空间会迅速占用空间。对于T-OI PLUS我们有PSRAM这个“外挂”。可以将图片数据存放在PSRAM中以节省宝贵的Flash空间。TFT_eSPI库的sprite精灵功能支持在PSRAM中创建画布非常适合处理大图像或动画。4. 进阶应用打造一个智能桌面天气站现在我们来做一个更实用的项目一个通过Wi-Fi获取天气信息并显示在圆形屏幕上的桌面天气站。这个项目会综合运用网络连接、JSON解析、图形UI和低功耗管理。4.1 系统架构与网络连接项目目标设备每30分钟从公共天气API例如Open-Meteo获取一次数据解析后以美观的圆形UI显示温度、湿度、天气状况图标其余时间进入深度睡眠以省电。硬件连接无需任何额外连线T-OI PLUS板载天线足以完成Wi-Fi连接。软件架构唤醒由定时器或按键唤醒。初始化初始化屏幕、连接Wi-Fi。数据获取发起HTTP请求到天气API获取JSON格式的响应。数据解析使用ArduinoJson库解析JSON提取所需字段。UI渲染在屏幕上绘制背景、文字和天气图标。显示与休眠保持显示一段时间如30秒然后关闭屏幕背光配置定时唤醒进入深度睡眠。网络连接核心代码#include WiFi.h #include HTTPClient.h #include ArduinoJson.h const char* ssid 你的Wi-Fi名称; const char* password 你的Wi-Fi密码; const char* weatherURL https://api.open-meteo.com/v1/forecast?latitude39.90longitude116.41current_weathertrue; // 北京坐标示例 bool fetchWeatherData(float temp, int weatherCode) { if (WiFi.status() ! WL_CONNECTED) { Serial.println(WiFi not connected!); return false; } HTTPClient http; http.begin(weatherURL); int httpCode http.GET(); if (httpCode HTTP_CODE_OK) { String payload http.getString(); // 解析JSON DynamicJsonDocument doc(1024); DeserializationError error deserializeJson(doc, payload); if (error) { Serial.print(JSON解析失败: ); Serial.println(error.c_str()); http.end(); return false; } // 提取数据根据API返回结构调整 temp doc[current_weather][temperature]; weatherCode doc[current_weather][weathercode]; // 用于判断天气状况 http.end(); return true; } else { Serial.printf(HTTP请求失败错误码: %d\n, httpCode); http.end(); return false; } }避坑技巧公共API通常有调用频率限制。务必遵守其条款不要过于频繁地请求。对于个人项目半小时或一小时一次是安全的。另外解析JSON时使用ArduinoJson的assistant工具https://arduinojson.org/v6/assistant/根据API返回样例计算所需的DynamicJsonDocument大小避免内存分配失败。4.2 圆形UI设计与实现在圆形屏幕上设计UI我们需要一个布局策略。这里采用一个简单的“同心圆”布局最内圈显示当前温度大字体。中间圈环显示天气状况图标根据weatherCode映射到不同的图标。外圈显示湿度、更新时间等其他信息或者作为装饰性环状进度条。实现圆形文本环绕TFT_eSPI库本身不直接支持环形文本。一个实用的方法是将需要环绕的文字拆分成单个字符。根据角度计算每个字符的位置x centerX radius * cos(angle),y centerY radius * sin(angle)。在计算出的每个位置绘制单个字符并随着字符递增调整角度。绘制天气图标我们可以预先制作一套小尺寸如32x32像素的天气图标晴天、多云、雨天、雪天等的位图数组。根据解析到的weatherCode选择对应的图标数组用pushImage函数绘制在指定位置。代码片段示例绘制温度大字体void drawTemperature(float temp) { tft.setTextColor(TFT_WHITE, TFT_BLACK); tft.setTextDatum(MC_DATUM); // 设置文本对齐方式为中间居中 tft.setTextSize(4); // 使用大号字体 String tempStr String(temp, 1) C; // 保留一位小数 tft.drawString(tempStr, tft.width()/2, tft.height()/2 - 20); // 在中心偏上位置绘制 }4.3 低功耗策略与定时唤醒整合这是让设备能够长期电池供电的关键。我们将使用ESP32-S3的定时器唤醒功能。核心步骤计算睡眠时间我们希望每30分钟1800秒更新一次天气。但ESP32的深度睡眠定时器参数是微秒μs。// 定义睡眠时间秒转换为微秒 #define uS_TO_S_FACTOR 1000000ULL #define TIME_TO_SLEEP 1800 // 秒 esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);睡眠前清理在调用esp_deep_sleep_start()之前必须确保屏幕已进入睡眠模式ST7789_SLPIN命令。屏幕背光已关闭。Wi-Fi已断开连接WiFi.disconnect(true)。所有不必要的GPIO状态已设置妥当输入模式或输出低电平。RTC内存的使用为了在睡眠后还能知道之前获取的天气数据避免每次唤醒后屏幕空白等待网络我们可以将上一次成功获取的数据存入RTC内存。RTC_DATA_ATTR float lastTemp 0.0; RTC_DATA_ATTR int lastWeatherCode 0; RTC_DATA_ATTR time_t lastUpdate 0; void setup() { // ... 初始化 ... // 首先检查是否有旧数据并立即显示提供即时反馈 if (lastUpdate ! 0) { drawUI(lastTemp, lastWeatherCode); } // 然后尝试获取新数据... }完整的setup()逻辑流程RTC_DATA_ATTR int bootCount 0; void setup() { Serial.begin(115200); bootCount; Serial.printf(启动次数: %d\n, bootCount); // 1. 硬件初始化 initDisplay(); showBootScreen(); // 显示启动Logo或提示 // 2. 尝试连接Wi-Fi并获取天气 float currentTemp 0.0; int currentWeatherCode 0; bool fetchSuccess false; if (connectWiFi()) { fetchSuccess fetchWeatherData(currentTemp, currentWeatherCode); WiFi.disconnect(true); // 获取后立即断开以省电 } // 3. 更新显示 if (fetchSuccess) { // 更新RTC内存中的数据 lastTemp currentTemp; lastWeatherCode currentWeatherCode; lastUpdate getCurrentEpochTime(); // 需要时间同步函数 drawUI(currentTemp, currentWeatherCode); } else if (lastUpdate ! 0) { // 网络失败显示旧数据 drawUI(lastTemp, lastWeatherCode); tft.setTextColor(TFT_ORANGE); tft.drawString(Old Data, tft.width()/2, tft.height() - 20); } else { // 首次启动且网络失败 tft.drawString(No Data, tft.width()/2, tft.height()/2); } // 4. 准备进入深度睡眠 delay(10000); // 显示10秒 turnOffDisplay(); // 关闭屏幕和背光 Serial.println(准备进入深度睡眠); // 配置定时唤醒30分钟 esp_sleep_enable_timer_wakeup(30 * 60 * 1000000ULL); // 也可以保留按键唤醒作为手动触发 esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 1); // BOOT键 esp_deep_sleep_start(); } void loop() { // 不会执行到这里 }5. 常见问题排查与性能优化实录在实际开发中你一定会遇到各种各样的问题。这里记录了我踩过的一些坑和解决方案。5.1 编译与上传问题排查表问题现象可能原因解决方案编译错误‘TFT_eSPI’ not found库未正确安装或platformio.ini中lib_deps配置错误。1. 检查platformio.ini确保bodmer/TFT_eSPI拼写正确。2. 在PIO Home界面进入项目点击“Libraries”搜索并安装。上传失败Timed out waiting for packet header1. 板子未进入下载模式。2. 串口被占用。3. 驱动问题。1. 按住板子上的“BOOT”键不放再按一下“RST”键然后松开“RST”最后松开“BOOT”使板子进入下载模式。2. 关闭所有可能占用串口的软件如串口监视器、其他IDE。3. 检查设备管理器中CP210x或CH340驱动是否正常安装。程序上传成功但屏幕无反应1. 屏幕引脚定义错误。2. 背光未开启。3. 屏幕初始化代码有误。1. 仔细核对TFT_eSPI库中User_Setup.h的引脚定义确保与T-OI PLUS原理图一致。2. 检查背光控制引脚如GPIO45是否正确设置为输出并输出高电平。3. 尝试降低SPI频率如#define SPI_FREQUENCY 27000000排除时序问题。运行一段时间后死机或重启1. 内存泄漏或堆栈溢出。2. 电源不稳定。3. Wi-Fi连接不稳定导致看门狗复位。1. 使用ESP.getHeapSize()、ESP.getFreeHeap()监控内存。避免在循环中动态分配大内存。2. 确保电池电量充足或USB供电稳定。电池供电时在程序启动瞬间电流较大可能导致电压骤降复位。3. 为网络操作设置合理的超时时间并考虑加入异常处理。5.2 显示与图形性能优化技巧启用双缓冲与PSRAM对于动态图形或动画直接操作屏幕tft.会导致闪烁。使用TFT_eSPI的Sprite精灵在PSRAM中创建缓冲区。TFT_eSprite spr TFT_eSprite(tft); // 创建精灵对象 spr.createSprite(240, 240); // 在PSRAM中创建240x240的画布 spr.fillSprite(TFT_BLACK); // 在精灵上绘制 spr.setTextColor(TFT_WHITE); spr.drawString(Hello from Sprite!, 50, 50); spr.pushSprite(0, 0); // 将精灵一次性推送到屏幕0,0位置无闪烁所有绘图操作先在spr上进行最后用pushSprite一次性更新屏幕非常流畅。使用局部刷新如果UI只有一小部分变化如更新的数字不要重绘整个屏幕。只清除和更新需要改变的区域可以极大提高速度并减少闪烁。字体与图片优化字体只加载需要的字体文件到Flash中。TFT_eSPI支持.vlw格式的字体体积较大谨慎使用。图片务必转换为RGB565格式16位色。对于圆形屏幕将图片背景设为透明色或与屏幕背景一致可以省去复杂的遮罩计算。使用工具将图片尺寸裁剪到刚好所需大小。5.3 电源与低功耗深度优化测量实际电流使用万用表串联在电池回路中分别测量以下状态电流深度睡眠应在10-150μA之间。如果过高检查是否有外部电路漏电如上拉的GPIO接在了外部传感器上。屏幕点亮最大亮度可能达到30-80mA。Wi-Fi连接与数据传输峰值电流可能超过200mA。这就是为什么要在数据获取后立即断开Wi-Fi并进入睡眠。优化Wi-Fi连接时间Wi-Fi连接和握手是耗电大户。保存Wi-Fi凭证使用WiFi.begin(ssid, password)快速重连。如果信号稳定可以尝试固定IP避免DHCP过程。设置连接超时如10秒超时后立即放弃本次更新进入睡眠等待下次循环。利用ESP-NOW进行点对点通信高级如果你的项目中有多个ESP32设备可以考虑使用ESP-NOW协议。它是一种低功耗、直接的2.4GHz通信协议无需连接路由器。可以让一个设备作为“网关”连接Wi-Fi获取数据然后通过ESP-NOW广播给其他T-OI PLUS显示终端这样其他终端就完全不需要开启Wi-Fi功耗极低。开发像TTGO T-OI PLUS这样的高度集成设备最大的乐趣在于软硬件的紧密结合与权衡。你需要在有限的资源电量、内存、屏幕空间内创造出既美观又实用的应用。每一次对功耗的优化、对UI流畅度的提升都直接带来用户体验的改善。从简单的显示到复杂的物联网节点这块小圆板能做的事情只受限于你的想象力。我个人的体会是多看看社区里其他玩家的项目比如在GitHub上搜索TTGO T-OI PLUS经常能获得意想不到的灵感和解决方案。最后一个小建议妥善管理你的platformio.ini和库版本这能为未来的项目维护省下大量时间。
返回列表