基于ESP32与电子墨水屏的智能Wi-Fi记分牌设计与实现
2026/8/19 6:51:24 网站建设 项目流程

1. 项目概述:当传统记分牌遇上智能家居

在社区篮球场、公司内部的乒乓球室,甚至是家庭后院的羽毛球场,你肯定见过这样的场景:一场比赛正酣,记分员却手忙脚乱地翻动着那块笨重的塑料或木质记分牌,或者干脆用粉笔在黑板上涂改。不仅效率低下,容易出错,而且一旦比赛结束,那些分数也就随之消失,无法追溯。这就是“Smart Wi-Fi ePaper Scoreboard”这个项目诞生的起点——它试图用一块电子墨水屏(ePaper)和无处不在的Wi-Fi网络,彻底革新我们记录和分享比赛分数的方式。

简单来说,这是一个基于微控制器(比如ESP32)和电子墨水屏的智能无线记分牌。它的核心功能是:通过Wi-Fi连接到你的手机或电脑,你可以远程、实时地更新比分、比赛时间、队伍名称等信息,而这些信息会清晰地显示在一块超低功耗的电子墨水屏上。想象一下,你坐在场边,用手机轻轻一点,比分就瞬间更新,屏幕上的数字清晰锐利,即使在阳光下也毫不反光,而且一次充电或供电可以持续工作数周甚至数月。这不仅仅是把记分牌“电子化”,更是将其“智能化”和“网络化”,让它成为体育娱乐场景中的一个智能节点。

这个项目适合谁呢?首先,是像我一样的硬件DIY爱好者和创客,它融合了嵌入式开发、无线通信和低功耗显示技术,是一个绝佳的练手项目。其次,是各类体育社团、社区活动中心、学校体育馆的管理者,一个稳定、易用且“有科技感”的记分牌能显著提升活动体验。最后,它甚至适合有孩子的家庭,作为亲子科技手工,一起搭建一个属于自己家庭的比赛计分系统,乐趣无穷。

2. 核心设计思路与方案选型

为什么是“ePaper”加“Wi-Fi”的组合?这背后是一系列针对传统记分牌痛点的精准技术选型。我们需要一个显示清晰、省电、可无线更新、成本可控且易于开发的方案。

2.1 显示核心:为何选择电子墨水屏?

电子墨水屏,或者说电子纸,是这个项目的灵魂。它和我们手机、电脑上常见的LCD或OLED屏幕有本质区别。ePaper本身不发光,而是通过反射环境光来显示内容,其原理是屏幕内含有数百万个微胶囊,里面充满带正负电的黑色和白色粒子,通过施加电压来控制粒子移动,从而形成图像。

这个特性带来了几个决定性的优势,完美契合记分牌的需求:

  1. 极致省电:ePaper只在刷新画面时耗电(毫安级,甚至微安级),一旦画面稳定,即使断电,图像也能保持数月不变。这意味着我们的记分牌可以依靠一块小容量电池或太阳能板长期工作,无需频繁充电或接线。
  2. 阳光下可视性极佳:因为是反射式显示,环境光越强,显示越清晰,完全解决了户外LCD屏幕在阳光下“一片白”的尴尬。
  3. 视觉友好:无背光、无闪烁,观感接近真实纸张,长时间观看不易疲劳。

当然,它也有缺点:刷新率慢(通常需要1-3秒完成一次全刷),且通常只有黑白或三色(黑、白、红)。但对于显示静态或低频更新的比分、时间、文字信息来说,这些缺点几乎可以忽略不计。市面上常见的2.9英寸、4.2英寸或7.5英寸ePaper模块,价格已相当亲民,是理想的选择。

2.2 控制与连接核心:ESP32为何是首选?

有了显示设备,我们需要一个“大脑”来控制它,并连接网络。这里我毫不犹豫地选择了ESP32系列微控制器。相较于经典的Arduino Uno或STM32,ESP32在这个项目中有碾压性的优势:

  1. 内置双模Wi-Fi与蓝牙:这是核心需求。ESP32集成了完整的Wi-Fi堆栈,支持STA(连接路由器)和AP(自建热点)模式,让我们可以轻松实现手机/电脑与记分牌的无线通信。蓝牙则可以用于初次配网或近距离调试。
  2. 强大的处理能力与丰富外设:双核处理器、充足的RAM和Flash,足以流畅运行一个简单的Web服务器或处理MQTT协议,同时驱动ePaper屏幕。它还有足够的GPIO、SPI、I2C等接口,扩展性很强。
  3. 成熟的生态与低成本:基于Arduino或ESP-IDF的开发环境资料海量,社区活跃,遇到问题很容易找到解决方案。模块本身价格低廉,性价比极高。

注意:选择ESP32具体型号时,如ESP32-WROOM-32或ESP32-S3,需注意其Flash大小(建议至少4MB)和引脚布局,确保与你选用的ePaper屏幕的接口(通常是SPI)兼容。

2.3 通信协议选型:HTTP Web Server vs. MQTT

如何实现远程控制?主要有两种主流方案:内置Web服务器,或者使用MQTT协议。

方案一:内置Web服务器ESP32运行一个轻量级的Web服务器(如AsyncWebServer库)。用户手机连接同一个Wi-Fi后,在浏览器输入记分牌的IP地址,就能打开一个控制网页。在网页上点击按钮或输入数字,通过HTTP请求发送给ESP32,ESP32再更新屏幕。

  • 优点:无需安装额外App,跨平台(任何有浏览器的设备都能用),开发相对直观。
  • 缺点:需要设备在同一局域网内,不适合远程(跨互联网)控制。如果路由器设置复杂,用户找IP地址可能有点麻烦。

方案二:MQTT协议ESP32作为一个MQTT客户端,连接到公共或自建的MQTT代理服务器(如EMQX Cloud、阿里云IoT等)。用户通过一个专用的手机App(或通用的MQTT测试工具)发布消息到特定主题,ESP32订阅该主题,收到消息后更新屏幕。

  • 优点:支持真正的远程控制(只要有网),可实现一对多控制(一个手机控制多个记分牌),协议轻量高效。
  • 缺点:需要依赖第三方MQTT服务(可能有费用或稳定性考量),用户需要理解主题(Topic)概念,体验上不如网页直接。

我的选择与理由:对于社区、公司内部等固定场所使用,我更推荐Web Server方案。它的实现更简单,用户无需额外学习,打开浏览器即用,稳定性也完全依赖于本地网络,更可控。本项目的详细实操也将基于此方案展开。当然,如果你需要从公司控制家里的记分牌,MQTT是更好的选择,但那涉及云服务配置,复杂度更高。

3. 硬件准备与电路连接详解

纸上谈兵结束,让我们开始动手。一份清晰的物料清单和接线图是成功的一半。

3.1 物料清单(BOM)

以下清单基于一个中等尺寸(如4.2英寸)的三色(黑、白、红)ePaper屏幕设计,你可以根据需求调整:

类别名称规格/型号数量备注
核心控制器ESP32开发板ESP32 DevKitC V4 或 NodeMCU-32S1确保引脚引出完整,带USB转串口芯片
显示模块电子墨水屏4.2英寸, 分辨率400x300, SPI接口1推荐带驱动板(PCB)的版本,如GDEW042T2
电源模块锂电池充电管理板TP4056 类型1用于电池充电与管理
锂电池3.7V, 2000mAh 或更大1保证长时间续航
升压稳压模块3.7V升5V/3.3V1ePaper和ESP32可能需要3.3V,确保电流足够
结构件塑料或亚克力外壳根据屏幕尺寸定制1保护电路,提升美观度
杜邦线公对公、母对母若干用于连接
其他微动按钮6x6mm 贴片或直插2-3用于本地复位、切换模式等
电阻、电容10K上拉电阻等若干根据电路需要

实操心得:初次尝试,强烈建议购买ePaper屏幕和ESP32的“套装”或“兼容套餐”,卖家通常会提供测试例程和已知可用的接线图,能帮你避开很多驱动兼容性的坑。电池和充电模块如果追求集成度,可以直接选用带充放电保护的18650电池盒。

3.2 电路连接示意图与解析

ePaper屏幕通常通过SPI接口与ESP32通信。以下是典型的接线方式(以常见的4线SPI为例):

ESP32 GPIO -> ePaper 引脚 ----------------------------- GPIO 23 (MOSI) -> DIN (或SDI) // SPI主设备输出,从设备输入 GPIO 19 (MISO) -> DOUT (或SDO) // SPI主设备输入,从设备输出(部分屏幕可能不需要) GPIO 18 (SCK) -> CLK (或SCK) // 时钟信号 GPIO 5 (CS) -> CS (或SS) // 片选,低电平有效 GPIO 17 (DC) -> DC (或D/C) // 数据/命令选择 GPIO 16 (RST) -> RST // 复位引脚,低电平复位 GND -> GND // 共地 3.3V -> VCC // 电源,**务必确认屏幕电压是3.3V!** // 部分大屏需5V,需接升压模块输出。

关键引脚说明与注意事项

  • 电源是重中之重:务必用万用表确认你的ePaper模块的工作电压。多数小尺寸屏是3.3V,但一些7.5英寸屏可能需要5V。接错电压极易永久损坏屏幕!ESP32的3.3V引脚输出电流有限(约500mA),驱动大屏可能力不从心,强烈建议使用独立的3.3V或5V稳压模块,从锂电池取电,分别供给ESP32和屏幕。
  • SPI引脚分配:ESP32的SPI引脚有默认映射(VSPI: MOSI-23, MISO-19, SCK-18; HSPI: MOSI-13, MISO-12, SCK-14)。上表使用了VSPI。在代码中需保持一致。CSDCRST这三个控制引脚可以灵活定义到其他空闲GPIO上,但代码中也要相应修改。
  • 接地共地:所有模块的GND必须连接在一起,这是电路正常工作的基础。
  • 按钮连接:如果需要本地按钮,一端接GPIO,另一端接GND,GPIO端通过一个10K电阻上拉到3.3V(ESP32内部可配置上拉,但外部更可靠)。按下按钮,GPIO变为低电平。

连接时,建议先在面包板上测试,确认所有功能正常后再考虑焊接或使用PCB。

4. 软件实现与核心代码解析

硬件搭好了,接下来是赋予它灵魂的软件部分。我们将基于Arduino框架进行开发,因为它库丰富,上手快。

4.1 开发环境搭建与库安装

  1. 安装Arduino IDE:从官网下载并安装最新版Arduino IDE。
  2. 添加ESP32开发板支持
    • 打开文件->首选项,在“附加开发板管理器网址”中输入:https://espressif.github.io/arduino-esp32/package_esp32_index.json
    • 打开工具->开发板->开发板管理器,搜索“esp32”,安装“Espressif Systems”提供的包。
  3. 安装必要的库
    • GxEPD2:这是一个非常强大且维护活跃的ePaper显示库,支持众多型号。在Arduino IDE的项目->加载库->管理库...中搜索“GxEPD2”并安装。
    • AsyncTCPESPAsyncWebServer:用于构建异步Web服务器,性能好,不阻塞主循环。这两个库可能需要通过GitHub下载ZIP包,然后在IDE中通过项目->加载库->添加.ZIP库...的方式安装。
    • WiFiESPmDNS:ESP32内置,用于Wi-Fi连接和mDNS服务(方便用域名访问,如scoreboard.local)。

4.2 核心代码结构拆解

一个完整的项目代码主要包含以下几个部分:

// 1. 头文件引入 #include <WiFi.h> #include <ESPAsyncWebServer.h> #include <GxEPD2_BW.h> // 根据你的屏幕选择BW(黑白)或3C(三色) #include <GxEPD2_3C.h> #include <Fonts/FreeMonoBold24pt7b.h> // 大字体用于显示分数 // 2. 定义屏幕对象和引脚 // 以4.2英寸三色屏GDEW042T2为例 GxEPD2_3C<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=*/5, /*DC=*/17, /*RST=*/16, /*BUSY=*/4)); // 3. 定义网络和Web服务器对象 const char* ssid = "Your_WiFi_SSID"; const char* password = "Your_WiFi_Password"; AsyncWebServer server(80); // Web服务器监听80端口 // 4. 全局变量存储比分等状态 int scoreA = 0; int scoreB = 0; String teamAName = "TEAM A"; String teamBName = "TEAM B"; int period = 1; // 节次/局数 // 5. 屏幕绘制函数 void updateDisplay() { display.setFullWindow(); display.firstPage(); do { display.setRotation(1); // 根据安装方向调整旋转角度 display.setTextColor(GxEPD_BLACK); display.setFont(&FreeMonoBold24pt7b); // 绘制队伍A名称和分数(左侧) display.setCursor(10, 60); display.println(teamAName); display.setCursor(50, 150); display.println(scoreA); // 绘制中间的冒号或VS display.setFont(&FreeMonoBold9pt7b); display.setCursor(190, 100); display.println("VS"); // 绘制队伍B名称和分数(右侧) display.setFont(&FreeMonoBold24pt7b); display.setCursor(250, 60); display.println(teamBName); display.setCursor(290, 150); display.println(scoreB); // 绘制节次/时间(底部) display.setFont(&FreeMonoBold9pt7b); display.setCursor(150, 250); display.print("Period: "); display.println(period); } while (display.nextPage()); display.hibernate(); // 进入深度休眠,省电! } // 6. 处理HTTP请求的处理器函数 void handleScoreUpdate(AsyncWebServerRequest *request) { if (request->hasParam("team") && request->hasParam("action")) { String team = request->getParam("team")->value(); String action = request->getParam("action")->value(); if (team == "A") { if (action == "inc") scoreA++; else if (action == "dec" && scoreA > 0) scoreA--; else if (action == "reset") scoreA = 0; } else if (team == "B") { if (action == "inc") scoreB++; else if (action == "dec" && scoreB > 0) scoreB--; else if (action == "reset") scoreB = 0; } updateDisplay(); // 更新屏幕 request->send(200, "text/plain", "OK"); } else { request->send(400, "text/plain", "Bad Request"); } } void setup() { Serial.begin(115200); display.init(115200, true, 2, false); // 初始化屏幕 // 连接Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected! IP: " + WiFi.localIP().toString()); // 设置Web服务器路由 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ // 这里可以返回一个简单的控制页面HTML,或者直接处理API request->send(200, "text/html", "<html><body><h1>Score Control</h1><button onclick=\"fetch('/update?team=A&action=inc')\">Team A +1</button></body></html>"); }); server.on("/update", HTTP_GET, handleScoreUpdate); // 处理比分更新 server.on("/setNames", HTTP_GET, [](AsyncWebServerRequest *request){ // 处理设置队名的请求 }); server.begin(); // 启动服务器 // 首次显示 updateDisplay(); } void loop() { // AsyncWebServer是异步的,所以loop可以空着,或者处理其他任务如按钮检测 // 例如:检测本地复位按钮 // if (digitalRead(RESET_BTN_PIN) == LOW) { scoreA=0; scoreB=0; updateDisplay(); delay(200); } }

代码关键点解析

  1. 显示库选择GxEPD2库封装了不同屏幕的驱动,GxEPD2_3C是针对三色屏的类。初始化时传入的引脚定义必须与硬件连接一致。
  2. 省电关键display.hibernate()函数在每次更新后调用,会将屏幕控制器置于最低功耗状态,这是续航长的核心。
  3. 异步Web服务器:使用ESPAsyncWebServer可以非阻塞地处理HTTP请求,这样即使在处理网络请求时,系统也能响应其他事件(如按钮)。
  4. API设计:我们设计了简单的RESTful风格API。例如,访问http://[记分牌IP]/update?team=A&action=inc就会让A队得分加1。前端页面(手机网页)只需通过JavaScript的fetch函数调用这些接口即可。
  5. 前端页面:上面的示例只返回了最简单的HTML。一个实用的做法是,将更美观、功能更全的HTML、CSS、JS文件存放在ESP32的SPIFFS(闪存文件系统)中,Web服务器直接提供这些静态文件,这样控制界面会非常友好。

4.3 构建一个美观的控制界面

将复杂的HTML/CSS/JS代码硬写在Arduino代码里很痛苦。更好的方法是使用SPIFFS

  1. 安装SPIFFS上传工具:在Arduino IDE中,通过“工具” -> “管理库...”安装“ESP32 Sketch Data Upload”插件。
  2. 创建数据文件夹:在你的项目目录下,新建一个名为data的文件夹。
  3. 创建前端文件:在data文件夹内创建index.html,style.css,script.js
    • index.html:包含两个队的名称显示、大号分数、增加/减少/重置按钮、设置队名和节次的表单。
    • script.js:使用fetch函数调用ESP32的API(如/update,/setNames)。
  4. 修改Arduino代码:使用SPIFFS库来提供这些静态文件。
    #include "SPIFFS.h" void setup() { // ... 其他初始化 if(!SPIFFS.begin(true)){ Serial.println("SPIFFS Mount Failed"); return; } // 将根路径映射到index.html server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html"); // ... 定义API路由 }
  5. 上传文件:编写好代码和前端文件后,先编译上传Arduino代码,再通过“工具” -> “ESP32 Sketch Data Upload”将data文件夹内容上传到ESP32的闪存中。

这样,用户连接Wi-Fi后,只需在浏览器输入记分牌的IP地址,就能看到一个全功能的、响应式的控制面板,体验媲美原生App。

5. 系统集成、调试与优化

当硬件和基础软件都准备好后,真正的挑战在于让整个系统稳定、可靠、易用地工作。

5.1 供电系统设计与功耗实测

续航是无线记分牌的关键卖点。我们需要精心设计供电方案。

方案A:锂电池+充电管理+升压稳压(推荐)这是最灵活通用的方案。TP4056模块负责给锂电池安全充电(通过Micro USB)。锂电池输出(3.7V)接一个升压稳压模块,稳定输出3.3V或5V给整个系统供电。

  • 功耗估算
    • ESP32在Wi-Fi连接并运行Web服务器时,工作电流约80-150mA。
    • ePaper在刷新瞬间电流可达50-100mA,但持续时间极短(1-2秒),刷新后进入休眠,电流小于0.1mA。
    • 假设一场比赛2小时,刷新屏幕100次(每次2秒),ESP32持续工作。
    • ESP32耗能:150mA * 2h = 300mAh
    • ePaper刷新耗能:100次 * (100mA * 2s / 3600s/h) ≈ 5.6mAh
    • 总耗能约306mAh
  • 结论:一块2000mAh的锂电池,理论上可以支持6-7场这样的比赛。如果使用深度睡眠(Deep Sleep)模式,在比赛间隙让ESP32休眠,仅由外部按钮或定时器唤醒,续航可以延长数倍。

方案B:USB电源直接供电如果记分牌放置位置有方便的USB插座(如场馆墙壁),这是最简单稳定的方案。使用手机充电器或充电宝即可。无需担心续航。

实操心得:在焊接最终电路前,务必用万用表测量各模块供电电压是否稳定。特别是升压模块的空载和带载电压。我曾遇到一个劣质升压模块,空载输出5V,一带上ESP32就掉到4.2V,导致系统不断重启。建议选择输出电流能力在1A以上的优质模块。

5.2 网络配置与易用性提升

让用户轻松连接网络是个大问题。总不能每次换场地都让用户去改代码里的Wi-Fi SSID和密码吧?

解决方案:Wi-Fi Manager使用像WiFiManager这样的库,可以完美解决。它的原理是:

  1. 首次启动时,ESP32如果无法连接预设的Wi-Fi,会自动进入配网模式(AP模式),创建一个名为“SmartScoreboard-Config”的热点。
  2. 用户用手机连接这个热点,手机会自动弹出或可以手动打开一个引导页面(Captive Portal)。
  3. 在引导页面上,用户可以看到周围可用的Wi-Fi列表,选择自己的网络并输入密码。
  4. ESP32获取凭证后,会自动尝试连接,成功后将这些信息保存到闪存中。
  5. 以后每次启动,ESP32都会自动使用保存的凭证连接网络。

集成WiFiManager后,你的记分牌就具备了“一键配网”的能力,对用户极其友好。

5.3 外壳设计与安装考量

一个好的外壳不仅能保护电路,还能提升产品质感。

  • 3D打印:这是创客的首选。你可以使用Fusion 360或Tinkercad设计一个外壳,留出屏幕开口、按钮孔、充电接口和散热孔。材料建议用PLA或PETG。
  • 亚克力激光切割:如果你有激光切割机资源,亚克力板拼装的外壳看起来非常精致专业。设计好图纸,切割出前面板、后面板和支撑柱,用螺丝或胶水组装。
  • 防水与户外:如果用于户外,需要考虑防水。可以使用防水接线盒,屏幕开口处用透明亚克力板密封,并使用硅胶密封圈。所有接口(如USB)也需使用防水塞。

安装方式

  • 桌面式:直接放在桌子或记分台上。
  • 壁挂式:在外壳背面设计挂孔,使用无痕钉或螺丝固定在墙上。
  • 三脚架式:在外壳底部设计标准1/4英寸螺丝孔,可以安装到小型相机三脚架上,高度和角度可调,非常灵活。

6. 功能扩展与进阶玩法

基础比分显示已经很好用,但这个项目的潜力远不止于此。以下是一些扩展思路,可以让你的记分牌变得更强大。

6.1 集成倒计时与计时器功能

对于篮球、足球等有严格时间规定的比赛,一个倒计时器至关重要。

  • 实现思路:在ESP32上维护一个倒计时变量(单位:秒)。前端页面提供一个设置时间的界面,并开始/暂停/重置按钮。前端通过WebSocket或频繁轮询(每秒一次)从ESP32获取剩余时间并显示。ESP32在loop()中根据状态更新这个变量,并在时间归零时触发某种提示(如让屏幕闪烁一次)。
  • 技术要点:使用WebSocket可以实现前后端时间的实时同步,比HTTP轮询更高效、准确。可以使用WebSocketsServer库。

6.2 多屏幕同步与主从模式

在一个大型场馆,可能需要多个记分牌显示相同内容。

  • 实现思路:指定一个记分牌为“主机”,其他为“从机”。主机通过WebSocket或MQTT,在比分发生变化时,向所有从机广播更新消息。从机收到消息后,更新自己的屏幕。
  • 技术要点:需要为每个记分牌设置唯一的设备ID。主机需要维护一个从机列表。MQTT的发布/订阅模式非常适合这个场景,每个从机订阅一个公共主题(如scoreboard/update),主机发布到此主题即可。

6.3 数据记录与统计

记录每场比赛的详细得分过程,生成简单的统计数据。

  • 实现思路:ESP32在每次比分变化时,将时间戳、队伍、得分动作记录到SPIFFS的一个日志文件中。比赛结束后,可以通过一个特定的网页接口,将日志文件以CSV格式下载到手机或电脑,用Excel进行分析。
  • 技术要点:注意SPIFFS的写入寿命和空间限制。可以定期清理旧日志,或者将数据通过Wi-Fi发送到远程服务器(如私有NAS或云数据库)进行存储。

6.4 添加声音与视觉提示

增加互动性。

  • 声音:接入一个小型无源蜂鸣器或MP3解码模块(如DFPlayer Mini)。当得分或比赛结束时,播放简短的提示音效。
  • 视觉提示:除了屏幕刷新,可以添加一个RGB LED灯带。得分时闪烁队伍颜色,倒计时结束时红色闪烁等。

7. 常见问题排查与维护心得

即使按照教程一步步来,也难免会遇到问题。这里记录了我踩过的一些坑和解决方案。

7.1 屏幕显示异常(全白、全黑、残影)

  • 现象:上电后屏幕全白或全黑,无任何内容;或者刷新后上一屏的内容有残留(鬼影)。
  • 排查
    1. 首先检查电源和接线:99%的显示问题源于此。用万用表测量屏幕VCC和GND之间的电压,确保是准确的3.3V或5V,且连接牢固。检查SPI线序是否正确。
    2. 检查库和型号:确认安装的GxEPD2库支持你的具体屏幕型号。在代码中初始化的类名和引脚定义必须完全匹配。例如,GxEPD2_3C<GxEPD2_420, GxEPD2_420::HEIGHT>是针对4.2英寸三色屏的。
    3. 处理残影:ePaper在长时间显示静态图像后,确实可能留下难以清除的残影。解决方法是定期(比如每刷新20次后)执行一次全刷(Full Refresh),而不是局部刷(Partial Refresh)。在GxEPD2库中,调用display.setFullWindow()display.display(true)true参数代表全刷)即可。全刷时屏幕会先全黑再全白闪一下,这是正常现象。
    4. 初始化顺序:确保在setup()中,先初始化串口(Serial.begin)用于调试,再初始化屏幕(display.init)。有些屏幕对初始化时序有要求。

7.2 Wi-Fi连接不稳定或无法连接

  • 现象:ESP32反复重启,串口打印连接Wi-Fi失败;或者连接后频繁断开。
  • 排查
    1. 信号强度:ESP32的Wi-Fi天线性能一般。确保记分牌放置位置距离路由器不要太远,中间障碍物不要太多。可以用手机在相同位置测试信号强度。
    2. 电源干扰:劣质电源或电机等设备会产生噪声,干扰Wi-Fi模块。尝试用电池供电测试,如果问题消失,说明是电源问题,需要加强电源滤波(如在电源输入端并联一个大电容)。
    3. 路由器设置:有些企业级路由器或设置了复杂MAC过滤、隔离AP模式的路由器,可能导致连接问题。尝试连接到一个普通的家用路由器进行测试。
    4. 代码问题:检查WiFi.begin()后的等待循环是否有超时机制。最好加入一个超时(比如30秒),如果连接不上,则重启或进入配网模式。

7.3 控制网页打开慢或无法打开

  • 现象:手机能找到记分牌的IP,但浏览器打开很慢,或者显示“无法连接”。
  • 排查
    1. mDNS服务:使用ESPmDNS库,可以让用户通过http://scoreboard.local这样的域名访问,避免记忆IP地址。在setup()中添加if (!MDNS.begin("scoreboard")) { Serial.println("Error setting up MDNS responder!"); }
    2. 浏览器缓存:有时是浏览器缓存了旧的错误页面。尝试用无痕模式打开,或清除缓存。
    3. SPIFFS文件缺失:如果你用了SPIFFS提供网页,确保文件已正确上传。可以通过串口监视器查看SPIFFS是否挂载成功,以及请求的文件路径是否正确。
    4. 服务器内存不足:如果网页文件很大,或者同时处理的连接过多,可能导致ESP32内存不足。优化网页资源(压缩图片、精简JS/CSS),使用异步库避免阻塞。

7.4 续航时间远低于预期

  • 现象:新电池用一两场比赛就没电了。
  • 排查
    1. 测量静态电流:将万用表串联到电池供电回路中,在屏幕休眠、Wi-Fi连接但无访问时,测量整机电流。正常应在80-150mA左右(主要是ESP32的Wi-Fi功耗)。如果远高于此,检查是否有其他模块漏电,或者ESP32没有进入正确的Wi-Fi模式(可以考虑在无操作一段时间后让ESP32进入轻睡眠模式)。
    2. 屏幕刷新频率:检查代码是否在loop()中不小心频繁调用了updateDisplay()。屏幕刷新是耗电大户,必须仅在需要时调用。
    3. 电池容量虚标:这是常见问题。购买口碑好的品牌电池。
    4. 升压模块效率:低质量的DC-DC升压模块自身损耗(转换效率)可能很低,比如只有70%,这意味着有30%的电能白白浪费成热量。选择宣称效率在90%以上的模块。

这个项目从构思到实现,最深的体会是,硬件项目的成功在于对细节的掌控。一个松动的接线、一个电压的微小偏差、一行代码的逻辑错误,都可能导致整个系统失灵。但当你看到那块原本静止的墨水屏,因为你在手机上的点击而瞬间变化出新的比分,并且清晰、稳定地展示在那里时,所有的调试和折腾都变得无比值得。它不再是一堆零件,而是一个真正解决了实际问题的智能产品。你可以尝试为它增加更多的功能,比如通过语音控制来加分,或者将比赛数据同步到云端生成统计图表,乐趣和挑战永无止境。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询