、
arduino单独代码
#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <TimeLib.h>
#include <TaskScheduler.h>
// WiFi配置
const char* ssid = "CMCC-yaoyao";
const char* password = "love123456";
// NTP配置
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 8 * 3600, 60000);
// 任务调度器
Scheduler runner;
// 任务结构体 - 添加倒计时相关字段
struct ScheduledTask {
String name;
int triggerDay;
int triggerHour;
int triggerMinute;
bool isRecurring;
bool hasExecuted;
Task* task;
void (*callback)();
bool isCountdown;
unsigned long countdownSeconds;
unsigned long startTime; // 任务开始时间(毫秒)
unsigned long scheduledTime; // 计划执行时间(毫秒)
};
// 任务回调函数声明
void mondayTaskCallback();
void tuesdayTaskCallback();
void countdownTaskCallback();
// 创建任务
ScheduledTask mondayTask = {
"周一8点任务", 1, 8, 0, true, false, nullptr, mondayTaskCallback, false, 0, 0, 0
};
ScheduledTask tuesdayTask = {
"周二15:30任务", 2, 15, 30, false, false, nullptr, tuesdayTaskCallback, false, 0, 0, 0
};
ScheduledTask countdownTask = {
"3分钟倒计时任务", -1, 0, 0, false, false, nullptr, countdownTaskCallback, true, 180, 0, 0
};
ScheduledTask* allTasks[] = {&mondayTask, &tuesdayTask, &countdownTask};
const int taskCount = 3;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi已连接");
timeClient.begin();
timeClient.update();
unsigned long epochTime = timeClient.getEpochTime();
setTime(epochTime);
Serial.print("当前时间: ");
printCurrentTime();
initializeTasks();
Serial.println("任务初始化完成");
}
void loop() {
timeClient.update();
runner.execute();
// 更新倒计时显示
static unsigned long lastDisplayTime = 0;
if (millis() - lastDisplayTime > 1000) {
displayCountdownRemaining();
lastDisplayTime = millis();
}
delay(100);
}
void initializeTasks() {
for (int i = 0; i < taskCount; i++) {
ScheduledTask* task = allTasks[i];
if (task->isCountdown) {
// 记录开始时间和计划执行时间
task->startTime = millis();
task->scheduledTime = task->startTime + task->countdownSeconds * 1000;
task->task = new Task(task->countdownSeconds * 1000,
task->isRecurring ? TASK_FOREVER : 1,
task->callback, &runner, false);
Serial.print("倒计时任务 '");
Serial.print(task->name);
Serial.print("' 设置: ");
Serial.print(task->countdownSeconds);
Serial.println("秒后执行");
} else {
task->task = new Task(60 * 60 * 1000,
task->isRecurring ? TASK_FOREVER : 1,
task->callback, &runner, false);
updateTaskSchedule(task);
}
task->task->enable();
Serial.println("已初始化任务: " + task->name);
}
}
// 显示倒计时任务的剩余时间(修正版本)
void displayCountdownRemaining() {
for (int i = 0; i < taskCount; i++) {
ScheduledTask* task = allTasks[i];
if (task->isCountdown && task->task->isEnabled() && !task->hasExecuted) {
unsigned long currentTime = millis();
unsigned long remainingMs = task->scheduledTime - currentTime;
if (remainingMs > 0) {
unsigned long remainingSeconds = remainingMs / 1000;
if (remainingSeconds <= 60 || remainingSeconds % 10 == 0) {
Serial.print("倒计时任务 '");
Serial.print(task->name);
Serial.print("' 剩余: ");
// 格式化显示时间
if (remainingSeconds >= 60) {
Serial.print(remainingSeconds / 60);
Serial.print("分");
Serial.print(remainingSeconds % 60);
Serial.println("秒");
} else {
Serial.print(remainingSeconds);
Serial.println("秒");
}
}
}
}
}
}
// 其他函数保持不变...
void updateTaskSchedule(ScheduledTask* task) {
if (task->isCountdown) return;
time_t now = timeClient.getEpochTime();
tm* timeInfo = localtime(&now);
time_t nextExecution = calculateNextExecution(task, timeInfo);
long delayMs = (nextExecution - now) * 1000;
if (delayMs < 0) {
delayMs += 7 * 24 * 3600 * 1000;
}
task->task->setInterval(delayMs);
task->task->setIterations(task->isRecurring ? TASK_FOREVER : 1);
Serial.print("定时任务 '");
Serial.print(task->name);
Serial.print("' 下一次执行: ");
printTime(nextExecution);
}
time_t calculateNextExecution(ScheduledTask* task, tm* currentTime) {
tm nextTime = *currentTime;
nextTime.tm_hour = task->triggerHour;
nextTime.tm_min = task->triggerMinute;
nextTime.tm_sec = 0;
int dayDifference = task->triggerDay - (currentTime->tm_wday == 0 ? 7 : currentTime->tm_wday);
if (dayDifference < 0) dayDifference += 7;
nextTime.tm_mday += dayDifference;
return mktime(&nextTime);
}
// 任务回调函数
void mondayTaskCallback() {
Serial.println("【执行任务】周一8:00任务 - 每周提醒");
mondayTask.hasExecuted = true;
updateTaskSchedule(&mondayTask);
}
void tuesdayTaskCallback() {
Serial.println("【执行任务】周二15:30任务 - 单次执行");
tuesdayTask.hasExecuted = true;
if (!tuesdayTask.isRecurring) {
tuesdayTask.task->disable();
Serial.println("单次任务已执行并禁用");
}
updateTaskSchedule(&tuesdayTask);
}
void countdownTaskCallback() {
Serial.println("【执行任务】3分钟倒计时任务 - 时间到!");
countdownTask.hasExecuted = true;
countdownTask.task->disable();
Serial.println("倒计时任务执行完成");
}
void printCurrentTime() {
time_t now = timeClient.getEpochTime();
printTime(now);
}
void printTime(time_t timestamp) {
tm* timeInfo = localtime(×tamp);
char buffer[30];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %A", timeInfo);
Serial.println(buffer);
}
语音交互示例
- 1.
添加任务
"添加一个每天上午8点的起床提醒,消息内容为'该起床了'"
- 2.
删除任务
"删除ID为task002的提醒任务"
- 3.
查询任务
"列出所有未完成的提醒"
"显示今天的全部任务"
- 4.
更新任务状态
"将服药提醒标记为已完成"
- 5.
推迟提醒
"把当前提醒推迟10分钟"
这个简化版本完全专注于提醒功能的核心要素:
- •
任务管理(添加/删除/更新)
- •
时间触发机制
- •
重复模式设置
- •
状态跟踪(完成/未完成)
- •
提醒消息内容
- •
推迟功能

、定义
{
"session_id": "",
"type": "iot",
"update": true,
"descriptors": [
{
"name": "ReminderSystem",
"description": "智能提醒任务系统",
"properties": {
"totalTasks": {
"description": "当前任务总数",
"type": "number"
},
"activeTasks": {
"description": "活跃任务数量",
"type": "number"
},
"nextTriggerTime": {
"description": "下一个即将触发的任务时间",
"type": "string"
}
},
"methods": {
"AddTask": {
"description": "添加新提醒任务",
"parameters": {
"taskName": {
"description": "任务名称",
"type": "string"
},
"triggerTime": {
"description": "触发时间(格式:YYYY-MM-DD HH:MM)",
"type": "string"
},
"isRecurring": {
"description": "是否重复任务(true/false)",
"type": "boolean"
},
"recurrencePattern": {
"description": "重复模式(daily/weekly/monthly)",
"type": "string",
"optional": true
},
"notificationMessage": {
"description": "提醒时显示的消息",
"type": "string",
"optional": true
}
}
},
"DeleteTask": {
"description": "删除指定任务",
"parameters": {
"taskId": {
"description": "任务ID",
"type": "string"
}
}
},
"ListTasks": {
"description": "列出所有任务",
"parameters": {
"filter": {
"description": "过滤条件(active/completed/all)",
"type": "string",
"optional": true
}
}
},
"UpdateTask": {
"description": "更新任务状态",
"parameters": {
"taskId": {
"description": "任务ID",
"type": "string"
},
"isCompleted": {
"description": "是否标记为已完成",
"type": "boolean"
}
}
},
"SnoozeTask": {
"description": "推迟提醒任务",
"parameters": {
"taskId": {
"description": "任务ID",
"type": "string"
},
"minutes": {
"description": "推迟分钟数",
"type": "number"
}
}
}
}
}
]
}
示例状态信息
{
"session_id": "",
"type": "iot",
"update": true,
"states": [
{
"name": "ReminderSystem",
"state": {
"totalTasks": 3,
"activeTasks": 2,
"nextTriggerTime": "2025-08-19 08:00",
"tasks": [
{
"taskId": "task001",
"taskName": "早晨起床",
"triggerTime": "2025-08-19 08:00",
"isRecurring": true,
"recurrencePattern": "daily",
"isCompleted": false,
"notificationMessage": "该起床了!"
},
{
"taskId": "task002",
"taskName": "重要会议",
"triggerTime": "2025-08-19 14:30",
"isRecurring": false,
"isCompleted": false,
"notificationMessage": "会议即将开始"
},
{
"taskId": "task003",
"taskName": "服药提醒",
"triggerTime": "2025-08-18 20:00",
"isRecurring": true,
"recurrencePattern": "daily",
"isCompleted": true
}
]
}
}
]
}
如何使用


{
"method": "UpdateTask",
"parameters": {
"taskId": "task001",
"isCompleted": true
}
}

{
"method": "SnoozeTask",
"parameters": {
"taskId": "task002",
"minutes": 30
}
}

{
"method": "ListTasks",
"parameters": {
"filter": "all"
}
}

{
"method": "UpdateTask",
"parameters": {
"taskId": "task003",
"isCompleted": true
}
}

{
"totalTasks": 3,
"activeTasks": 1, // 仅剩 "重要会议" 是活跃的
"nextTriggerTime": "2025-08-19 15:00", // 推迟后的会议时间
"tasks": [
{
"taskId": "task001",
"taskName": "早晨起床",
"triggerTime": "2025-08-19 08:00",
"isRecurring": true,
"recurrencePattern": "daily",
"isCompleted": true,
"notificationMessage": "该起床了!"
},
{
"taskId": "task002",
"taskName": "重要会议",
"triggerTime": "2025-08-19 15:00", // 推迟 30 分钟
"isRecurring": false,
"isCompleted": false,
"notificationMessage": "会议即将开始"
},
{
"taskId": "task003",
"taskName": "服药提醒",
"triggerTime": "2025-08-18 20:00",
"isRecurring": true,
"recurrencePattern": "daily",
"isCompleted": true
}
]
}
浙公网安备 33010602011771号