云天 发表于 3 天前

ESP32-S3 AI智能摄像头模块Mind+图形化编程实践



【项目背景】
最近,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;
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 = 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;
                        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"]["message"]["content"];
                if (messageCount < maxMessages) {
                        chatmessages = 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 = chatmessages;
                                }
                                chatmessages =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);
                }
}

【演示视频】
https://www.bilibili.com/video/BV1zbZHY1E89/?share_source=copy_web

feng0539 发表于 前天 00:05

早知道你写库我也申请试用试用

rzegkly 发表于 昨天 08:23

ESP32-S3 AI智能摄像头模块买一个,一起学习,一起交流
页: [1]
查看完整版本: ESP32-S3 AI智能摄像头模块Mind+图形化编程实践