Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。
Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。
Arduino
Arduino 是一个开源电子原型平台,由硬件和软件两部分组成。硬件方面,Arduino 电路板可以读取输入——例如来自传感器的数据、按钮按下的信号、或是社交媒体消息——并将其转换为输出,如启动电机、点亮 LED、或发送通知。软件方面,用户可以使用 Arduino 编程语言(基于 Wiring)和 Arduino 软件(IDE)进行编程。以下是一些关键概念:
1、微控制器 (Microcontroller): 一种集成在电路板上的小型计算机,用于控制其他电子组件。Arduino 板常使用 ATmega328P 微控制器。
2、引脚 (Pins): 电路板上的物理连接点,用于连接传感器、执行器等外围设备。分为数字引脚和模拟引脚。
3、板载LED (Onboard LED): Arduino 板上自带的 LED(通常连接到引脚 13),便于测试和调试代码。
4、电源端口 (Power Port): 用于供电的接口,可以通过 USB 端口、电池或电源适配器供电。
HTTP (HyperText Transfer Protocol)
HTTP 是互联网的基础协议之一,用于在网络上交换信息,特别是用于客户端(如浏览器)与服务器之间的数据通信。以下是一些关键概念:
1、请求 (Request): 由客户端发送到服务器的消息,包含请求行、请求头和请求体。常见的请求方法包括 GET(请求资源)、POST(提交数据)、PUT(更新资源)和 DELETE(删除资源)。
2、响应 (Response): 服务器返回给客户端的消息,包含状态行、响应头和响应体。状态码如 200(OK)、404(Not Found)等用于表示请求的处理结果。
3、URI (Uniform Resource Identifier): 用于唯一标识网络资源的字符串,可以是 URL(Uniform Resource Locator)或 URN(Uniform Resource Name)。
4、无状态 (Stateless): HTTP 是一种无状态协议,每个请求都是独立的,不保留前后的状态信息。因此,服务器在处理请求时不需要了解之前的请求信息。
Arduino 与 HTTP 的结合
在 Arduino 项目中,HTTP 可以用于实现设备与网络服务的通信,典型应用场景包括:
1、发送传感器数据到服务器: Arduino 可以通过 HTTP POST 请求将传感器数据上传到云服务器,进行数据存储和分析。
2、从服务器获取数据: Arduino 可以通过 HTTP GET 请求从服务器获取信息,例如天气预报或实时监控数据。
3、控制设备: 通过 HTTP 请求,Arduino 可以接收远程指令,控制物理设备的开关状态,如远程点亮 LED 或启动电机。
一、主要特点
(一)知识获取的便捷性
丰富的知识资源整合
豆包 API 拥有庞大的知识数据库,涵盖了众多领域的知识,包括但不限于科学技术、历史文化、人文艺术、生活常识等。Arduino 通过 HTTP 接入该 API 后,可以方便地获取这些知识,就像打开了一个知识宝库的大门。例如,对于一个基于 Arduino 的智能问答设备,能够利用豆包 API 回答用户提出的各种问题,从简单的数学计算到复杂的历史事件解读。
快速的知识检索。豆包 API 经过优化,能够在短时间内对用户的查询进行处理并返回结果。Arduino 发送的 HTTP 请求可以迅速得到响应,使设备能够及时为用户提供所需的知识,减少等待时间。这对于实时性要求较高的应用场景,如在对话式机器人或者智能语音助手等设备中非常重要。
(二)标准化的接口与数据格式
统一的请求 - 响应接口
豆包 API 提供了清晰、标准化的 HTTP 接口。Arduino 只需要按照规定的请求格式发送查询请求,就可以与 API 进行有效的通信。例如,通过构建一个包含问题内容的 GET 或 POST 请求,就像 “https://api.doubao.com/query?question=太阳的直径是多少”(这只是一个示例,实际接口可能更复杂),即可发起知识查询。这种标准化的接口降低了接入的难度,方便开发者进行集成。
数据格式规范。返回的数据通常采用易于解析的格式,如 JSON。JSON 格式的数据具有清晰的结构,例如,一个回答可能包含答案内容、参考资料、回答的可信度等信息。Arduino 可以使用 JSON 解析库轻松地从返回的数据中提取有用的部分,用于后续的显示或者其他处理。
(三)可定制化与扩展性
根据需求灵活查询
开发者可以根据 Arduino 设备的具体应用场景定制查询内容。无论是获取简短的定义解释,还是详细的长篇知识论述,都可以通过调整请求参数来实现。例如,在一个用于儿童教育的 Arduino 设备中,可以设置请求参数,使豆包 API 返回简单易懂的知识解释;而在一个科研辅助设备中,可以请求更深入、专业的学术内容。
易于与其他功能扩展。Arduino 本身具有多种功能,如传感器数据采集、设备控制等。接入豆包 API 后,可以与这些功能相结合,扩展设备的应用范围。比如,在一个智能家居系统中,当温度传感器检测到温度变化时,Arduino 可以通过豆包 API 查询关于温度对人体健康影响的知识,并将其显示给用户。
二、应用场景
(一)智能问答设备
家庭智能问答机器人
在家庭环境中,Arduino 与麦克风、扬声器等组件配合,接入豆包 API 构建智能问答机器人。用户可以通过语音提问,Arduino 接收语音并转换为文字后,通过 HTTP 请求豆包 API 获取答案,再将答案转换为语音播放出来。例如,用户问 “如何制作蛋糕?”,机器人通过接入的豆包 API 获取详细的蛋糕制作步骤并回答用户,为家庭生活提供知识查询服务。
这种智能问答机器人还可以用于儿童教育。它可以根据儿童的年龄和知识水平,通过调整请求豆包 API 的参数,提供适合儿童的简单易懂的知识回答,如回答 “为什么天空是蓝色的?” 等基础科学问题,帮助儿童学习新知识。
(二)智能教育辅助工具
学习辅助设备
在学校或学习场所,Arduino 设备接入豆包 API 可以作为学习辅助工具。例如,一个电子学习卡片,学生可以通过输入问题(如数学公式的解释、历史事件的背景等),Arduino 利用豆包 API 获取答案并显示在屏幕上。这可以帮助学生自主学习,提高学习效率。
对于教师来说,也可以利用这种设备快速获取教学资源。例如,在备课过程中,教师可以通过 Arduino 连接的输入设备(如键盘)向豆包 API 查询教学内容相关的知识点、案例等,丰富教学资源。
(三)智能信息展示系统
博物馆或展厅信息展示
在博物馆、科技馆等场所,Arduino 设备接入豆包 API 可以用于展品信息展示。当游客靠近展品时,Arduino 可以根据展品的标识信息,通过 HTTP 请求豆包 API 获取展品的详细介绍、历史背景、艺术价值等内容,并在显示屏上展示给游客。这不仅丰富了展品的展示方式,还能为游客提供更深入的知识讲解。
在商业展厅中,用于展示产品的相关知识。例如,展示电子产品的技术参数解释、新功能介绍等,帮助参观者更好地了解产品,提升展示效果。
三、需要注意的事项
(一)API 使用权限与限制
注册与认证要求
接入豆包 API 可能需要进行注册和认证。开发者需要按照规定的流程,提供必要的信息(如开发者姓名、联系方式、应用场景描述等)来获取 API 使用权限。在使用过程中,要确保遵守认证时所承诺的使用规则,避免因违规使用而导致权限被取消。
不同的使用场景和需求可能会有不同的权限级别。例如,对于商业用途的应用,可能需要经过更严格的审核和可能涉及付费获取更高的使用权限,如更高的请求频率限制或者更广泛的数据访问权限。
请求频率和配额限制
豆包 API 通常会对请求频率和配额进行限制,以确保服务质量和公平性。Arduino 开发者需要了解这些限制,避免频繁请求导致超出配额。例如,如果每秒发送过多的请求,可能会被暂时禁止访问,影响设备的正常功能。在开发过程中,需要合理安排请求的频率,或者根据实际需求申请合适的配额。
(二)数据准确性与适用性
答案质量与更新
虽然豆包 API 的数据经过了大量的审核和更新,但知识是不断发展变化的,可能会存在部分答案不够准确或者需要更新的情况。在应用场景中,尤其是对于一些专业领域的知识查询或者对准确性要求极高的场合(如学术研究、医疗建议等),需要对获取的答案进行适当的验证。可以参考其他权威资料或者与专业人士沟通来确保答案的准确性。
豆包 API 返回的答案可能是基于通用的知识体系,对于某些特定的、具有特殊背景或条件的问题,可能需要进一步筛选和调整答案,使其更符合实际应用场景的需求。例如,在回答一个关于当地风俗习惯的问题时,可能需要结合当地的实际情况进行适当的补充或修正。
(三)网络与性能问题
网络连接稳定性
由于通过 HTTP 接入豆包 API,网络连接的稳定性至关重要。Arduino 设备需要确保有可靠的网络连接,如稳定的 Wi - Fi 或者以太网连接。如果网络出现波动或者中断,可能会导致请求失败或者响应延迟。在设备部署环境中,要尽量避免干扰源(如电磁干扰、信号屏蔽区域等),并可以考虑采用网络故障恢复机制,如自动重连、重试请求等。
网络延迟也是一个需要考虑的因素。在实时性要求较高的应用场景中,如智能问答对话,较长的网络延迟可能会影响用户体验。开发者可以通过优化网络设置、选择合适的网络设备或者采用缓存机制(在允许的情况下)来减少网络延迟的影响。
性能优化与资源占用
频繁的 HTTP 请求和数据解析会占用 Arduino 设备的资源,包括 CPU 时间和内存。在资源有限的 Arduino 设备上,要注意优化请求和处理过程,避免过度消耗资源。例如,可以采用异步请求方式,在等待 API 响应的过程中让 Arduino 设备执行其他任务;在解析返回的数据时,使用高效的 JSON 解析库,减少内存占用和处理时间。
1、获取豆包 API 的天气信息
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* apiUrl = "https://api.douban.com/v2/weather"; // 示例 URL,需替换为实际的豆包 API
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
HTTPClient http;
http.begin(apiUrl);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String payload = http.getString();
Serial.println("Response Code: " + String(httpResponseCode));
Serial.println("Weather Data: " + payload);
} else {
Serial.printf("Error on HTTP request: %s\n", http.errorToString(httpResponseCode).c_str());
}
http.end();
}
void loop() {
// 主循环为空
}
2、使用豆包 API 提交用户评论
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* apiUrl = "https://api.douban.com/v2/comment"; // 示例 URL,需替换为实际的豆包 API
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
HTTPClient http;
http.begin(apiUrl);
http.addHeader("Content-Type", "application/json");
String jsonPayload = "{\"comment\":\"This is a test comment\",\"user\":\"Arduino\"}";
int httpResponseCode = http.POST(jsonPayload);
if (httpResponseCode > 0) {
String payload = http.getString();
Serial.println("Response Code: " + String(httpResponseCode));
Serial.println("Response Payload: " + payload);
} else {
Serial.printf("Error on HTTP request: %s\n", http.errorToString(httpResponseCode).c_str());
}
http.end();
}
void loop() {
// 主循环为空
}
3、获取豆包 API 的书籍信息
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* apiUrl = "https://api.douban.com/v2/book/1220562"; // 示例书籍 ID
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
HTTPClient http;
http.begin(apiUrl);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String payload = http.getString();
Serial.println("Response Code: " + String(httpResponseCode));
// 解析 JSON 数据
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
const char* title = doc["title"]; // 获取书名
Serial.println("Book Title: " + String(title));
} else {
Serial.println("JSON parsing failed: " + String(error.f_str()));
}
} else {
Serial.printf("Error on HTTP request: %s\n", http.errorToString(httpResponseCode).c_str());
}
http.end();
}
void loop() {
// 主循环为空
}
要点解读
WiFi 连接:
所有示例首先通过 WiFi.begin() 连接到 WiFi 网络,确保设备能够访问互联网。这是进行 API 请求的基础步骤。
HTTPClient 类的使用:
每个示例都使用 HTTPClient 类来发送 HTTP 请求,包括 GET 和 POST 请求。这展示了如何与豆包 API 进行交互。
JSON 数据处理:
示例 2 和 示例 3 中处理了 JSON 格式的请求和响应。在示例 3 中,通过 ArduinoJson 库解析 JSON 数据,提取书籍信息(如书名)。
错误处理机制:
每个示例都包含对 HTTP 响应码的检查,并在请求失败时输出错误信息。使用 http.errorToString(httpResponseCode) 方法方便调试,迅速找到问题所在。
动态构建请求体:
在示例 2 中,使用 JSON 格式构建 POST 请求的请求体。通过设置请求头 Content-Type,确保服务器正确解析请求内容。
4、获取豆瓣电影信息
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID"; // 替换为你的WiFi SSID
const char* password = "your_PASSWORD"; // 替换为你的WiFi密码
const char* apiKey = "your_API_KEY"; // 替换为你的豆瓣API密钥
const char* movieId = "1292052"; // 替换为你想查询的电影ID
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); // 连接到WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// 构建API请求URL
String serverName = "https://api.douban.com/v2/movie/subject/" + String(movieId) + "?apikey=" + String(apiKey);
HTTPClient http;
http.begin(serverName); // 初始化HTTP请求
int httpResponseCode = http.GET(); // 发送GET请求
if (httpResponseCode > 0) {
String payload = http.getString(); // 获取响应内容
Serial.println("Response Code: " + String(httpResponseCode));
// 解析JSON数据
DynamicJsonDocument doc(2048);
deserializeJson(doc, payload);
const char* title = doc["title"]; // 获取电影标题
Serial.println("Movie Title: " + String(title));
} else {
Serial.print("Error on HTTP request: ");
Serial.println(httpResponseCode);
}
http.end(); // 结束HTTP请求
}
void loop() {
// 空循环
}
要点解读
WiFi连接:使用WiFi.begin()连接到WiFi网络,确保设备能够访问互联网。
豆瓣API请求:构建豆瓣电影API请求URL,包含电影ID和API密钥,以获取特定电影的信息。
HTTPClient库:利用HTTPClient库发送GET请求并获取响应,简化网络通信过程。
JSON解析:使用ArduinoJson库解析API返回的JSON数据,提取电影标题等信息。
串口输出调试:通过串口输出响应信息,便于开发者监控请求结果。
5、获取豆瓣图书信息
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* apiKey = "your_API_KEY"; // 替换为你的豆瓣API密钥
const char* bookId = "1234567"; // 替换为你想查询的图书ID
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); // 连接到WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// 构建API请求URL
String serverName = "https://api.douban.com/v2/book/" + String(bookId) + "?apikey=" + String(apiKey);
HTTPClient http;
http.begin(serverName); // 初始化HTTP请求
int httpResponseCode = http.GET(); // 发送GET请求
if (httpResponseCode > 0) {
String payload = http.getString(); // 获取响应内容
Serial.println("Response Code: " + String(httpResponseCode));
// 解析JSON数据
DynamicJsonDocument doc(2048);
deserializeJson(doc, payload);
const char* title = doc["title"]; // 获取图书标题
Serial.println("Book Title: " + String(title));
} else {
Serial.print("Error on HTTP request: ");
Serial.println(httpResponseCode);
}
http.end(); // 结束HTTP请求
}
void loop() {
// 空循环
}
要点解读
图书信息获取:示例展示如何通过豆瓣API获取特定图书的信息,展示代码的灵活性。
API请求构建:动态构建豆瓣图书API请求URL,包含图书ID和API密钥,以获取特定图书的信息。
JSON数据解析:使用ArduinoJson库解析API返回的JSON数据,提取图书标题等信息。
错误处理:检查HTTP响应代码,确保请求成功,便于进行错误处理。
串口调试输出:通过串口输出图书标题,便于实时监控与调试。
6、获取豆瓣音乐信息
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* apiKey = "your_API_KEY"; // 替换为你的豆瓣API密钥
const char* musicId = "123456"; // 替换为你想查询的音乐ID
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); // 连接到WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// 构建API请求URL
String serverName = "https://api.douban.com/v2/music/" + String(musicId) + "?apikey=" + String(apiKey);
HTTPClient http;
http.begin(serverName); // 初始化HTTP请求
int httpResponseCode = http.GET(); // 发送GET请求
if (httpResponseCode > 0) {
String payload = http.getString(); // 获取响应内容
Serial.println("Response Code: " + String(httpResponseCode));
// 解析JSON数据
DynamicJsonDocument doc(2048);
deserializeJson(doc, payload);
const char* title = doc["title"]; // 获取音乐标题
Serial.println("Music Title: " + String(title));
} else {
Serial.print("Error on HTTP request: ");
Serial.println(httpResponseCode);
}
http.end(); // 结束HTTP请求
}
void loop() {
// 空循环
}
要点解读
音乐信息获取:示例展示如何通过豆瓣API获取特定音乐的信息,扩展了API的使用场景。
动态URL构建:通过字符串拼接构建豆瓣音乐API请求URL,包含音乐ID和API密钥。
JSON解析:利用ArduinoJson库解析API返回的JSON数据,提取音乐标题等信息。
响应状态检查:检查HTTP响应代码,确保请求成功,便于进行错误处理。
串口输出调试:通过串口输出音乐标题,便于调试和实时监控请求结果。
总结
以上几个案例展示了如何在Arduino环境下使用豆豆包API获取电影、图书和音乐信息。通过这些示例,用户可以学习到:
WiFi连接:如何连接到WiFi网络以发送HTTP请求。
API请求构建与发送:如何构建API请求URL并使用HTTPClient库发送请求。
JSON数据解析:使用ArduinoJson库解析API返回的JSON数据,提取所需信息。
灵活性与扩展性:示例展示了如何灵活地获取不同类型的数据,适应多种应用场景。
串口输出调试:通过串口输出调试信息,便于监测请求的结果和应用状态。
7、发送简单文本请求并获取豆包回复
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* api_key = "your_API_KEY";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to the Wi-Fi network");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
http.begin(url);
// 设置请求头
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", String("Bearer ") + String(api_key));
// 构建请求体
StaticJsonDocument<200> requestBody;
requestBody["model"] = "doubao-lite";
requestBody["messages"][0]["role"] = "user";
requestBody["messages"][0]["content"] = "你好,豆包!";
String requestBodyString;
serializeJson(requestBody, requestBodyString);
// 发送 POST 请求
int httpResponseCode = http.POST(requestBodyString);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("HTTP Response code: " + String(httpResponseCode));
Serial.println("Response: " + response);
// 解析响应
DynamicJsonDocument doc(1024);
deserializeJson(doc, response);
String reply = doc["choices"][0]["message"]["content"];
Serial.println("豆包回复: " + reply);
} else {
Serial.println("Error on sending POST: " + String(httpResponseCode));
}
http.end();
delay(60000); // 每隔 60 秒发送一次请求
}
}
8、发送传感器数据并获取豆包分析结果
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* api_key = "your_API_KEY";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to the Wi-Fi network");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
http.begin(url);
// 设置请求头
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", String("Bearer ") + String(api_key));
// 模拟传感器数据
float temperature = 25.3;
float humidity = 60.5;
// 构建请求体
StaticJsonDocument<200> requestBody;
requestBody["model"] = "doubao-lite";
requestBody["messages"][0]["role"] = "user";
requestBody["messages"][0]["content"] = "当前温度:" + String(temperature) + "℃,湿度:" + String(humidity) + "%。请分析环境是否适宜。";
String requestBodyString;
serializeJson(requestBody, requestBodyString);
// 发送 POST 请求
int httpResponseCode = http.POST(requestBodyString);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("HTTP Response code: " + String(httpResponseCode));
Serial.println("Response: " + response);
// 解析响应
DynamicJsonDocument doc(1024);
deserializeJson(doc, response);
String reply = doc["choices"][0]["message"]["content"];
Serial.println("豆包分析结果: " + reply);
} else {
Serial.println("Error on sending POST: " + String(httpResponseCode));
}
http.end();
delay(60000); // 每隔 60 秒发送一次请求
}
}
9、通过豆包 API 控制设备
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* api_key = "your_API_KEY";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to the Wi-Fi network");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
http.begin(url);
// 设置请求头
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", String("Bearer ") + String(api_key));
// 构建请求体
StaticJsonDocument<200> requestBody;
requestBody["model"] = "doubao-lite";
requestBody["messages"][0]["role"] = "user";
requestBody["messages"][0]["content"] = "请打开灯光。";
String requestBodyString;
serializeJson(requestBody, requestBodyString);
// 发送 POST 请求
int httpResponseCode = http.POST(requestBodyString);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("HTTP Response code: " + String(httpResponseCode));
Serial.println("Response: " + response);
// 解析响应并执行控制逻辑
DynamicJsonDocument doc(1024);
deserializeJson(doc, response);
String reply = doc["choices"][0]["message"]["content"];
Serial.println("豆包回复: " + reply);
if (reply.indexOf("打开灯光") >= 0) {
// 执行打开灯光的操作
Serial.println("执行:打开灯光");
}
} else {
Serial.println("Error on sending POST: " + String(httpResponseCode));
}
http.end();
delay(60000); // 每隔 60 秒发送一次请求
}
}
要点解读
HTTP 请求的基本结构:
使用 HTTPClient 库发送 HTTP 请求。
设置请求头(如 Content-Type 和 Authorization)和请求体(JSON 格式)。
豆包 API 的调用方式:
豆包 API 的 URL 为 https://ark.cn-beijing.volces.com/api/v3/chat/completions。
请求体中需要指定模型(如 doubao-lite)和用户输入。
数据处理与解析:
使用 ArduinoJson 库构建和解析 JSON 数据。
从响应中提取豆包的回复内容。
应用场景扩展:
可以结合传感器数据、设备控制等功能,实现更复杂的应用。
示例:将传感器数据发送给豆包进行分析,或根据豆包的回复控制设备。
注意事项:
确保 Wi-Fi 连接稳定。
如果使用 HTTPS,设置根证书以验证服务器身份。
避免频繁发送请求,以免触发速率限制或对服务器造成压力。
注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。