
/* * ============================================ * 第十二步:按键确认功能集成 * ============================================ * 将按键检测与提醒系统关联,实现确认机制 *//** * 处理按键确认 * 当有激活的提醒时,按键按下可确认该提醒 */void handleButtonConfirm() { if (!isButtonPressed()) return; // 无按键,直接返回 Serial.println("🖱️ 按键检测到按下"); // 查找当前激活的提醒(按优先级,先触发的先确认) int activeIndex = -1; for (int i = 0; i < NUM_REMINDERS; i++) { if (reminderActive[i]) { activeIndex = i; break; // 找到第一个激活的提醒 } } if (activeIndex != -1) { // 确认该提醒 confirmed[activeIndex] = true; // 标记为已确认 reminderActive[activeIndex] = false; // 取消激活状态 // 切换到确认状态,绿灯提示 ledState = LED_CONFIRM; confirmStartTime = millis(); setAllLEDs(strip.Color(0, 255, 0)); // 立即显示绿色 Serial.printf("✅ 提醒%d已确认,今日不再提示\n", activeIndex + 1); } else { Serial.println("ℹ️ 无激活的提醒,按键无效"); // 可选:黄灯闪烁提示无提醒状态 setAllLEDs(strip.Color(255, 255, 0)); delay(500); clearLEDs(); }}void loop() { updateTime(); checkDayReset(); checkReminders(); handleButtonConfirm(); // 处理按键 handleLED(); delay(10);}🧪 即时测试:触发提醒后按按键,应看到红灯停止、绿灯亮2秒
主备教师A带领学生将前面所有代码片段整合为完整程序,重点检查:
#include是否完整关键整合点检查清单:
关键整合点检查清单:
/* * ============================================ * 完整代码结构检查清单 * ============================================ */// 1. 库引入(按依赖顺序)#include <WiFi.h>#include <NTPClient.h>#include <WiFiUdp.h>#include <Adafruit_NeoPixel.h>// 2. 硬件定义#define BUTTON_PIN 4#define LED_PIN 2#define NUM_LEDS 10// 3. 网络配置const char* ssid = "..."; const char* password = "...";const long utcOffset = 8 * 3600;// 4. 提醒配置const int reminderHours[] = {8, 20};const int reminderMins[] = {0, 0};// 5. 对象实例化WiFiUDP ntpUDP;NTPClient timeClient(...);Adafruit_NeoPixel strip(...);// 6. 状态变量bool reminderActive[NUM_REMINDERS];bool confirmed[NUM_REMINDERS];int lastDay;enum LedState { LED_IDLE, LED_REMIND, LED_CONFIRM };LedState ledState;// 7. 函数声明(按调用顺序排列)void setAllLEDs(uint32_t color);void clearLEDs();bool isButtonPressed();void updateTime();void checkReminders();void handleLED();void handleButtonConfirm();// 8. setup() 和 loop()教师B和教师C协助学生进行测试:
测试场景 | 预期行为 | 验证方法 |
正常提醒触发 | 红灯闪烁,按键后变绿 | 设置提醒为当前时间+1分钟 |
重复按键 | 只响应第一次,后续忽略 | 连续快速按键 |
跨日期测试 | 0点后自动恢复提醒 | 修改系统时间或等待 |
WiFi断开 | 串口提示错误,红灯警示 | 关闭路由器 |
提前确认 | 未到时间按键,黄灯提示 | 任意时刻按按键 |
优化建议代码:
/* * ============================================ * 优化1:增加调试模式 * ============================================ */#define DEBUG_MODE true // 设为false关闭调试输出#if DEBUG_MODE #define DEBUG_PRINT(x) Serial.print(x) #define DEBUG_PRINTLN(x) Serial.println(x) #define DEBUG_PRINTF(...) Serial.printf(__VA_ARGS__)#else #define DEBUG_PRINT(x) #define DEBUG_PRINTLN(x) #define DEBUG_PRINTF(...)#endif/* * ============================================ * 优化2:低功耗模式(可选扩展) * ============================================ * 非提醒时段可进入light sleep节省电量 */#include <esp_sleep.h>void enterLightSleep() { // 计算到下一个提醒的时间,设置定时唤醒 // 适合电池供电场景}教师A(主讲) → 演示编码 + 实时测试 ↓教师B(观察) → 记录学生操作错误,实时提醒 ↓教师C(协助) → 个别指导操作困难的学生课时1任务单:
□ 成功安装Adafruit_NeoPixel库□ 完成LED三色自检,拍照记录□ 修改代码实现按键按下亮蓝灯□ 挑战:实现彩虹色渐变效果现象 | 可能原因 | 解决方案 |
LED不亮 | 引脚接错/供电不足 | 检查GPIO2接线,确认5V供电 |
串口乱码 | 波特率不匹配 | 检查 |
WiFi连不上 | 密码错误/信号弱 | 串口打印WiFi.status()查看错误码 |
时间不对 | 时区偏移错误 | 确认utcOffset = 8 * 3600 |
提醒不触发 | 数组索引越界 | 检查NUM_REMINDERS计算是否正确 |
点击展开完整代码(供教师参考,不建议直接给学生)
教案设计遵循"低起点、小步子、多活动、快反馈"的教学原则
本文标签:#少儿编程 #科创 #电子爱好者 #物联网 #arduino #ESP32
![]() | ![]() | ![]() |
关注我们,方便学习和答疑