本教程将详细介绍如何使用ESP32连接到互联网,并通过Google的Gemini API发送问题并获取回答。我们将使用以下库:WiFi库、HTTPClient库和ArduinoJson库。
注意:你的网络需要支持科学上网,才能正常访问接口,如果不支持,那就不行哈。不管支不支持,回复一下支持一下作者呗,谢谢!!
一、准备工作
- 硬件:
- 一块支持WiFi的Arduino开发板(如ESP32或ESP8266)
- USB数据线
- 电脑(用于编写和上传代码)
- 软件:
- Arduino IDE
- Arduino库:WiFi、HTTPClient、ArduinoJson
二、设置Arduino IDE
- 打开Arduino IDE,确保已安装所需的库。如果没有安装,可以通过“库管理器”进行安装:
- WiFi库:对于ESP32和ESP8266,这些库已经内置。
- HTTPClient库:可以在“库管理器”中搜索并安装。
- ArduinoJson库:可以在“库管理器”中搜索并安装。
- 打开Arduino IDE,选择您的开发板和端口。对于ESP32,选择“工具” -> “开发板” -> “ESP32 Dev Module”,然后选择正确的端口。
三、编写代码
在Arduino IDE中,创建一个新的草稿,并复制以下代码:
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "SSID"; // 替换为您的WiFi SSID
const char* password = "PASS"; // 替换为您的WiFi密码
const char* Gemini_Token = "GEMINI_API_KEY"; // 替换为您的Gemini API密钥
const char* Gemini_Max_Tokens = "100"; // 最大返回Token数
String res = ""; // 用于存储输入的问题
void setup() {
Serial.begin(115200); // 初始化串口通讯
WiFi.mode(WIFI_STA); // 设置WiFi为客户端模式
WiFi.disconnect(); // 断开所有WiFi连接
// 等待串口连接
while (!Serial);
// 连接到WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // 打印设备的IP地址
}
void loop()
{
Serial.println("");
Serial.println("Ask your Question : ");
while (!Serial.available()); // 等待用户输入
while (Serial.available()) {
char add = Serial.read();
res = res + add;
delay(1);
}
int len = res.length();
res = res.substring(0, (len - 1));
res = """ + res + """;
Serial.println("");
Serial.print("Asking Your Question : ");
Serial.println(res);
HTTPClient https;
if (https.begin("https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=" + (String)Gemini_Token)) {
https.addHeader("Content-Type", "application/json");
String payload = String("{"contents": [{"parts":[{"text":" + res + "}]}],"generationConfig": {"maxOutputTokens": " + (String)Gemini_Max_Tokens + "");
int httpCode = https.POST(payload);
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
String Answer = doc["candidates"][0]["content"]["parts"][0]["text"];
// 过滤特殊字符、空白字符和换行符
Answer.trim();
String filteredAnswer = "";
for (size_t i = 0; i < Answer.length(); i++) {
char c = Answer[i];
if (isalnum(c) || isspace(c)) {
filteredAnswer += c;
} else {
filteredAnswer += ' ';
}
}
Answer = filteredAnswer;
Serial.println("");
Serial.println("Here is your Answer: ");
Serial.println("");
Serial.println(Answer);
} else {
Serial.printf("[HTTPS] GET... failed, error: %sn", https.errorToString(httpCode).c_str());
}
https.end();
} else {
Serial.printf("[HTTPS] Unable to connectn");
}
res = "";
}
四、修改代码
- 将
const char* ssid = "SSID";
替换为您的WiFi名称。 - 将
const char* password = "PASS";
替换为您的WiFi密码。 - 将
const char* Gemini_Token = "GEMINI_API_KEY";
替换为您的Gemini API密钥。(获取秘钥地址:https://ai.google.dev/gemini-api?hl=zh-cn)
五、上传代码
- 将Arduino板通过USB线连接到电脑。
- 在Arduino IDE中,点击“上传”按钮,将代码上传到开发板。
六、测试程序
- 打开Arduino IDE的“串口监视器”。
- 设置波特率为115200。
- 在串口监视器中,您将看到连接WiFi的过程,成功连接后会显示设备的IP地址。
- 在串口监视器中输入您的问题并按下回车键。
- 程序将会向Gemini API发送问题并返回答案,答案将显示在串口监视器中。
七、详细步骤与示例
1. 连接到WiFi
上传代码后,打开串口监视器。您将看到类似如下的信息:
Connecting to Your_SSID
....
connected
IP address: 192.168.1.2
这表示设备已成功连接到指定的WiFi网络,并显示了设备的IP地址。
2. 输入问题
在串口监视器中输入您的问题并按下回车键:
Ask your Question :
What is the capital of China?
此时,程序会读取您的输入,并将问题发送到Google Gemini API。
3. API响应
程序会处理API的响应,并在串口监视器中显示答案:
Here is your Answer:
The capital of China is Beijing.
这表示API成功返回了问题的答案。
八、常见问题与解决方法
- 无法连接WiFi:
- 确保SSID和密码正确无误。
- 确认WiFi网络正常工作。
- 检查Arduino板是否支持WiFi功能。
- API请求失败:
- 确认API密钥正确无误。
- 检查网络连接是否正常。
- 确认API服务可用。
- 串口监视器无输出:
- 确认波特率设置为115200。
- 确认已选择正确的端口和开发板。
通过以上步骤,您已经成功编写并运行了一个可以通过Google Gemini API获取回答的Arduino程序。如果在过程中遇到任何问题,请检查您的网络连接和API密钥是否正确配置,并参考常见问题与解决方法进行排查。