【花雕学编程】ESP32 ChatGPT之智能灯光控制

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。


ESP32
ESP32 是由 Espressif Systems 推出的一款高性能、低功耗的 Wi-Fi 和 Bluetooth 芯片组。它广泛应用于物联网(IoT)设备和智能家居产品,拥有丰富的外设接口,支持 GPIO、ADC、DAC、PWM 等功能,适合各种嵌入式系统开发。以下是 ESP32 的一些关键特点:
1、双核处理器:内置两个 Xtensa LX6 处理器,运行速度高达 240 MHz。
2、无线通信:支持 2.4 GHz Wi-Fi 和 Bluetooth 4.2 / BLE 双模。
3、低功耗模式:支持多种省电模式,非常适合电池供电的设备。
4、丰富的外设接口:包括多个 GPIO、I2C、SPI、UART、ADC、DAC、PWM 等。

ChatGPT
ChatGPT 是一个基于 GPT-3.5 架构的语言模型,由 OpenAI 开发。它可以生成类人文本,并在对话中理解和生成自然语言。以下是 ChatGPT 的一些关键特点:
1、自然语言理解和生成:能够理解并生成流畅且上下文相关的文本。
2、多任务处理:可以回答问题、生成内容、进行对话、提供建议等。
3、上下文感知:能够在对话中保持上下文一致性和连贯性。
4、强大的知识库:拥有大量的训练数据,涵盖广泛的知识领域。

ESP32 与 ChatGPT 的结合
将 ESP32 与 ChatGPT 结合是一种将物联网(IoT)设备与人工智能(AI)深度融合的创新方式,可以实现更智能的设备和系统。以下是这种结合的几种应用场景和技术实现方法:
1、应用场景
智能家居助手:ESP32 可作为智能家居系统中的语音助手硬件,通过 Wi-Fi 连接到 ChatGPT 实现自然语言对话。例如,通过语音命令控制灯光、温度、安防系统等。
健康监测与建议:ESP32 采集用户的健康数据,如心率、血压等,通过 Wi-Fi 发送到 ChatGPT 进行分析,并提供个性化的健康建议。
智能客服机器人:在商店或展会等场所,ESP32 可以作为硬件基础,通过 ChatGPT 提供智能问答服务,解答客户问题和提供相关信息。
教育与学习助手:ESP32 结合 ChatGPT 可以用作教育机器人,提供交互式的学习体验,回答学生的问题,进行辅导和知识传授。
智能语音助手:结合语音识别模块,用户可以通过语音与ChatGPT进行交互,实现语音控制和智能问答。
物联网设备控制:利用ChatGPT的智能对话能力,用户可以通过自然语言指令控制连接到ESP32的物联网设备。
教育与娱乐:在教育领域,ChatGPT可以作为智能教育助手,帮助学生解答问题和提供学习资源;在娱乐领域,可以用于开发具有智能对话功能的游戏和互动体验。
2、技术实现
数据采集与传输:ESP32 通过传感器采集数据(如温度、湿度、用户输入的语音等),然后通过 Wi-Fi 将这些数据传输到服务器。
API 调用:服务器接收到数据后,通过调用 ChatGPT 的 API 进行自然语言处理和分析。
结果返回与执行:ChatGPT 生成的响应通过服务器返回给 ESP32,驱动相应的硬件执行特定操作,如播放音频响应、显示文字信息、控制设备等。
3、主要优势
智能化提升:通过结合 ChatGPT,ESP32 设备能够提供更智能、更人性化的交互体验。
多功能性:能够支持多种应用场景,从智能家居到健康监测,再到教育辅助。
实时性:能够实现数据的实时处理和反馈,提高用户体验。


主要特点
语音与文字交互控制:结合 ESP32 的通信能力和 ChatGPT 强大的自然语言处理能力,用户不仅可以通过传统的文字输入方式下达灯光控制指令,如 “将客厅灯光调至 50% 亮度”,还能使用语音进行控制,像说 “打开卧室灯” 等,实现更加便捷、自然的人机交互,方便不同场景和不同需求的用户操作。
智能场景联动:可以根据不同的场景需求,与其他智能设备或传感器进行联动。例如,结合人体传感器,当检测到有人进入房间时,自动根据预设条件打开相应灯光;或者与天气传感器联动,在阴天时自动调亮灯光,营造舒适的室内光线环境,实现智能化的场景自动化控制。
个性化定制:用户能够根据自己的喜好和需求,对灯光的颜色、亮度、开关时间等进行个性化设置。可以创建多种灯光模式,如阅读模式、休闲模式、睡眠模式等,每种模式下都有特定的灯光参数组合,满足不同活动和场景下的灯光需求,提供个性化的灯光体验。
远程控制功能:借助 ESP32 的网络连接能力,用户可以通过手机、平板等设备,在任何有网络的地方远程控制灯光。无论用户是在回家的路上,还是在外出旅行时,都能提前或随时调整家中灯光状态,方便快捷,增强了用户对灯光的掌控力。
学习与自适应能力:利用 ChatGPT 的学习能力,智能灯光控制系统可以逐渐学习用户的使用习惯和偏好。例如,系统可以根据用户每天在不同时间对灯光的操作,自动调整灯光的亮度和开关时间,实现自适应的智能控制,为用户提供更加贴心、便捷的服务。

应用场景
智能家居:在家庭环境中,智能灯光控制可以为用户打造便捷、舒适的生活空间。如在客厅,用户可以通过语音指令轻松调整灯光亮度和颜色,营造适合观看电影、聚会或休息的氛围;在卧室,设置睡眠模式,临睡前只需一声令下,灯光就会逐渐调暗直至关闭,提供舒适的睡眠环境。
商业场所:在酒店、餐厅、会议室等商业场所,智能灯光控制可以提升服务质量和管理效率。酒店客房可以根据客人的需求,通过智能灯光系统为客人提供个性化的灯光服务;餐厅可以根据不同的用餐时段和场景,自动调整灯光氛围;会议室则能根据会议的不同阶段,如报告、讨论、休息等,快速切换合适的灯光模式。
办公空间:在办公室中,智能灯光控制有助于提高员工的工作效率和舒适度。可以根据自然光照度自动调节室内灯光亮度,保证办公区域光线均匀、舒适,减少眼睛疲劳;还能通过设置不同的灯光场景,满足办公、会议、休息等不同工作场景的需求,提升办公空间的智能化水平。
公共区域:在学校、医院、商场等公共区域,智能灯光控制可以实现节能和便捷管理。例如,学校的走廊和教室可以根据人员的流动情况自动控制灯光的开关和亮度;医院的病房和走廊可以设置不同的灯光模式,满足病人和医护人员的不同需求;商场可以根据营业时间和客流量,灵活调整灯光的亮度和颜色,营造良好的购物环境。

需要注意的事项
网络稳定性:ESP32 与 ChatGPT 的通信以及远程控制功能都依赖于网络。网络不稳定可能导致控制指令发送失败、灯光响应延迟甚至系统失控。因此,要确保网络环境稳定,可采用信号强度好、稳定性高的路由器,并考虑设置网络备份方案,如备用网络接入点,以防止网络故障。
兼容性问题:ESP32 需要与各种类型的灯光设备和通信协议兼容。不同品牌、型号的灯光设备可能采用不同的通信标准,如 Wi-Fi、蓝牙、Zigbee 等。在选择灯光设备和搭建系统时,要仔细确认设备之间的兼容性,必要时使用合适的通信网关或转接器来实现设备之间的互联互通。
安全与隐私保护:智能灯光控制系统涉及家庭或场所的信息,如灯光使用习惯等,可能会包含用户的一些隐私数据。要采取严格的安全措施,如对数据进行加密传输和存储,设置用户访问权限,防止数据泄露和被恶意利用。同时,要遵循相关法律法规,保障用户的隐私安全。
系统稳定性与可靠性:由于灯光控制在日常生活和工作中较为重要,系统需要具备高稳定性和可靠性。要对 ESP32 和相关设备进行定期维护和检查,及时更新软件和驱动程序,以修复可能存在的漏洞和问题。此外,还应设置系统故障报警机制,当出现异常情况时及时通知用户,以便快速排查和解决问题。
成本与性价比:实现 ESP32 ChatGPT 智能灯光控制可能需要一定的硬件设备投入和技术支持,要综合考虑成本与实际需求。根据应用场景的规模和复杂程度,合理选择硬件设备和技术方案,在满足功能需求的前提下,尽量提高性价比,避免不必要的浪费。


1、基本的灯光控制

#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "your_SSID"; // WiFi 名称
const char* password = "your_PASSWORD"; // WiFi 密码
const char* apiKey = "your_API_KEY"; // ChatGPT API 密钥
const char* apiUrl = "https://api.openai/v1/chat/completions"; // API URL

const int lightPin = 2; // 灯光控制引脚

void setup() {
    Serial.begin(115200);
    pinMode(lightPin, OUTPUT); // 设置引脚为输出模式
    WiFi.begin(ssid, password);
    
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("连接中...");
    }
    Serial.println("WiFi 连接成功");
}

void loop() {
    // 这里可以添加代码从用户获取指令,如通过串口输入
    String userCommand = "打开灯光"; // 模拟用户指令
    controlLight(userCommand); // 控制灯光
    delay(10000); // 每 10 秒执行一次
}

// 控制灯光的函数
void controlLight(String command) {
    if (command.indexOf("打开灯光") != -1) {
        digitalWrite(lightPin, HIGH); // 打开灯光
        Serial.println("灯光已打开");
    } else if (command.indexOf("关闭灯光") != -1) {
        digitalWrite(lightPin, LOW); // 关闭灯光
        Serial.println("灯光已关闭");
    } else {
        Serial.println("未识别的指令");
    }
}

2、通过 ChatGPT 控制灯光

#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "your_SSID"; // WiFi 名称
const char* password = "your_PASSWORD"; // WiFi 密码
const char* apiKey = "your_API_KEY"; // ChatGPT API 密钥
const char* apiUrl = "https://api.openai/v1/chat/completions"; // API URL

const int lightPin = 2; // 灯光控制引脚

void setup() {
    Serial.begin(115200);
    pinMode(lightPin, OUTPUT); // 设置引脚为输出模式
    WiFi.begin(ssid, password);
    
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("连接中...");
    }
    Serial.println("WiFi 连接成功");
}

void loop() {
    if (WiFi.status() == WL_CONNECTED) {
        String userCommand = getCommandFromChatGPT("请告诉我如何控制灯光"); // 从 ChatGPT 获取指令
        controlLight(userCommand); // 控制灯光
    }
    delay(30000); // 每 30 秒执行一次
}

// 从 ChatGPT 获取指令
String getCommandFromChatGPT(String question) {
    HTTPClient http;
    http.begin(apiUrl);
    http.addHeader("Content-Type", "application/json");
    http.addHeader("Authorization", String("Bearer ") + apiKey);

    // 构建请求体
    String requestData = "{\"model\": \"gpt-3.5-turbo\", \"messages\": [{\"role\": \"user\", \"content\": \"" + question + "\"}]}";
    
    int httpResponseCode = http.POST(requestData);
    String answer = "请求失败";

    if (httpResponseCode > 0) {
        String payload = http.getString();
        int startIndex = payload.indexOf("\"content\":\"") + 12;
        int endIndex = payload.indexOf("\"}", startIndex);
        answer = payload.substring(startIndex, endIndex);
    }

    http.end(); // 结束请求
    return answer;
}

// 控制灯光的函数
void controlLight(String command) {
    if (command.indexOf("打开灯光") != -1) {
        digitalWrite(lightPin, HIGH); // 打开灯光
        Serial.println("灯光已打开");
    } else if (command.indexOf("关闭灯光") != -1) {
        digitalWrite(lightPin, LOW); // 关闭灯光
        Serial.println("灯光已关闭");
    } else {
        Serial.println("未识别的指令");
    }
}

3、通过网页控制灯光

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "your_SSID"; // WiFi 名称
const char* password = "your_PASSWORD"; // WiFi 密码
const int lightPin = 2; // 灯光控制引脚

WebServer server(80); // 创建 Web 服务器实例

void setup() {
    Serial.begin(115200);
    pinMode(lightPin, OUTPUT); // 设置引脚为输出模式
    WiFi.begin(ssid, password);
    
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("连接中...");
    }
    Serial.println("WiFi 连接成功");
    
    server.on("/", handleRoot); // 处理根路径
    server.on("/light/on", HTTP_GET, turnOnLight); // 打开灯光
    server.on("/light/off", HTTP_GET, turnOffLight); // 关闭灯光
    server.begin(); // 启动 Web 服务器
}

void loop() {
    server.handleClient(); // 处理客户端请求
}

// 处理根路径请求
void handleRoot() {
    String html = "<html><body><h1>智能灯光控制</h1>"
                  "<a href=\"/light/on\">打开灯光</a><br>"
                  "<a href=\"/light/off\">关闭灯光</a>"
                  "</body></html>";
    server.send(200, "text/html", html); // 返回 HTML 页面
}

// 打开灯光
void turnOnLight() {
    digitalWrite(lightPin, HIGH);
    server.send(200, "text/html", "灯光已打开,<a href=\"/\">返回</a>");
}

// 关闭灯光
void turnOffLight() {
    digitalWrite(lightPin, LOW);
    server.send(200, "text/html", "灯光已关闭,<a href=\"/\">返回</a>");
}

要点解读
网络连接:
所有示例通过 WiFi.begin(ssid, password) 连接到 WiFi 网络,确保 ESP32 能够访问 ChatGPT API 或处理 Web 请求。
灯光控制引脚设置:
使用 pinMode(lightPin, OUTPUT) 设置控制灯光的引脚为输出模式。这样可以通过数字输出信号来控制灯的开关。
控制逻辑:
在 controlLight() 函数中,根据用户的指令(如“打开灯光”或“关闭灯光”)来控制灯光的状态。通过 digitalWrite() 进行实际控制。
与 ChatGPT 的交互:
示例 2 中展示了如何通过 ChatGPT API 获取控制指令。使用 HTTPClient 发送请求,解析响应以获取控制灯光的相关命令。
Web 界面控制:
示例 3 中创建了一个简单的 Web 服务器,用户可以通过浏览器访问页面并点击链接来控制灯光。这种方式使得用户交互更为直观和方便。

4、基本灯光开关控制

#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>

const char* ssid = "your_SSID"; // WiFi名称
const char* password = "your_PASSWORD"; // WiFi密码
const char* apiKey = "your_API_KEY"; // OpenAI API密钥

WebServer server(80); // 创建HTTP服务器实例
const int lightPin = 2; // 定义灯光控制引脚

void setup() {
    Serial.begin(115200);
    pinMode(lightPin, OUTPUT);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("连接中...");
    }
    Serial.println("WiFi连接成功");

    server.on("/", handleRoot); // 处理根路径请求
    server.on("/ask", HTTP_POST, handleAsk); // 处理问答请求
    server.begin();
}

void loop() {
    server.handleClient(); // 处理客户端请求
}

void handleRoot() {
    String html = "<html><body><h1>智能灯光控制</h1>"
                  "<input type='text' id='command' placeholder='输入控制命令'/>"
                  "<button onclick='ask()'>发送</button>"
                  "<div id='response'></div>"
                  "<script>"
                  "function ask() {"
                  "  var command = document.getElementById('command').value;"
                  "  fetch('/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' },"
                  "  body: JSON.stringify({ 'command': command }) })"
                  ".then(response => response.json())"
                  ".then(data => { document.getElementById('response').innerText = data.answer; });"
                  "}"
                  "</script></body></html>";
    server.send(200, "text/html", html); // 发送HTML页面
}

void handleAsk() {
    if (server.hasArg("plain")) {
        String body = server.arg("plain");
        String command = body.substring(body.indexOf(":") + 2, body.length() - 2);
        String answer = sendChatGPTRequest(command);
        controlLight(answer); // 根据ChatGPT的回复控制灯光
        String jsonResponse = "{\"answer\":\"" + answer + "\"}";
        server.send(200, "application/json", jsonResponse); // 发送JSON响应
    }
}

String sendChatGPTRequest(String command) {
    HTTPClient http;
    http.begin("https://api.openai/v1/chat/completions");
    http.addHeader("Content-Type", "application/json");
    http.addHeader("Authorization", String("Bearer ") + apiKey);

    String requestBody = "{\"model\":\"gpt-3.5-turbo\",\"messages\":[{\"role\":\"user\",\"content\":\"" + command + "\"}]}";
    int httpResponseCode = http.POST(requestBody);
    String answer = "";

    if (httpResponseCode > 0) {
        String response = http.getString();
        int startIndex = response.indexOf("content\":\"") + 10;
        int endIndex = response.indexOf("\"", startIndex);
        answer = response.substring(startIndex, endIndex);
    } else {
        Serial.print("请求失败,错误代码: ");
        Serial.println(httpResponseCode);
    }

    http.end();
    return answer;
}

void controlLight(String command) {
    if (command.indexOf("开灯") >= 0) {
        digitalWrite(lightPin, HIGH); // 开灯
    } else if (command.indexOf("关灯") >= 0) {
        digitalWrite(lightPin, LOW); // 关灯
    }
}

要点解读:
WiFi连接:ESP32连接到WiFi,使其能够发送HTTP请求与ChatGPT API交互。
Web服务器设置:使用WebServer库创建HTTP服务器,处理用户的HTTP请求。
灯光控制逻辑:根据ChatGPT的回复内容(如“开灯”或“关灯”)来控制灯光的开关状态。
动态交互:通过HTML和JavaScript构建用户界面,用户输入命令后能够即时获取反馈。
JSON响应处理:将ChatGPT的回答以JSON格式返回,便于前端处理和显示。

5、根据环境亮度自动调节灯光

#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>

const char* ssid = "your_SSID"; // WiFi名称
const char* password = "your_PASSWORD"; // WiFi密码
const char* apiKey = "your_API_KEY"; // OpenAI API密钥

WebServer server(80); // 创建HTTP服务器实例
const int lightPin = 2; // 定义灯光控制引脚
const int sensorPin = A0; // 定义光敏传感器引脚

void setup() {
    Serial.begin(115200);
    pinMode(lightPin, OUTPUT);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("连接中...");
    }
    Serial.println("WiFi连接成功");

    server.on("/", handleRoot); // 处理根路径请求
    server.on("/ask", HTTP_POST, handleAsk); // 处理问答请求
    server.begin();
}

void loop() {
    server.handleClient(); // 处理客户端请求

    // 根据环境亮度自动调节灯光
    int sensorValue = analogRead(sensorPin);
    if (sensorValue < 300) { // 假设300为亮度阈值
        digitalWrite(lightPin, HIGH); // 开灯
    } else {
        digitalWrite(lightPin, LOW); // 关灯
    }
}

void handleRoot() {
    String html = "<html><body><h1>智能灯光控制</h1>"
                  "<input type='text' id='command' placeholder='输入控制命令'/>"
                  "<button onclick='ask()'>发送</button>"
                  "<div id='response'></div>"
                  "<script>"
                  "function ask() {"
                  "  var command = document.getElementById('command').value;"
                  "  fetch('/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' },"
                  "  body: JSON.stringify({ 'command': command }) })"
                  ".then(response => response.json())"
                  ".then(data => { document.getElementById('response').innerText = data.answer; });"
                  "}"
                  "</script></body></html>";
    server.send(200, "text/html", html); // 发送HTML页面
}

void handleAsk() {
    if (server.hasArg("plain")) {
        String body = server.arg("plain");
        String command = body.substring(body.indexOf(":") + 2, body.length() - 2);
        String answer = sendChatGPTRequest(command);
        controlLight(answer); // 根据ChatGPT的回复控制灯光
        String jsonResponse = "{\"answer\":\"" + answer + "\"}";
        server.send(200, "application/json", jsonResponse); // 发送JSON响应
    }
}

String sendChatGPTRequest(String command) {
    HTTPClient http;
    http.begin("https://api.openai/v1/chat/completions");
    http.addHeader("Content-Type", "application/json");
    http.addHeader("Authorization", String("Bearer ") + apiKey);

    String requestBody = "{\"model\":\"gpt-3.5-turbo\",\"messages\":[{\"role\":\"user\",\"content\":\"" + command + "\"}]}";
    int httpResponseCode = http.POST(requestBody);
    String answer = "";

    if (httpResponseCode > 0) {
        String response = http.getString();
        int startIndex = response.indexOf("content\":\"") + 10;
        int endIndex = response.indexOf("\"", startIndex);
        answer = response.substring(startIndex, endIndex);
    } else {
        Serial.print("请求失败,错误代码: ");
        Serial.println(httpResponseCode);
    }

    http.end();
    return answer;
}

void controlLight(String command) {
    if (command.indexOf("开灯") >= 0) {
        digitalWrite(lightPin, HIGH); // 开灯
    } else if (command.indexOf("关灯") >= 0) {
        digitalWrite(lightPin, LOW); // 关灯
    }
}

要点解读:
环境感知:通过光敏传感器读取环境亮度,根据亮度自动控制灯光的开关。
实时监测:在loop函数中持续监测传感器值,并根据环境变化调整灯光状态。
Web服务器交互:与示例1相似,使用Web服务器处理用户输入的控制命令。
灯光控制逻辑:结合用户命令与环境亮度,灵活控制灯光状态,提升用户体验。
JSON响应处理:将ChatGPT的回答通过JSON格式返回,便于前端处理与显示。

6、定时灯光控制

#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>
#include <TimeLib.h> // 使用TimeLib库进行时间处理

const char* ssid = "your_SSID"; // WiFi名称
const char* password = "your_PASSWORD"; // WiFi密码
const char* apiKey = "your_API_KEY"; // OpenAI API密钥

WebServer server(80); // 创建HTTP服务器实例
const int lightPin = 2; // 定义灯光控制引脚
String scheduledTime = ""; // 定时开关时间

void setup() {
    Serial.begin(115200);
    pinMode(lightPin, OUTPUT);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("连接中...");
    }
    Serial.println("WiFi连接成功");

    server.on("/", handleRoot); // 处理根路径请求
    server.on("/ask", HTTP_POST, handleAsk); // 处理问答请求
    server.begin();
}

void loop() {
    server.handleClient(); // 处理客户端请求

    // 检查定时开关
    if (scheduledTime != "") {
        time_t currentTime = now(); // 获取当前时间
        if (hour(currentTime) == scheduledTime.substring(0, 2).toInt() &&
            minute(currentTime) == scheduledTime.substring(3, 5).toInt()) {
            digitalWrite(lightPin, HIGH); // 开灯
            scheduledTime = ""; // 重置定时
        }
    }
}

void handleRoot() {
    String html = "<html><body><h1>智能灯光控制</h1>"
                  "<input type='text' id='command' placeholder='输入控制命令'/>"
                  "<input type='text' id='schedule' placeholder='设置定时(HH:mm)'/>"
                  "<button onclick='ask()'>发送</button>"
                  "<div id='response'></div>"
                  "<script>"
                  "function ask() {"
                  "  var command = document.getElementById('command').value;"
                  "  fetch('/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' },"
                  "  body: JSON.stringify({ 'command': command }) })"
                  ".then(response => response.json())"
                  ".then(data => { document.getElementById('response').innerText = data.answer; });"
                  "}"
                  "</script></body></html>";
    server.send(200, "text/html", html); // 发送HTML页面
}

void handleAsk() {
    if (server.hasArg("plain")) {
        String body = server.arg("plain");
        String command = body.substring(body.indexOf(":") + 2, body.length() - 2);
        if (command.indexOf("定时") >= 0) {
            scheduledTime = command.substring(command.indexOf("定时") + 2); // 提取定时时间
            String answer = "已设置定时开灯时间为:" + scheduledTime;
            String jsonResponse = "{\"answer\":\"" + answer + "\"}";
            server.send(200, "application/json", jsonResponse); // 发送JSON响应
        } else {
            String answer = sendChatGPTRequest(command);
            controlLight(answer); // 根据ChatGPT的回复控制灯光
            String jsonResponse = "{\"answer\":\"" + answer + "\"}";
            server.send(200, "application/json", jsonResponse); // 发送JSON响应
        }
    }
}

String sendChatGPTRequest(String command) {
    HTTPClient http;
    http.begin("https://api.openai/v1/chat/completions");
    http.addHeader("Content-Type", "application/json");
    http.addHeader("Authorization", String("Bearer ") + apiKey);

    String requestBody = "{\"model\":\"gpt-3.5-turbo\",\"messages\":[{\"role\":\"user\",\"content\":\"" + command + "\"}]}";
    int httpResponseCode = http.POST(requestBody);
    String answer = "";

    if (httpResponseCode > 0) {
        String response = http.getString();
        int startIndex = response.indexOf("content\":\"") + 10;
        int endIndex = response.indexOf("\"", startIndex);
        answer = response.substring(startIndex, endIndex);
    } else {
        Serial.print("请求失败,错误代码: ");
        Serial.println(httpResponseCode);
    }

    http.end();
    return answer;
}

void controlLight(String command) {
    if (command.indexOf("开灯") >= 0) {
        digitalWrite(lightPin, HIGH); // 开灯
    } else if (command.indexOf("关灯") >= 0) {
        digitalWrite(lightPin, LOW); // 关灯
    }
}

要点解读:
定时功能:允许用户设置定时开灯的功能,提升智能灯光系统的灵活性。
时间处理:使用TimeLib库获取当前时间,并根据用户设置的时间控制灯光的开关。
Web服务器交互:与之前的示例相似,通过Web服务器处理用户输入的控制命令和定时设置。
动态命令处理:结合用户的命令与定时设置,实现多种控制方式,增强用户体验。
JSON响应处理:将ChatGPT的回答以JSON格式返回,便于前端处理和显示。

总结
通过以上几个示例,可以看到如何在ESP32上实现智能灯光控制功能。关键要点包括:
WiFi连接:确保ESP32连接到互联网,以便与ChatGPT API进行交互。
Web服务器设置:使用WebServer库创建HTTP服务器,处理用户的HTTP请求。
灵活的灯光控制:根据用户输入的命令和环境状态灵活控制灯光,提升用户体验。
定时功能:支持用户设置定时开关灯光,增强系统的智能性。
JSON响应处理:将ChatGPT的回答通过JSON格式返回,便于前端处理与显示。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754769286a5199937.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信