【项目背景】
最近,DF创客社区公布了ESP32-S3 AI智能摄像头模块的试用名单,这次的名额比之前发布的申请名额多了很多(我记得只有8个),真是令人振奋!我之前就提前入手了一块ESP32-S3 AI智能摄像头模块,仔细研究了“产品维库”文档后,发现它的功能非常丰富。于是,我立刻按照教程用Arduino IDE编写了一个项目,并撰写了相关文章。然而,对于学生来说,直接用代码编写程序可能会有一些难度。因此,我尝试使用Mind+图形化编程来为ESP32-S3 AI智能摄像头模块编写程序。虽然我的能力有限,目前只实现了部分功能,但我已经将这些内容发布到Gitee上,供大家参考和共同研究,希望我们一起努力,丰富和完善它的功能。
【项目设计】
在最新版本的Mind+软件中,上传模式下可以加载主控行空板K10。行空板K10和ESP32-S3 AI智能摄像头模块都搭载了ESP32-S3芯片。基于这一点,我开始思考是否可以将ESP32-S3 AI智能摄像头模块作为扩展模块来使用。于是,我着手进行了一系列的尝试和开发。
【实现功能】
目前,我已经成功实现了以下功能:
连接WiFi热点:设备可以连接到指定的WiFi网络,实现网络通信功能。
点亮板载LED灯:通过控制GPIO引脚,点亮板载的LED灯,用于指示程序运行状态或作为交互反馈。
检测按键Boot是否按下:程序可以检测Boot按键的状态,当按键被按下时触发相应的操作。
存储文本到SD卡文件:可以将文本内容写入到SD卡的指定文件中,方便数据存储和记录。
读取SD卡文件文本内容:能够从SD卡文件中读取存储的文本内容,用于后续处理或显示。
与Kimi模型进行对话:通过调用Kimi模型的API接口,实现与AI模型的对话功能,获取智能回复。
【项目展望】
虽然目前只实现了部分功能,但我相信这只是开始。未来,我将继续探索更多功能的实现,例如图像识别、音频流视频流传输等,充分发挥ESP32-S3 AI智能摄像头模块的潜力。同时,我也希望更多的人能够加入到这个项目中来,共同研究和开发,让这个项目变得更加完善和强大。
【扩展加载】
ESP32-S3 AI智能摄像头模块用户库:https://gitee.com/yuntian365/ESP32-S3-AI,进行扩展加载。
ESP32-S3 Kimi用户库:https://gitee.com/yuntian365/esp32-s3_-kimi,进行扩展加载。
【程序示例】
图形程序
这段程序是一个基于ESP32-S3开发板的应用程序,主要功能是通过WiFi连接到网络,调用一个指定Kimi的API(https://api.moonshot.cn/v1/chat/completions)进行聊天交互,并将聊天结果存储到SD卡中,同时通过串口输出结果。
程序代码:
- /*!
- * MindPlus
- * esp32s3bit
- *
- */
- int led = 3;
- #include <WiFi.h>
- #include <HTTPClient.h>
- #include <ArduinoJson.h>
- #include <SPI.h>
- #include "FS.h"
- #include <SD_MMC_yuntian.h>
- const uint8_t SD_CMD = 11;
- const uint8_t SD_CLK = 12;
- const uint8_t SD_DATA0 = 13;
- void writeFile(fs::FS &fs, const char * path, const char * message){
- File file = fs.open(path, FILE_WRITE);
- if(!file){
- return;
- }
- file.print(message);
- }
- String readFile(fs::FS &fs, const char * path){
-
- String temp="";
- String text="";
- File file = fs.open(path);
- if(!file){
- return "";
- }
-
-
- while(file.available()){
- temp=(char)file.read();
- text=text+ temp;
- }
- return text;
- }
-
- // 动态变量
- String mind_s_FanHuiJieGuo;
- // 创建对象
- HTTPClient http;
- DynamicJsonBuffer jsonBuffer;
- String model="moonshot-v1-8k";
- float temperature=0.3;
- String chatmessages[10];
- int messageCount = 1;
- int maxMessages = 10;
-
-
- // 主程序开始
- void setup() {
- pinMode(led,OUTPUT);
- SD_MMC.setPins(SD_CLK, SD_CMD, SD_DATA0);
- SD_MMC.begin("/sdcard", true);
- const char *ssid = "sxs";
- const char *password = "*****";
- WiFi.begin(ssid, password);
- http.begin("https://api.moonshot.cn/v1/chat/completions");
- http.addHeader("Content-Type", "application/json");
- http.addHeader("Authorization", "Bearer *****");
- chatmessages[0] = R"({"role":"system","content":"你是Kimi,你更擅长中文对话。"})";
- pinMode(0, INPUT);
- digitalWrite(led,HIGH);
- Serial.begin(115200);
- while (!(WiFi.status() == WL_CONNECTED)) {}
- digitalWrite(led,LOW);
- }
- void loop() {
- if (!digitalRead(0)) {
- digitalWrite(led,HIGH);
- maxMessages=5;
-
- String mydata = String(R"({"model":")")+model+String(R"(","temperature":)")+String(temperature)+String(R"(,"messages":[)");
- for (int i = 0; i < messageCount; i++) {
- mydata += chatmessages[i];
- if (i < messageCount ) {
- mydata += ",";
- }
- }
- mydata += String(R"({"role":"user","content":" )") + "你好,AI" +String(R"(,字数为)")+150+ String(R"(字"})");
-
- mydata += String("]}");
- http.POST(mydata);
- String jsonString=http.getString();
- JsonObject& root = jsonBuffer.parseObject(jsonString);
- String text = root["choices"][0]["message"]["content"];
- if (messageCount < maxMessages) {
- chatmessages[messageCount] = String(R"({"role":"user","content":" )") + "你好,AI" +String(R"(,字数为)")+150+ String(R"(字"},)")+String(R"({"role":"assistant","content":" )") + text + String(R"("})");
- messageCount++;
- } else {
- for (int i = 0; i < maxMessages - 1; i++) {
- chatmessages[i] = chatmessages[i + 1];
- }
- chatmessages[maxMessages - 1] = String(R"({"role":"user","content":" )") + "你好,AI" +String(R"(,字数为)")+150+ String(R"(字"},)")+String(R"({"role":"assistant","content":" )") + text + String(R"("})");
- }
-
- mind_s_FanHuiJieGuo = text;
- Serial.println(mind_s_FanHuiJieGuo);
- writeFile(SD_MMC, "/hello.txt", (mind_s_FanHuiJieGuo.c_str()));
- Serial.println(readFile(SD_MMC, "/hello.txt"));
- digitalWrite(led,LOW);
- }
- }
复制代码
【演示视频】
|