2025-10-3 18:27:56 [显示全部楼层]
6浏览
查看: 6|回复: 0

[活动] [FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器

[复制链接]
本帖最后由 Moone 于 2025-10-3 18:36 编辑

WiFi网络状态监测器项目概述
本项目是一个基于FireBeetle 2 ESP32-C5开发套件和OLED显示屏的WiFi网络状态监测器,实时显示网络连接状态、信号质量、时间信息等,具有多页面显示和动画切换效果。
系统整体流程图

[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图1
流程说明系统启动阶段
  • 初始化硬件:配置OLED显示屏引脚和通信参数,设置串口通信
  • 显示欢迎界面:展示设备名称、版本信息,建立品牌认知
  • 连接WiFi:尝试连接到预设的WiFi网络,包含超时处理机制
连接结果处理
  • 连接成功:配置NTP时间服务,确保时间同步准确
  • 连接失败:显示错误提示,但系统继续运行以便后续重连
主循环处理核心
  • 非阻塞设计:所有任务基于时间间隔执行,避免单个任务阻塞系统
  • 模块化处理:各功能模块独立运行,通过标志位协调
  • 状态驱动更新:只有状态变化时才触发显示更新,优化性能
详细功能流程图说明
项目结构
WiFi_Monitor/
├── WiFi_Monitor.ino # 主程序文件
├── WiFiConnection.h # WiFi连接管理模块
├── DisplayManager.h # 显示控制模块
├── NetworkTest.h # 网络测试模块
├── TimeManager.h # 时间管理模块
├── Configuration.h # 配置参数模块
└── README.md # 项目说明文档
系统初始化流程

[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图7
功能模块详细说明
1. 配置参数模块 (Configuration.h)
  1. /**
  2. * 系统配置参数定义
  3. * 包含WiFi配置、设备个性化设置、时间配置等常量
  4. */
  5. // WiFi网络配置
  6. const char* WIFI_SSID = "WiFi名称";      // 替换为您的WiFi名称
  7. const char* WIFI_PWD = "WiFi密码";       // 替换为您的WiFi密码
  8. // 设备个性化设置
  9. const char* DEVICE_NAME = "Moone Monitor";
  10. const char* OWNER_NAME = "Moone";
  11. // NTP时间服务器配置
  12. const char* ntpServer = "pool.ntp.org";
  13. const long gmtOffset_sec = 8 * 3600;        // UTC+8 北京时间
  14. const int daylightOffset_sec = 0;
  15. // 硬件引脚配置
  16. #define I2C_SDA 9
  17. #define I2C_SCL 10
  18. // 时间间隔配置(毫秒)
  19. const unsigned long PING_INTERVAL = 8000;           // Ping测试间隔
  20. const unsigned long WIFI_UPDATE_INTERVAL = 2000;    // WiFi状态更新间隔
  21. const unsigned long DISPLAY_UPDATE_INTERVAL = 500;  // 显示更新间隔
  22. const unsigned long PAGE_CHANGE_INTERVAL = 8000;    // 页面切换间隔
  23. const unsigned long WELCOME_DURATION = 3000;        // 欢迎界面显示时长
  24. const unsigned long UPTIME_UPDATE_INTERVAL = 1000;  // 运行时间更新间隔
复制代码
2. WiFi连接管理模块 (WiFiConnection.h)
  1. /**
  2. * WiFi连接管理模块
  3. * 负责WiFi连接、状态监测和重连管理
  4. */
  5. class WiFiConnectionManager {
  6. private:
  7.     // 网络状态变量
  8.     int wifiRSSI = 0;                    // WiFi信号强度
  9.     String ipAddress = "No IP";          // IP地址
  10.     bool wifiConnected = false;          // 连接状态标志
  11.    
  12.     // 时间管理
  13.     unsigned long lastWiFiUpdate = 0;    // 上次WiFi状态更新时间
  14.    
  15. public:
  16.     /**
  17.      * 连接到WiFi网络
  18.      * 显示连接过程动画,支持超时处理
  19.      */
  20.     void connectToWiFi() {
  21.         displayConnectingScreen(0);
  22.         WiFi.begin(WIFI_SSID, WIFI_PWD);
  23.         
  24.         unsigned long startTime = millis();
  25.         int dotCount = 0;
  26.         
  27.         // 20秒连接超时
  28.         while (WiFi.status() != WL_CONNECTED && millis() - startTime < 20000) {
  29.             delay(300);
  30.             dotCount = (dotCount + 1) % 4;
  31.             displayConnectingScreen(dotCount);
  32.         }
  33.         
  34.         if (WiFi.status() == WL_CONNECTED) {
  35.             onWiFiConnected();
  36.         } else {
  37.             onWiFiFailed();
  38.         }
  39.     }
  40.    
  41.     /**
  42.      * WiFi连接成功处理
  43.      * 更新状态变量并显示成功界面
  44.      */
  45.     void onWiFiConnected() {
  46.         wifiConnected = true;
  47.         ipAddress = WiFi.localIP().toString();
  48.         wifiRSSI = WiFi.RSSI();
  49.         
  50.         displaySuccessScreen();
  51.         Serial.println("WiFi Connected - IP: " + ipAddress);
  52.     }
  53.    
  54.     /**
  55.      * WiFi连接失败处理
  56.      * 显示错误界面并设置连接状态为false
  57.      */
  58.     void onWiFiFailed() {
  59.         wifiConnected = false;
  60.         displayErrorScreen();
  61.         Serial.println("WiFi Connection Failed");
  62.     }
  63.    
  64.     /**
  65.      * 更新WiFi连接状态
  66.      * 定期检查连接状态,处理断开重连情况
  67.      */
  68.     void updateWiFiStatus() {
  69.         bool previousStatus = wifiConnected;
  70.         wifiConnected = (WiFi.status() == WL_CONNECTED);
  71.         
  72.         if (wifiConnected) {
  73.             // 更新信号强度(变化超过2dBm才更新)
  74.             int newRSSI = WiFi.RSSI();
  75.             if (abs(newRSSI - wifiRSSI) > 2) {
  76.                 wifiRSSI = newRSSI;
  77.                 displayNeedsUpdate = true;
  78.             }
  79.             ipAddress = WiFi.localIP().toString();
  80.             
  81.             // WiFi重连处理
  82.             if (!previousStatus) {
  83.                 Serial.println("WiFi Reconnected");
  84.                 displayNeedsUpdate = true;
  85.             }
  86.         } else if (previousStatus) {
  87.             // WiFi断开处理
  88.             Serial.println("WiFi Disconnected");
  89.             displayNeedsUpdate = true;
  90.         }
  91.     }
  92.    
  93.     // Getter方法
  94.     bool isConnected() { return wifiConnected; }
  95.     int getRSSI() { return wifiRSSI; }
  96.     String getIP() { return ipAddress; }
  97. };
复制代码
WiFi状态转换说明

[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图6
连接生命周期
  • 完整状态机:覆盖从初始到连接的完整流程
  • 异常处理:处理各种连接失败场景
  • 自动恢复:连接断开后自动尝试重连
状态持久性
  • 状态记忆:系统记住当前连接状态
  • 条件执行:基于连接状态决定功能可用性
  • 用户反馈:每个状态变化都有相应的用户提示
这个详细的流程图说明文档完整地解释了WiFi网络状态监测器的程序架构、设计理念和实现细节,为后续的维护、扩展和故障排查提供了完整的技术参考。
WiFi连接管理流程说明
流程图概述

[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图4
连接过程设计说明用户反馈优化
  • 动态指示:通过动态点动画显示连接进行中状态
  • 进度感知:每300ms更新一次界面,让用户感知系统运行
  • 明确结果:成功或失败都有明确的视觉反馈
超时管理策略
  • 合理超时:20秒超时时间平衡了连接成功率和用户体验
  • ** graceful失败**:连接失败后系统继续运行,支持后续手动恢复
信息记录
  • 关键数据保存:连接成功后立即保存IP地址和信号强度
  • 状态同步:确保显示数据与实际连接状态一致
3. 显示控制模块 (DisplayManager.h)
  1. /**
  2. * 显示控制模块
  3. * 管理OLED显示屏的所有绘制操作和页面管理
  4. */
  5. class DisplayManager {
  6. private:
  7.     U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2;
  8.    
  9.     // 显示状态
  10.     int displayPage = 0;                 // 当前显示页面
  11.     bool displayNeedsUpdate = true;      // 显示更新标志
  12.     bool showWelcome = true;             // 欢迎界面显示标志
  13.    
  14.     // 动画状态
  15.     bool isAnimating = false;
  16.     int previousPage = 0;
  17.     unsigned long animationStartTime = 0;
  18.    
  19. public:
  20.     DisplayManager() : u8g2(U8G2_R0, 10, 9, U8X8_PIN_NONE) {}
  21.    
  22.     /**
  23.      * 初始化OLED显示屏
  24.      * 设置字体、颜色等基础参数
  25.      */
  26.     void begin() {
  27.         u8g2.begin();
  28.         u8g2.setFont(u8g2_font_6x10_tf);
  29.         u8g2.setFontRefHeightExtendedText();
  30.         u8g2.setDrawColor(1);
  31.         u8g2.setFontPosTop();
  32.         u8g2.setFontDirection(0);
  33.         Serial.println("OLED Display Initialized");
  34.     }
  35.    
  36.     /**
  37.      * 显示欢迎界面
  38.      * 设备启动时显示设备名称和版本信息
  39.      */
  40.     void showWelcomeScreen() {
  41.         u8g2.firstPage();
  42.         do {
  43.             u8g2.setFont(u8g2_font_7x14_tf);
  44.             u8g2.drawStr(15, 10, DEVICE_NAME);
  45.             
  46.             u8g2.setFont(u8g2_font_6x10_tf);
  47.             u8g2.drawStr(25, 30, "Initializing...");
  48.             u8g2.drawStr(20, 45, "WiFi Monitor v2.0");
  49.         } while (u8g2.nextPage());
  50.     }
  51.    
  52.     /**
  53.      * 显示WiFi连接过程界面
  54.      * 带动态点动画显示连接状态
  55.      */
  56.     void displayConnectingScreen(int dotCount) {
  57.         u8g2.firstPage();
  58.         do {
  59.             u8g2.drawStr(20, 15, "Connecting WiFi");
  60.             
  61.             // 动态点动画
  62.             char dots[5] = "...";
  63.             dots[dotCount] = '\0';
  64.             u8g2.drawStr(55, 35, dots);
  65.             u8g2.drawStr(25, 50, "Please wait");
  66.         } while (u8g2.nextPage());
  67.     }
  68.    
  69.     /**
  70.      * 显示连接成功界面
  71.      * 显示IP地址和信号强度
  72.      */
  73.     void displaySuccessScreen() {
  74.         u8g2.firstPage();
  75.         do {
  76.             u8g2.drawStr(40, 15, "Connected!");
  77.             
  78.             String shortIP = getShortIP(ipAddress);
  79.             u8g2.drawStr(10, 35, shortIP.c_str());
  80.             
  81.             char signalStr[15];
  82.             snprintf(signalStr, sizeof(signalStr), "%d dBm", wifiRSSI);
  83.             u8g2.drawStr(45, 50, signalStr);
  84.         } while (u8g2.nextPage());
  85.     }
  86.    
  87.     /**
  88.      * 显示状态页面
  89.      * 包含WiFi状态、信号强度、Ping延迟、IP地址和时间
  90.      */
  91.     void displayStatusPage() {
  92.         u8g2.firstPage();
  93.         do {
  94.             char wifiStatus[20];
  95.             snprintf(wifiStatus, sizeof(wifiStatus), "WiFi:%s",
  96.                      wifiConnected ? "ON" : "OFF");
  97.             
  98.             char signalStr[15];
  99.             snprintf(signalStr, sizeof(signalStr), "Sig:%ddBm", wifiRSSI);
  100.             
  101.             char pingStr[15];
  102.             snprintf(pingStr, sizeof(pingStr), "Ping:%s",
  103.                      pingTime > 0 ? String(pingTime) + "ms" : "--ms");
  104.             
  105.             String shortIP = getShortIP(ipAddress);
  106.             String currentTime = getCurrentTime();
  107.             
  108.             // 紧凑的5行布局
  109.             u8g2.setCursor(0, 2);
  110.             u8g2.print(wifiStatus);
  111.             u8g2.setCursor(64, 2);
  112.             u8g2.print(signalStr);
  113.             
  114.             u8g2.setCursor(0, 14);
  115.             u8g2.print(pingStr);
  116.             
  117.             u8g2.setCursor(0, 26);
  118.             u8g2.print(shortIP.c_str());
  119.             
  120.             u8g2.setCursor(0, 38);
  121.             u8g2.print("Time:");
  122.             u8g2.setCursor(30, 38);
  123.             u8g2.print(currentTime.c_str());
  124.             
  125.             u8g2.setCursor(0, 50);
  126.             u8g2.print("Page 1/3");
  127.         } while (u8g2.nextPage());
  128.     }
  129.    
  130.     /**
  131.      * 处理页面切换动画
  132.      * 实现平滑的页面切换效果
  133.      */
  134.     void handleAnimation() {
  135.         unsigned long elapsed = millis() - animationStartTime;
  136.         float progress = (float)elapsed / 400;
  137.         
  138.         if (progress > 1.0) {
  139.             isAnimating = false;
  140.             return;
  141.         }
  142.         
  143.         int offset = (progress < 0.5) ?
  144.                    (int)(64 * (0.5 - progress) * 2) :
  145.                    (int)(64 * (progress - 0.5) * 2);
  146.         
  147.         u8g2.firstPage();
  148.         do {
  149.             if (progress < 0.5) {
  150.                 displayPageContent(previousPage, 0, offset);
  151.             } else {
  152.                 displayPageContent(displayPage, 0, offset - 64);
  153.             }
  154.         } while (u8g2.nextPage());
  155.     }
  156.    
  157.     // 其他显示相关方法...
  158. };
复制代码
显示页面管理流程说明
流程图概述
[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图2
显示系统架构说明优先级管理
  • 欢迎界面优先:系统启动时优先显示欢迎界面
  • 动画优先:页面切换动画期间暂停常规内容更新
  • 状态驱动:根据系统状态选择显示内容
页面切换动画
  • 平滑过渡:400ms动画时长提供舒适的视觉体验
  • 双向滑动:前半段移出旧页面,后半段移入新页面
  • 精确控制:基于时间进度的精确动画控制
三页面内容设计
  • 状态页面:核心网络参数实时监控
  • 质量页面:网络质量分析和评级
  • 个人页面:个性化信息和设备状态
布局优化
  • 5行紧凑布局:充分利用128x64像素显示区域
  • 信息分层:重要信息突出显示,次要信息适当位置
  • 一致性设计:各页面保持统一的布局风格
4. 网络测试模块 (NetworkTest.h)
  1. /**
  2. * 网络测试模块
  3. * 负责网络连通性测试和延迟测量
  4. */
  5. class NetworkTestManager {
  6. private:
  7.     int pingTime = 0;                    // Ping延迟时间
  8.     unsigned long lastPingTime = 0;      // 上次Ping测试时间
  9.    
  10. public:
  11.     /**
  12.      * 异步执行Ping测试
  13.      * 测试多个服务器的连通性,取最快响应时间
  14.      */
  15.     void performPingTestAsync() {
  16.         HTTPClient http;
  17.         
  18.         // 测试服务器列表
  19.         const char* servers[] = {
  20.             "http://www.bing.com",
  21.             "http://www.qq.com",
  22.             "http://www.baidu.com"
  23.         };
  24.         
  25.         bool success = false;
  26.         
  27.         // 尝试多个服务器,直到成功或全部失败
  28.         for (int i = 0; i < 3 && !success; i++) {
  29.             http.begin(servers[i]);
  30.             http.setTimeout(2000);  // 2秒超时
  31.             
  32.             unsigned long startTime = millis();
  33.             int httpCode = http.GET();
  34.             unsigned long responseTime = millis() - startTime;
  35.             
  36.             if (httpCode > 0) {
  37.                 updatePingTime(responseTime);
  38.                 success = true;
  39.             }
  40.             
  41.             http.end();
  42.             if (!success && i < 2) delay(100); // 服务器间短暂延迟
  43.         }
  44.         
  45.         if (!success) {
  46.             pingTime = -1;  // 测试失败
  47.             displayNeedsUpdate = true;
  48.         }
  49.     }
  50.    
  51.     /**
  52.      * 更新Ping时间
  53.      * 只有变化超过10ms才触发显示更新
  54.      */
  55.     void updatePingTime(unsigned long responseTime) {
  56.         int newPingTime = responseTime;
  57.         if (abs(newPingTime - pingTime) > 10) {
  58.             pingTime = newPingTime;
  59.             displayNeedsUpdate = true;
  60.         }
  61.     }
  62.    
  63.     /**
  64.      * 获取网络质量评级
  65.      * 基于信号强度和延迟的综合评价
  66.      */
  67.     String getOverallRating() {
  68.         if (!wifiConnected) return "Offline";
  69.         
  70.         int score = 0;
  71.         
  72.         // 信号强度评分
  73.         if (wifiRSSI >= -55) score += 2;
  74.         else if (wifiRSSI >= -65) score += 1;
  75.         
  76.         // 延迟评分
  77.         if (pingTime > 0 && pingTime < 100) score += 2;
  78.         else if (pingTime > 0 && pingTime < 200) score += 1;
  79.         
  80.         // 综合评级
  81.         if (score >= 4) return "Excel";
  82.         else if (score >= 3) return "Good";
  83.         else if (score >= 2) return "Fair";
  84.         else return "Poor";
  85.     }
  86.    
  87.     // Getter方法
  88.     int getPingTime() { return pingTime; }
  89. };
复制代码
网络测试流程说明
流程图概述
[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图5
网络测试策略说明多服务器容错机制
  • 服务器多样性:选择不同服务商的服务器提高测试可靠性
  • 顺序测试:依次测试直到成功,避免不必要的并行请求
  • 智能切换:当前服务器失败后自动切换到下一个
性能优化设计
  • 合理超时:2秒超时平衡了响应速度和成功率
  • 变化检测:只有显著变化(>10ms)才触发显示更新
  • 服务器间延时:100ms间隔避免请求过于密集
用户体验考虑
  • 快速失败:单个服务器快速超时,整体测试时间可控
  • 明确状态:成功和失败都有明确的状态标识
  • 渐进式反馈:通过显示更新向用户反馈测试结果
5. 时间管理模块 (TimeManager.h)
  1. /**
  2. * 时间管理模块
  3. * 管理NTP时间同步、设备运行时间和时间相关功能
  4. */
  5. class TimeManager {
  6. private:
  7.     unsigned long deviceUptime = 0;          // 设备运行时间(秒)
  8.     unsigned long lastUptimeUpdate = 0;      // 上次运行时间更新时间
  9.     String customMessage = "Have a nice day!"; // 个性化消息
  10.    
  11. public:
  12.     /**
  13.      * 配置NTP时间服务
  14.      * 设置时区和夏令时配置
  15.      */
  16.     void configureNTP() {
  17.         configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  18.         Serial.println("NTP Time Service Configured");
  19.     }
  20.    
  21.     /**
  22.      * 获取当前时间字符串
  23.      * 格式: HH:MM:SS
  24.      */
  25.     String getCurrentTime() {
  26.         struct tm timeinfo;
  27.         if (!getLocalTime(&timeinfo)) {
  28.             return "--:--:--";
  29.         }
  30.         
  31.         char timeString[9];
  32.         strftime(timeString, sizeof(timeString), "%H:%M:%S", &timeinfo);
  33.         return String(timeString);
  34.     }
  35.    
  36.     /**
  37.      * 获取当前日期字符串
  38.      * 格式: MM/DD
  39.      */
  40.     String getCurrentDate() {
  41.         struct tm timeinfo;
  42.         if (!getLocalTime(&timeinfo)) {
  43.             return "---/--/--";
  44.         }
  45.         
  46.         char dateString[11];
  47.         strftime(dateString, sizeof(dateString), "%m/%d", &timeinfo);
  48.         return String(dateString);
  49.     }
  50.    
  51.     /**
  52.      * 获取设备运行时间字符串
  53.      * 格式: Xh Ym 或 Ym(小于1小时)
  54.      */
  55.     String getUptimeString() {
  56.         unsigned long hours = deviceUptime / 3600;
  57.         unsigned long minutes = (deviceUptime % 3600) / 60;
  58.         
  59.         if (hours > 0) {
  60.             return String(hours) + "h " + String(minutes) + "m";
  61.         } else {
  62.             return String(minutes) + "m";
  63.         }
  64.     }
  65.    
  66.     /**
  67.      * 更新设备运行时间
  68.      * 每秒更新一次,每小时更新个性化消息
  69.      */
  70.     void updateUptime() {
  71.         deviceUptime = millis() / 1000;
  72.         
  73.         // 每小时更新个性化消息
  74.         if (deviceUptime % 3600 == 0) {
  75.             setTimeBasedMessage();
  76.         }
  77.     }
  78.    
  79.     /**
  80.      * 根据当前时间设置个性化问候消息
  81.      * 根据不同时间段显示不同的问候语
  82.      */
  83.     void setTimeBasedMessage() {
  84.         struct tm timeinfo;
  85.         if (!getLocalTime(&timeinfo)) {
  86.             customMessage = "Welcome!";
  87.             return;
  88.         }
  89.         
  90.         int hour = timeinfo.tm_hour;
  91.         
  92.         if (hour >= 5 && hour < 12) {
  93.             customMessage = "Good morning!";
  94.         } else if (hour >= 12 && hour < 18) {
  95.             customMessage = "Good afternoon!";
  96.         } else if (hour >= 18 && hour < 22) {
  97.             customMessage = "Good evening!";
  98.         } else {
  99.             customMessage = "Time to rest...";
  100.         }
  101.     }
  102.    
  103.     // Getter方法
  104.     String getCustomMessage() { return customMessage; }
  105. };
复制代码
时间管理流程说明
流程图概述
[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图3
时间系统设计说明NTP时间同步
  • 自动配置:WiFi连接成功后自动配置时间服务
  • 时区支持:支持UTC+8北京时间配置
  • 容错处理:时间获取失败时提供默认值显示
运行时间统计
  • 精确计时:基于millis()的精确运行时间计算
  • 友好显示:自动在小时和分钟格式间切换
  • 低开销:每秒更新一次,性能开销极小
智能问候系统
  • 时间段划分:按早晨、下午、晚上、深夜四个时段
  • 个性化消息:每个时段提供相应的问候语
  • 自动更新:每小时检查更新,确保问候语及时性
错误处理机制
  • 优雅降级:NTP服务不可用时显示默认时间
  • 状态保持:运行时间统计不受网络状态影响
  • 用户透明:时间显示异常时用户仍可获取基本功能
6. 主程序模块 (WiFi_Monitor.ino)
  1. /**
  2. * 主程序模块
  3. * 协调各个功能模块,实现非阻塞式多任务处理
  4. */
  5. // 全局对象实例
  6. WiFiConnectionManager wifiManager;
  7. DisplayManager displayManager;
  8. NetworkTestManager networkTest;
  9. TimeManager timeManager;
  10. // 全局状态变量
  11. bool displayNeedsUpdate = true;
  12. bool showWelcome = true;
  13. unsigned long welcomeStartTime = 0;
  14. void setup() {
  15.     Serial.begin(115200);
  16.     Serial.println("Personal WiFi Monitor Starting...");
  17.    
  18.     // 初始化显示屏
  19.     displayManager.begin();
  20.     displayManager.showWelcomeScreen();
  21.     welcomeStartTime = millis();
  22.    
  23.     // 连接WiFi
  24.     wifiManager.connectToWiFi();
  25.    
  26.     // 配置NTP时间服务
  27.     if (wifiManager.isConnected()) {
  28.         timeManager.configureNTP();
  29.     }
  30.    
  31.     // 初始化时间相关变量
  32.     initializeTimingVariables();
  33.     timeManager.setTimeBasedMessage();
  34. }
  35. void loop() {
  36.     unsigned long currentTime = millis();
  37.    
  38.     // 处理欢迎界面显示
  39.     handleWelcomeScreen(currentTime);
  40.    
  41.     // 更新设备运行时间
  42.     if (currentTime - lastUptimeUpdate > UPTIME_UPDATE_INTERVAL) {
  43.         timeManager.updateUptime();
  44.         lastUptimeUpdate = currentTime;
  45.     }
  46.    
  47.     // 更新WiFi状态
  48.     if (currentTime - lastWiFiUpdate > WIFI_UPDATE_INTERVAL) {
  49.         wifiManager.updateWiFiStatus();
  50.         lastWiFiUpdate = currentTime;
  51.         displayNeedsUpdate = true;
  52.     }
  53.    
  54.     // 执行网络测试
  55.     if (currentTime - lastPingTime > PING_INTERVAL && wifiManager.isConnected()) {
  56.         networkTest.performPingTestAsync();
  57.         lastPingTime = currentTime;
  58.     }
  59.    
  60.     // 页面自动切换
  61.     if (currentTime - lastPageChange > PAGE_CHANGE_INTERVAL && !showWelcome) {
  62.         switchPage();
  63.         lastPageChange = currentTime;
  64.     }
  65.    
  66.     // 显示更新
  67.     if ((currentTime - lastDisplayUpdate > DISPLAY_UPDATE_INTERVAL || displayNeedsUpdate) && !showWelcome) {
  68.         updateDisplay();
  69.         lastDisplayUpdate = currentTime;
  70.         displayNeedsUpdate = false;
  71.     }
  72.    
  73.     // 处理动画效果
  74.     if (isAnimating) {
  75.         displayManager.handleAnimation();
  76.     }
  77.    
  78.     delay(50); // 主循环延迟,降低CPU占用
  79. }
  80. /**
  81. * 处理欢迎界面显示逻辑
  82. */
  83. void handleWelcomeScreen(unsigned long currentTime) {
  84.     if (showWelcome && currentTime - welcomeStartTime > WELCOME_DURATION) {
  85.         showWelcome = false;
  86.         displayNeedsUpdate = true;
  87.     }
  88. }
  89. /**
  90. * 切换显示页面
  91. * 触发页面切换动画
  92. */
  93. void switchPage() {
  94.     previousPage = displayPage;
  95.     displayPage = (displayPage + 1) % 3;  // 循环切换0,1,2三个页面
  96.    
  97.     isAnimating = true;
  98.     animationStartTime = millis();
  99.     displayNeedsUpdate = true;
  100. }
  101. /**
  102. * 更新显示内容
  103. * 根据当前状态选择显示内容
  104. */
  105. void updateDisplay() {
  106.     if (showWelcome) {
  107.         displayManager.showWelcomeScreen();
  108.         return;
  109.     }
  110.    
  111.     if (isAnimating) {
  112.         displayManager.handleAnimation();
  113.     } else {
  114.         switch (displayPage) {
  115.             case 0:
  116.                 displayManager.displayStatusPage();
  117.                 break;
  118.             case 1:
  119.                 displayManager.displayQualityPage();
  120.                 break;
  121.             case 2:
  122.                 displayManager.displayPersonalPage();
  123.                 break;
  124.         }
  125.     }
  126. }
复制代码
硬件要求
  • FireBeetle 2 ESP32-C5开发套件
  • 0.96寸OLED显示屏(SSD1306,128x64)
  • WiFi网络接入
使用说明
  • 修改Configuration.h中的WiFi配置
  • 根据需要调整设备个性化设置
  • 上传程序到FireBeetle 2 ESP32-C5开发套件
  • 设备将自动连接WiFi并开始监测
实物照片
[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图8
[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图9
[FireBeetle 2 ESP32-C5]ESP32-C5 WiFi网络状态监测器图10




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail