这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 任务一、使用AI写颜色传感器代码并实现校准和识别功能

共1条 1/1 1 跳转至

任务一、使用AI写颜色传感器代码并实现校准和识别功能

菜鸟
2025-12-16 22:11:28     打赏

首先,我们来复制一个简单的esp32工程项目作为基础工程,然后加载idf环境准备开启AI编程。

image.png打开两个终端的原因是,我们需要在左边使用AI编程,右边烧录测试结果。

现在我们在网络上找到自己感觉还可以的颜色传感器的代码,复制到项目里。就像我这样

image.png

然后告诉AI要怎样做,就坐等代码出现吧。输入我们的要求后,就可以慢慢等AI完成了。

image.png

接下来,还需要提出一些方向性的指导,比如要求它生成一个标准化的esp32组件

image.png

并要求它对外的头文件仅包含外部需要使用的函数

image.png很快,AI就生成好了相关的代码,并生成了相关的说明文档。

image.pngimage.png接下来,让AI使用这个组件,并编译测试,需要告诉AI智能体使用什么编译指令,以及环境是否已加载(防呆)

image.png在接下来的过程里,AI会自己编译并修复相关的错误,例如类型错误,缺少函数(自己写或者找SDK里有没有相关的API),API不匹配等等问题,大部分时候AI智能体代理都能自动解决。

image.png最后,AI智能体代理会完成这个传感器案例使用的修改和调整,输出以下的内容

image.png

我们需要在右边的命令行终端尝试编译,看看AI智能体代理有没有撒谎,这次也是顺利编译完成了。

接下来,我们直接拿出开发板,并接线、烧录测试就可以了。

由于这个颜色传感器是需要校准的,还需要反复和AI沟通校准和通信的问题。最终产出的代码如下main.c:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "tcs3200.h"

static const char *TAG = "TCS3200_MAIN";

// 中国传统色彩识别(包含70+传统色彩)
static const char* get_chinese_color_name(uint8_t r, uint8_t g, uint8_t b, const char* western_name) {
    // === 红色系传统色 ===
    if (r > 200) {
        if (g < 50 && b < 50) return "中国红";    // 国旗红
        if (g < 80 && b < 80) return "朱砂红";    // 朱砂矿物红
        if (g < 100 && b < 100) return "胭脂红";  // 古代胭脂
        if (g < 50 && b < 100) return "牡丹红";    // 牡丹花红
        if (g < 100 && b < 50) return "樱桃红";    // 樱桃果红
        if (g > 100 && b < 100) return "石榴红";   // 石榴籽红
        if (g < 100 && b > 100) return "玫瑰红";   // 玫瑰花红
        if (g > 50 && g < 150 && b > 50 && b < 150) return "妃色"; // 帝王妃子服色
        if (g > 80 && b < 80) return "珊瑚红";    // 珊瑚色
    }

    // === 黄色系传统色 ===
    if (r > 200 && g > 180) {
        if (b < 50) return "明黄";        // 皇室明黄
        if (b < 100) return "金黄";       // 金器金黄
        if (b < 150) return "橙黄";       // 橙子橙黄
        if (r > 230 && g > 230) return "杏黄";    // 杏子黄
        if (r > 220 && g > 200) return "鹅黄";     // 鹅毛黄
        if (r > 180 && g > 160 && b > 50) return "赭石色"; // 赭石矿物
        if (g > 200 && b < 100) return "柠檬黄";   // 柠檬黄
    }

    // === 绿色系传统色 ===
    if (g > 150) {
        if (r < 80 && b < 80) return "竹青";      // 竹子青绿
        if (r < 100 && b < 100) return "翡翠绿";   // 翡翠宝石绿
        if (r < 120 && b < 120) return "松柏绿";   // 松柏深绿
        if (b > 120 && r < 100) return "青瓷绿";   // 青瓷器绿
        if (r > 100 && b < 100) return "苔藓绿";   // 苔藓绿
        if (b > 100 && r > 100) return "春绿";     // 春天新绿
        if (g > 200) return "碧绿";       // 碧玉绿
    }

    // === 蓝色系传统色 ===
    if (b > 150) {
        if (r < 50 && g < 50) return "群青";      // 深海群青
        if (r < 80 && g < 80) return "靛蓝";      // 靛染植物蓝
        if (r < 100 && g < 100) return "藏青";     // 西藏藏青
        if (r < 100 && g > 100) return "天青";     // 天空青蓝
        if (r > 100 && g < 100) return "宝蓝";     // 宝石蓝
        if (r > 120 && g > 120) return "湖蓝";     // 湖水蓝
        if (g > 150) return "蔚蓝";      // 天空蔚蓝
    }

    // === 紫色系传统色 ===
    if (r > 120 && g < 120 && b > 120) {
        return "紫檀"; // 紫檀木紫
    }
    if (r > 140 && g < 100 && b > 140) {
        return "丁香紫"; // 丁香花紫
    }

    // === 褐色系传统色 ===
    if (r > 120 && g > 80 && b < 80 && r > g && g > b) {
        if (r > 160) return "琥珀色";     // 琥珀褐色
        if (r > 140) return "咖啡色";     // 咖啡色
        return "赭石色"; // 赭石矿物
    }
    if (r > 150 && g < 100 && b < 100) return "赤褐色"; // 赤褐色
    if (r > 120 && g > 100 && b < 80) return "茶褐色";  // 茶叶褐色
    if (r > 140 && g > 100 && b < 60) return "栗色";   // 栗子色

    // === 灰色系传统色 ===
    if (r > 100 && r < 200 && g > 100 && g < 200 && b > 100 && b < 200) {
        if (r > 180) return "月白";      // 月光白色
        if (r > 160) return "银灰";      // 银器灰色
        if (r > 140) return "苍色";      // 天空苍色
        if (r < 140) return "墨灰";      // 墨汁灰色
        return "铅灰"; // 铅器灰色
    }

    // === 白色系传统色 ===
    if (r > 230 && g > 230 && b > 230) {
        if (r > 250) return "雪白";      // 雪花白
        return "宣纸白"; // 宣纸白色
    }

    // === 黑色系传统色 ===
    if (r < 50 && g < 50 && b < 50) {
        return "墨黑"; // 墨汁黑色
    }

    // === 特殊传统色 ===
    if (r > 200 && g > 140 && b < 80) return "琥珀色"; // 琥珀色
    if (r > 180 && g > 120 && b < 60) return "朱标色"; // 印章朱标
    if (r > 160 && g > 140 && b < 100) return "象牙色"; // 象牙色
    if (r > 140 && g > 100 && b < 50) return "古铜色"; // 青铜器色

    // === 淡雅色彩 ===
    if (r > 180 && g > 170 && b > 160) return "粉黛"; // 古代粉黛
    if (r > 200 && g > 180 && b > 170) return "胭脂水"; // 淡胭脂色

    return western_name; // 回退到西方色彩名称
}

void app_main(void)
{
    ESP_LOGI(TAG, "=== TCS3200 颜色传感器测试程序 ===");
    ESP_LOGI(TAG, "硬件连接说明:");
    ESP_LOGI(TAG, "  TCS3200 S0 → GPIO18");
    ESP_LOGI(TAG, "  TCS3200 S1 → GPIO17");
    ESP_LOGI(TAG, "  TCS3200 S2 → GPIO16");
    ESP_LOGI(TAG, "  TCS3200 S3 → GPIO15");
    ESP_LOGI(TAG, "  TCS3200 OUT → GPIO14");
    ESP_LOGI(TAG, "  TCS3200 VCC → 3.3V/5V");
    ESP_LOGI(TAG, "  TCS3200 GND → GND");

    // 声明传感器句柄
    tcs3200_handle_t sensor;

    // 初始化传感器
    ESP_LOGI(TAG, "正在初始化TCS3200颜色传感器...");
    esp_err_t ret = tcs3200_init(&sensor);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "传感器初始化失败: %s", esp_err_to_name(ret));
        return;
    }
    ESP_LOGI(TAG, "✅ 传感器初始化成功!");

    // 设置频率缩放为20%(默认设置)
    ret = tcs3200_set_freq_scaler(&sensor, TCS3200_SCALE_20_PCT);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "设置频率缩放失败: %s", esp_err_to_name(ret));
        tcs3200_deinit(&sensor);
        return;
    }
    ESP_LOGI(TAG, "✅ 频率缩放设置为20%%");

    // 执行白平衡校准(新功能)
    ESP_LOGI(TAG, "										

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]