在这里插入图片描述
《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域,本栏目涵盖了丰富的内容,包括但不限于以下主题:Arduino BLDC、Arduino CNC、Arduino E-Ink、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID、Arduino TFT,以及Arduino智能家居、智慧交通、月球基地、智慧校园和智慧农业等多个方面与领域。不仅探讨了这些技术的基础知识和应用领域,还提供了众多具体的参考案例,帮助读者更好地理解和运用Arduino平台进行创新项目。目前,本栏目已有近4000篇相关博客,旨在为广大电子爱好者和开发者提供全面的学习资源与实践指导。通过这些丰富的案例和思路,读者可以获取灵感,推动自己的创作与开发进程。
https://blog.csdn.net/weixin_41659040/category_12422453.html

在这里插入图片描述
ESP32 DeepSeek之设备访问互联网进行API请求

一、主要特点
网络连接能力:

ESP32 DeepSeek具备强大的WiFi和蓝牙连接功能,能够方便地接入互联网,支持多种网络协议(如HTTP、MQTT),实现与云服务的无缝对接。
API请求支持:

设备能够通过HTTP请求访问RESTful API,支持GET、POST等请求方式,与外部服务进行数据交互,获取实时数据或提交信息。
数据处理能力:

ESP32能够在接收到API响应后进行数据解析和处理,根据具体需求进行数据的存储、展示或进一步分析,提升设备的智能化水平。
实时性与灵活性:

通过互联网进行API请求,可以实现实时数据更新,如天气预报、股市动态等,设备能够灵活应对不同的应用需求。
错误处理与重试机制:

系统支持错误处理机制,能够在请求失败时进行重试,确保数据交互的可靠性,提升用户体验。

二、应用场景
智能家居控制:

设备可以通过API请求控制云端的智能家居设备,如灯光调节、温度设置等,提高居住的舒适性和便利性。
环境监测:

设备可以接入环境监测API,获取空气质量、天气变化等信息,实时监控居住环境,提供用户健康管理建议。
远程设备管理:

通过API,用户可以远程管理家中设备状态,如查看设备在线状态、获取设备使用数据等,提升管理效率。
数据共享与分析:

设备可以将采集的数据上传至云端,进行数据分析和挖掘,支持智能决策和预测分析。
第三方服务集成:

设备能够接入第三方服务API,如语音助手、社交媒体等,实现更多功能的扩展,提升用户体验。

三、注意事项
网络稳定性:

设备的互联网访问依赖于稳定的网络连接,需确保WiFi信号强度和网络带宽充足,避免因网络问题导致的请求失败。
API调用限制:

不同的API服务可能有调用频率限制,要合理规划请求频率,避免触发服务的限制规则,导致服务中断。
数据安全性:

在进行API请求时,需注意数据传输的安全性,采用HTTPS协议加密数据,防止敏感信息泄露。
错误处理机制:

设计合理的错误处理机制,确保在API请求失败时能够进行适当的重试或记录错误信息,保证系统的健壮性。
响应时间优化:

对于关键应用,需优化API请求的响应时间,避免因延迟影响用户体验,必要时可考虑使用缓存机制。

在这里插入图片描述
1、获取天气信息的API请求

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

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* apiUrl = "http://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=YOUR_LOCATION"; // 天气API

DeepSeek deepSeek;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("连接中...");
  }
  Serial.println("已连接 WiFi");
  
  deepSeek.begin();
}

void loop() {
  String response = getWeather();
  Serial.println(response);
  delay(60000); // 每60秒获取一次天气信息
}

String getWeather() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(apiUrl);
    int httpResponseCode = http.GET();

    if (httpResponseCode > 0) {
      String payload = http.getString();
      return payload; // 返回天气信息
    } else {
      Serial.printf("HTTP错误: %s\n", http.errorToString(httpResponseCode).c_str());
      return "";
    }
    http.end();
  } else {
    Serial.println("WiFi未连接");
    return "";
  }
}

要点解读:

Wi-Fi连接:设备连接到指定的Wi-Fi网络,确保能够访问互联网。
API请求:使用HTTPClient库对天气API进行GET请求,获取实时天气信息。
响应处理:根据HTTP响应码判断请求是否成功,并返回相应的天气数据。
数据输出:通过串口输出获取到的天气信息,便于用户查看。
易于扩展:可以根据需要修改API地址,获取其他类型的信息,如空气质量等。

2、发送传感器数据到远程服务器

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

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* serverUrl = "http://your-server.com/api/data"; // 服务器API地址

DeepSeek deepSeek;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("连接中...");
  }
  Serial.println("已连接 WiFi");
  
  deepSeek.begin();
}

void loop() {
  float sensorData = analogRead(34); // 假设从引脚34读取传感器数据
  sendDataToServer(sensorData);
  delay(30000); // 每30秒发送一次数据
}

void sendDataToServer(float data) {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverUrl);
    http.addHeader("Content-Type", "application/json");

    String jsonData = "{\"sensorData\":" + String(data) + "}";
    int httpResponseCode = http.POST(jsonData);

    if (httpResponseCode > 0) {
      Serial.printf("HTTP响应码: %d\n", httpResponseCode);
    } else {
      Serial.printf("HTTP错误: %s\n", http.errorToString(httpResponseCode).c_str());
    }
    http.end();
  } else {
    Serial.println("WiFi未连接");
  }
}

要点解读:

传感器数据读取:通过模拟读取引脚获取传感器数据,作为数据源。
数据上传:使用HTTPClient库将传感器数据以JSON格式发送到远程服务器。
响应处理:根据HTTP响应码确认数据是否成功发送,便于后续调试。
串口输出:实时输出HTTP响应状态,帮助用户监控数据传输情况。
可扩展性:可以轻松添加更多传感器数据上传功能,丰富系统的功能。

3、获取新闻数据的API请求

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

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* newsApiUrl = "https://newsapi.org/v2/top-headlines?country=us&apiKey=YOUR_API_KEY"; // 新闻API

DeepSeek deepSeek;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("连接中...");
  }
  Serial.println("已连接 WiFi");
  
  deepSeek.begin();
}

void loop() {
  String newsResponse = getNews();
  Serial.println(newsResponse);
  delay(300000); // 每5分钟获取一次新闻
}

String getNews() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(newsApiUrl);
    int httpResponseCode = http.GET();

    if (httpResponseCode > 0) {
      String payload = http.getString();
      return payload; // 返回新闻数据
    } else {
      Serial.printf("HTTP错误: %s\n", http.errorToString(httpResponseCode).c_str());
      return "";
    }
    http.end();
  } else {
    Serial.println("WiFi未连接");
    return "";
  }
}

要点解读:

新闻API请求:使用HTTPClient库对新闻API进行GET请求,获取最新的新闻信息。
Wi-Fi连接:确保ESP32连接到互联网,以便能够访问API。
数据处理:根据HTTP响应码判断请求是否成功,并返回新闻数据的JSON格式。
串口输出:通过串口输出获取的新闻信息,便于用户了解最新动态。
灵活性:可以根据需求修改API参数,获取不同类别的新闻或来自不同国家的报道。

在这里插入图片描述

4、实时天气数据获取与显示

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

// WiFi配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// OpenWeatherMap API配置
const char* weather_api_key = "你的天气API密钥";
const char* weather_api_url = "https://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=";

// DeepSeek API配置
const char* deepseek_api_key = "你的DeepSeek API密钥";
const char* deepseek_api_url = "https://api.deepseek.com/v1/chat/completions";

// OLED显示配置(如需)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);
  
  // 初始化OLED(如需)
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306初始化失败"));
  }
  
  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("正在连接WiFi...");
  }
  Serial.println("WiFi已连接");
}

void loop() {
  // 获取天气数据
  String weatherData = getWeatherData();
  if (!weatherData.isEmpty()) {
    // 分析天气数据并获取建议
    String advice = analyzeWeatherWithDeepSeek(weatherData);
    Serial.println("DeepSeek建议: " + advice);
    
    // 显示在OLED上(如需)
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.println("天气建议:");
    display.println(advice);
    display.display();
  }
  
  delay(3600000); // 每小时更新一次
}

String getWeatherData() {
  HTTPClient http;
  http.begin(weather_api_url + weather_api_key);
  
  int httpResponseCode = http.GET();
  String payload = "";
  
  if (httpResponseCode > 0) {
    payload = http.getString();
  } else {
    Serial.print("获取天气数据失败,错误代码: ");
    Serial.println(httpResponseCode);
  }
  
  http.end();
  return payload;
}

String analyzeWeatherWithDeepSeek(String weatherData) {
  // 解析天气数据中的关键信息
  DynamicJsonDocument doc(4096);
  deserializeJson(doc, weatherData);
  
  float temperature = doc["main"]["temp"].as<float>() - 273.15; // 转换为摄氏度
  String description = doc["weather"][0]["description"].as<String>();
  
  // 构建请求数据
  String requestData = "{\"model\":\"deepseek-chat\",\"messages\":[";
  requestData += "{\"role\":\"system\",\"content\":\"你是一个智能生活助手。根据当前天气情况,提供实用的生活建议。\"},";
  requestData += "{\"role\":\"user\",\"content\":\"当前北京天气温度为" + String(temperature) + "°C,天气状况为" + description + "。请给出相应的生活建议。\"}]}";
  
  // 发送请求到DeepSeek API
  HTTPClient http;
  http.begin(deepseek_api_url);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", "Bearer " + String(deepseek_api_key));
  
  int httpResponseCode = http.POST(requestData);
  String response = "";
  
  if (httpResponseCode > 0) {
    response = http.getString();
    
    // 解析DeepSeek响应获取建议
    DynamicJsonDocument responseDoc(4096);
    deserializeJson(responseDoc, response);
    response = responseDoc["choices"][0]["message"]["content"].as<String>();
  } else {
    Serial.print("调用DeepSeek API失败,错误代码: ");
    Serial.println(httpResponseCode);
    response = "获取建议失败";
  }
  
  http.end();
  return response;
}

5、智能日程提醒与时间管理

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

// WiFi配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// DeepSeek API配置
const char* deepseek_api_key = "你的DeepSeek API密钥";
const char* deepseek_api_url = "https://api.deepseek.com/v1/chat/completions";

// RTC实时时钟
RTC_DS3231 rtc;

// 蜂鸣器引脚
const int buzzerPin = 12;

void setup() {
  Serial.begin(115200);
  
  // 初始化RTC
  if (!rtc.begin()) {
    Serial.println("RTC初始化失败");
  }
  
  // 初始化蜂鸣器
  pinMode(buzzerPin, OUTPUT);
  digitalWrite(buzzerPin, LOW);
  
  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("正在连接WiFi...");
  }
  Serial.println("WiFi已连接");
}

void loop() {
  // 获取当前时间
  DateTime now = rtc.now();
  String currentTime = String(now.hour()) + ":" + String(now.minute());
  
  // 每小时整点获取日程建议
  if (now.minute() == 0) {
    String schedule = getDailySchedule(now.hour());
    Serial.println("今日日程: " + schedule);
  }
  
  // 检查是否有提醒(示例:9:00提醒开会)
  if (now.hour() == 9 && now.minute() == 0) {
    triggerReminder("9:00 有会议,请准时参加");
  }
  
  delay(60000); // 每分钟检查一次
}

String getDailySchedule(int currentHour) {
  // 获取当前日期
  DateTime now = rtc.now();
  String date = String(now.year()) + "-" + String(now.month()) + "-" + String(now.day());
  
  // 构建请求数据
  String requestData = "{\"model\":\"deepseek-chat\",\"messages\":[";
  requestData += "{\"role\":\"system\",\"content\":\"你是一个智能日程助手。根据用户当前时间,生成合理的今日日程安排建议。\"},";
  requestData += "{\"role\":\"user\",\"content\":\"今天是" + date + ",现在是" + String(currentHour) + "点。请为我生成今日剩余时间的日程建议。\"}]}";
  
  // 发送请求到DeepSeek API
  HTTPClient http;
  http.begin(deepseek_api_url);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", "Bearer " + String(deepseek_api_key));
  
  int httpResponseCode = http.POST(requestData);
  String response = "";
  
  if (httpResponseCode > 0) {
    response = http.getString();
    
    // 解析DeepSeek响应获取建议
    DynamicJsonDocument responseDoc(4096);
    deserializeJson(responseDoc, response);
    response = responseDoc["choices"][0]["message"]["content"].as<String>();
  } else {
    Serial.print("调用DeepSeek API失败,错误代码: ");
    Serial.println(httpResponseCode);
    response = "获取日程失败";
  }
  
  http.end();
  return response;
}

void triggerReminder(String message) {
  Serial.println("提醒: " + message);
  
  // 蜂鸣器提醒
  for (int i = 0; i < 3; i++) {
    digitalWrite(buzzerPin, HIGH);
    delay(500);
    digitalWrite(buzzerPin, LOW);
    delay(500);
  }
  
  // 此处可添加OLED显示提醒或其他通知方式
}

6、智能设备控制与语音指令解析

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

// WiFi配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// DeepSeek API配置
const char* deepseek_api_key = "你的DeepSeek API密钥";
const char* deepseek_api_url = "https://api.deepseek.com/v1/chat/completions";

// 设备控制引脚
const int lightPin = 13;    // 灯光控制
const int fanPin = 12;      // 风扇控制
const int curtainPin = 14;  // 窗帘控制

void setup() {
  Serial.begin(115200);
  
  // 初始化SPIFFS(用于存储设备状态)
  if (!SPIFFS.begin(true)) {
    Serial.println("SPIFFS挂载失败");
  }
  
  // 初始化设备引脚
  pinMode(lightPin, OUTPUT);
  pinMode(fanPin, OUTPUT);
  pinMode(curtainPin, OUTPUT);
  
  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("正在连接WiFi...");
  }
  Serial.println("WiFi已连接");
  
  // 初始化设备状态(默认关闭)
  digitalWrite(lightPin, LOW);
  digitalWrite(fanPin, LOW);
  digitalWrite(curtainPin, LOW);
}

void loop() {
  // 模拟接收语音指令(实际应用中可通过语音模块获取)
  String voiceCommand = getVoiceCommand();
  
  if (!voiceCommand.isEmpty()) {
    Serial.println("收到指令: " + voiceCommand);
    
    // 解析指令并执行操作
    executeCommand(voiceCommand);
  }
  
  delay(2000); // 每2秒检查一次
}

String getVoiceCommand() {
  // 实际应用中应通过语音识别模块获取
  // 此处仅为示例,随机返回预设指令
  static int commandIndex = 0;
  const char* commands[] = {
    "打开客厅灯",
    "关闭风扇",
    "打开窗帘",
    "降低灯光亮度",
    "调节温度到25度"
  };
  
  // 每10次循环返回一个指令,模拟用户输入
  if (++commandIndex % 10 == 0) {
    return String(commands[random(0, 5)]);
  }
  
  return "";
}

void executeCommand(String command) {
  // 构建请求数据
  String requestData = "{\"model\":\"deepseek-chat\",\"messages\":[";
  requestData += "{\"role\":\"system\",\"content\":\"你是一个智能家居控制助手。解析用户语音指令,提取设备名称、操作类型和参数,并生成JSON格式响应。\"},";
  requestData += "{\"role\":\"user\",\"content\":\"语音指令: " + command + "\"}]}";
  
  // 发送请求到DeepSeek API
  HTTPClient http;
  http.begin(deepseek_api_url);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", "Bearer " + String(deepseek_api_key));
  
  int httpResponseCode = http.POST(requestData);
  String response = "";
  
  if (httpResponseCode > 0) {
    response = http.getString();
    
    // 解析DeepSeek响应并执行控制
    DynamicJsonDocument responseDoc(4096);
    deserializeJson(responseDoc, response);
    
    // 提取解析后的指令(假设格式: {"device":"灯","action":"打开","parameter":""})
    String device = responseDoc["choices"][0]["message"]["content"]["device"].as<String>();
    String action = responseDoc["choices"][0]["message"]["content"]["action"].as<String>();
    String parameter = responseDoc["choices"][0]["message"]["content"]["parameter"].as<String>();
    
    // 执行设备控制
    controlDevice(device, action, parameter);
  } else {
    Serial.print("调用DeepSeek API失败,错误代码: ");
    Serial.println(httpResponseCode);
  }
  
  http.end();
}

void controlDevice(String device, String action, String parameter) {
  Serial.printf("控制设备: %s, 操作: %s, 参数: %s\n", device.c_str(), action.c_str(), parameter.c_str());
  
  // 实际设备控制逻辑
  if (device.indexOf("灯") != -1) {
    if (action.indexOf("打开") != -1) {
      digitalWrite(lightPin, HIGH);
    } else if (action.indexOf("关闭") != -1) {
      digitalWrite(lightPin, LOW);
    }
    // 亮度调节逻辑可在此扩展
  } else if (device.indexOf("风扇") != -1) {
    if (action.indexOf("打开") != -1) {
      digitalWrite(fanPin, HIGH);
    } else if (action.indexOf("关闭") != -1) {
      digitalWrite(fanPin, LOW);
    }
  } else if (device.indexOf("窗帘") != -1) {
    if (action.indexOf("打开") != -1) {
      digitalWrite(curtainPin, HIGH);
    } else if (action.indexOf("关闭") != -1) {
      digitalWrite(curtainPin, LOW);
    }
  }
}

要点解读
API 请求与响应处理
请求构建:使用 HTTPClient 库发送 HTTP 请求,设置正确的 URL、请求头和 JSON 格式数据
响应解析:通过 ArduinoJson 库解析 API 返回的 JSON 数据,提取关键信息
示例:案例 1 中解析天气数据的温度和描述字段,案例 3 中解析设备控制指令
网络连接可靠性
重连机制:在 setup () 中实现 WiFi 连接,在 loop () 中定期检查连接状态
超时处理:为 HTTP 请求设置合理的超时时间,避免程序阻塞
错误处理:捕获 HTTP 响应错误码,记录并处理异常情况
数据安全与隐私保护
API 密钥管理:将敏感信息(API 密钥)存储为常量,避免硬编码在公开代码中
传输安全:使用 HTTPS 协议确保数据传输加密,防止中间人攻击
数据最小化:仅上传必要的请求数据,避免泄露用户隐私
DeepSeek 模型集成
提示工程设计:通过 system 消息明确 AI 角色和任务要求,引导模型生成期望格式的响应
多轮对话:在案例 3 中展示了如何通过单个请求实现复杂指令解析
响应格式规范:设计 JSON 格式的响应结构,便于 ESP32 解析和执行
资源优化与性能平衡
请求频率控制:通过合理设置 delay () 避免频繁 API 调用,降低流量和成本
内存管理:使用 DynamicJsonDocument 处理 JSON 数据,根据实际需求调整缓冲区大小
异步处理:在复杂应用中可结合 FreeRTOS 或 uasyncio 实现异步 API 请求,提高系统响应性

扩展建议
添加本地缓存:在 ESP32 的 SPIFFS 中存储常用数据,减少 API 调用频率
实现 OTA 更新:通过网络远程更新 ESP32 固件,方便功能升级
多 API 协同:组合多个 API(如天气 + 日程)实现更复杂的智能场景
异常处理增强:添加网络中断自动重连、API 限流应对等机制

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

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐