
/* * ============================================ * 第五步:WiFi网络连接 * ============================================ * 使用ESP32内置WiFi库,连接指定AP获取网络访问 */#include <WiFi.h> // ESP32内置WiFi库// WiFi连接参数 - 根据实际网络修改const char* ssid = "Chinanet-2.4G-6E80"; // WiFi名称const char* password = "1111"; // WiFi密码/** * 初始化并连接WiFi * 带有超时检测,避免无限等待 * * @return true-连接成功, false-连接失败 */bool initWiFi() { Serial.println("\n📡 开始连接WiFi..."); Serial.print("目标网络: "); Serial.println(ssid); WiFi.begin(ssid, password); // 启动WiFi连接 int attempts = 0; // 尝试次数计数器 const int MAX_ATTEMPTS = 30; // 最大尝试次数(15秒超时) // 等待连接,最多尝试30次(每次500ms) while (WiFi.status() != WL_CONNECTED && attempts < MAX_ATTEMPTS) { delay(500); Serial.print("."); // 进度指示 attempts++; } if (WiFi.status() == WL_CONNECTED) { Serial.println("\n✅ WiFi连接成功!"); Serial.print("📍 IP地址: "); Serial.println(WiFi.localIP()); // 打印分配的IP return true; } else { Serial.println("\n❌ WiFi连接失败!请检查:"); Serial.println(" 1. WiFi名称和密码是否正确"); Serial.println(" 2. 网络信号是否可用"); Serial.println(" 3. 路由器是否开启"); return false; }}void setup() { // ... 前面的LED和按键初始化 ... // 连接网络 bool wifiOK = initWiFi(); if (!wifiOK) { // 连接失败时的处理:红灯警示 Serial.println("进入离线模式..."); setAllLEDs(strip.Color(255, 0, 0)); delay(3000); clearLEDs(); }}🧪 即时测试:上传后观察串口输出,确认IP地址获取成功
/* * ============================================ * 第六步:NTP网络时间同步 * ============================================ * NTP (Network Time Protocol): 网络时间协议 * 用于从互联网时间服务器获取标准UTC时间 */#include <NTPClient.h> // NTP客户端库(需库管理器安装)#include <WiFiUdp.h> // UDP通信基础库(ESP32内置)// 时区设置:中国使用UTC+8const long utcOffset = 8 * 3600; // 8小时的秒数偏移// UDP实例,用于NTP通信WiFiUDP ntpUDP;// NTP客户端配置// 参数1: UDP实例, 参数2: NTP服务器地址, 参数3: 时区偏移(秒)NTPClient timeClient(ntpUDP, "ntp.aliyun.com", utcOffset);/** * 初始化NTP时间服务 */void initNTP() { Serial.println("\n⏰ 初始化NTP时间服务..."); timeClient.begin(); // 启动NTP客户端 timeClient.forceUpdate(); // 强制立即同步时间(阻塞式) Serial.println("NTP初始化完成"); Serial.print("当前时间(UTC+8): "); Serial.println(timeClient.getFormattedTime());}🧪 即时测试:串口应显示当前北京时间(格式:HH:MM:SS)
/* * ============================================ * 第七步:时间数据解析与应用 * ============================================ * 将epoch时间转换为年月日时分秒,便于逻辑判断 */// 时间变量(全局,方便各函数访问)int currentHour = 0; // 当前小时 0-23int currentMinute = 0; // 当前分钟 0-59int currentDay = 0; // 当前日期 1-31/** * 更新并解析当前时间 * 从NTP客户端获取时间,分解为可用的时间分量 */void updateTime() { timeClient.update(); // 先更新NTP时间 // 获取Unix时间戳(自1970年1月1日以来的秒数) unsigned long epoch = timeClient.getEpochTime(); // 将epoch转换为tm结构体(包含年月日时分秒) // gmtime需要time_t指针,进行类型转换 struct tm *ptm = gmtime((time_t*)&epoch); // 提取时间分量(tm_hour已包含时区偏移) currentHour = ptm->tm_hour; currentMinute = ptm->tm_min; currentDay = ptm->tm_mday; // 串口输出当前时间(调试用) static unsigned long lastPrint = 0; if (millis() - lastPrint >= 1000) { // 每秒打印一次 lastPrint = millis(); Serial.printf("🕐 %02d:%02d | 日期: %d日\n", currentHour, currentMinute, currentDay); }}void loop() { // 主循环中持续更新时间 updateTime(); // 其他业务逻辑... delay(100); // 短暂延时,避免过于频繁的NTP请求}🧪 即时测试:串口应每秒输出当前时间,验证时区是否正确(应为北京时间)
pool.ntp.org)本文标签:#少儿编程 #科创 #电子爱好者 #物联网 #arduino #ESP32
![]() | ![]() | ![]() |
关注我们,方便学习和答疑