找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3432

积分

0

好友

451

主题
发表于 2026-2-14 06:54:19 | 查看: 32| 回复: 0

作为一个电子DIY爱好者,最近突然想整点儿没用但好玩的小东西——用ESP32-C3开发板实现自动+手动获取毒鸡汤文案,全程不需要自己写一行代码,全靠AI手把手搞定,主打一个“偷懒但高效”。

先交代下主角:ESP32-C3-DevKitM-1开发板。

ESP32-C3-DevKitM-1开发板实物图

别看它个头小,连接WiFi、发起HTTP GET请求、解析JSON样样能扛,堪称性价比天花板。

需求很简单,主打一个“摆烂”

我的核心诉求就3个:

  1. 让开发板连上家里的WiFi(手机开的热点),注意一定要是2.4G频段的,5G的这小家伙还不支持。
  2. 能定时(3秒一次)从网上获取毒鸡汤,也能通过按键来主动触发,主打鸡汤想喝就喝;
  3. 把获取的毒鸡汤通过串口打印出来,主打一个“精神暴击”。

全程躺平,AI是主力

现在写代码哪儿还用自己吭哧吭哧抠?第一步,先搜索“毒鸡汤API接口”。

毒鸡汤API接口搜索结果页面

随手找到一个能用的免费接口:https://v2.xxapi.cn/api/dujitang

毒鸡汤API接口文档详情页

通过浏览器的开发者工具(F12)查看请求细节,可以看到这是一个简单的GET请求,返回的JSON格式也很规整。

API请求网络调试详情截图

第二步,直接把需求甩给AI:“帮我用ESP32-C3-DevKitM-1实现WiFi连接、API请求、JSON解析,还要按键触发+3秒定时,串口输出毒鸡汤”。

一开始AI生成的代码有坑,比如GPIO引脚不对、手动触发卡死等。但经过两轮“调教”之后,AI不仅把ESP32-C3的GPIO9(BOOT键)特性考虑到了,还顺手修复了HTTPS超时、中断防抖这些细节,甚至连JSON解析的字段都精准匹配了API返回格式:

{"code":200,"msg":"数据请求成功","data":"毒鸡汤内容","request_id":"xxx"}

整个过程直接省去了查文档、调试BUG的时间,充分体验了AI辅助编程的效率。

Arduino IDE代码上传与编译过程截图

效果超预期,主打一个“精准投喂”

在Arduino IDE中新建工程,如果提示报错,可能是没添加对应的开发板支持,或者缺少必要的库,按提示安装即可。

接下来就是CV工程师的看家本领:复制、粘贴、编译、上传。代码上传后,开发板秒连WiFi,串口监视器里每隔3秒就蹦出一碗新鲜的毒鸡汤:

"春节你要小心了,毕竟过年,都是要杀猪的。"

"今天的你,依然是个没有感情的打工机器。"

"世上什么事逼急了,都能做出来,除了数学题。"

"你以为向生活低头就好了?生活是想让你跪下。"

"为什么在学校,一上课就想睡觉?因为学校是梦开始的地方。"

"有钱人可以选择低调,而你,却只能低调。"

短按板载的BOOT键还能手动触发刷新,想“emo”随时加更,主打一个情绪自由。

ESP32-C3串口输出毒鸡汤内容日志

总结:懒人DIY的正确打开方式

以前搞个小项目,光查ESP32的WiFi库、HTTPClient的用法就得半天。现在,只要你能清晰描述需求,AI就能把完整代码、详细注释甚至避坑指南都给你,开发者只需要确认硬件型号、替换WiFi密码,剩下的就是享受成果。

可以说,借助AI工具,物联网开发和一些趣味项目的门槛正在变低。你负责构思,AI辅助实现,硬件负责运行,整个过程充满了“躺平式开发”的快乐。

附个小彩蛋:如果你的ESP32-C3按键触发出现卡死,大概率是GPIO9的BOOT键特性问题,让AI帮忙调整一下中断触发方式和防抖逻辑,分分钟就能搞定。

ESP32-C3-DevKitM-1开发板型号标识特写

项目完整代码

以下是经过AI调试优化后的最终代码,涵盖了WiFi连接、定时/手动触发、API请求和JSON解析等核心计算机基础功能:

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

// ====================== 配置参数(已更新WiFi和按键) ======================
// WiFi配置(已替换为你的信息)
const char* WIFI_SSID = "iPhone14";    // 你的WiFi名称
const char* WIFI_PWD  = "WeChat:mcu149";    // 你的WiFi密码
// API配置
const char* API_URL = "https://v2.xxapi.cn/api/dujitang";
// 按键配置(改为GPIO9,禁用中断防抖的delay)
const int KEY_PIN = 9;
// 定时配置
const unsigned long AUTO_REFRESH_INTERVAL = 3000;  // 3秒自动刷新
const unsigned long HTTP_TIMEOUT = 5000;           // HTTP请求超时5秒

// ====================== 全局变量 ======================
unsigned long lastRefreshTime = 0;
bool needRefresh = false;
unsigned long lastKeyPressTime = 0;  // 按键防抖时间戳(替代中断里的delay)

// ====================== 核心函数:WiFi连接 ======================
void connectWifi() {
  Serial.print("正在连接WiFi: ");
  Serial.println(WIFI_SSID);

  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PWD);

  // 等待连接(超时10秒)
  int retryCount = 0;
  while (WiFi.status() != WL_CONNECTED && retryCount < 10) {
    delay(1000);
    Serial.print(".");
    retryCount++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nWiFi连接成功!");
    Serial.print("IP地址: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("\nWiFi连接失败,请检查SSID和密码!");
  }
}

// ====================== 核心函数:请求API并解析JSON(修复HTTPS卡死) ======================
void requestAndParseDujitang() {
  // 检查WiFi是否已连接
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("❌ WiFi未连接,跳过请求");
    connectWifi();
    return;
  }

  HTTPClient http;
  Serial.print("🔍 发起API请求: ");
  Serial.println(API_URL);

  // 关键修复:HTTPS添加超时+关闭证书校验(解决卡死)
  http.begin(API_URL);
  http.setTimeout(HTTP_TIMEOUT);          // 设置请求超时
  http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
#ifdef ESP32
    http.getStream().setTimeout(HTTP_TIMEOUT);  // 数据流超时
#endif

  int httpCode = http.GET();

  // 处理响应
  if (httpCode == HTTP_CODE_OK) {
    String response = http.getString();
    Serial.println("✅ API请求成功,返回数据:");
    Serial.println(response);

    // 解析JSON(匹配你的格式)
    DynamicJsonDocument doc(1024);
    DeserializationError error = deserializeJson(doc, response);

    if (error) {
      Serial.print("❌ JSON解析失败: ");
      Serial.println(error.c_str());
    } else {
      int code = doc["code"];
      String msg = doc["msg"];
      String dujitangContent = doc["data"];
      String requestId = doc["request_id"];

      Serial.println("\n📝 解析结果:");
      Serial.print("状态码: "); Serial.println(code);
      Serial.print("提示信息: "); Serial.println(msg);
      Serial.print("毒鸡汤内容: "); Serial.println(dujitangContent);
      Serial.print("请求ID: "); Serial.println(requestId);
    }
  } else {
    Serial.print("❌ API请求失败,状态码: ");
    Serial.println(httpCode);
  }

  // 必须释放资源
  http.end();
  Serial.println("------------------------");
}

// ====================== 按键中断处理函数(修复防抖,移除delay) ======================
void keyInterruptHandler() {
  unsigned long currentTime = millis();
  // 防抖:仅当两次按键间隔>200ms才触发
  if (currentTime - lastKeyPressTime > 200) {
    needRefresh = true;
    lastKeyPressTime = currentTime;
    Serial.println("\n🔘 检测到按键触发,立即刷新!");
  }
}

// ====================== 初始化函数 ======================
void setup() {
  Serial.begin(115200);
  while (!Serial);

  // 初始化GPIO9按键(上拉输入,适配BOOT键)
  pinMode(KEY_PIN, INPUT_PULLUP);
  // 关键:GPIO9用RISING触发(适配BOOT键电平特性,避免误触发)
  attachInterrupt(digitalPinToInterrupt(KEY_PIN), keyInterruptHandler, RISING);

  // 连接WiFi
  connectWifi();

  lastRefreshTime = millis();
  Serial.println("\n✅ 初始化完成,开始定时/手动刷新(3秒间隔)");
  Serial.println("------------------------");
}

// ====================== 主循环函数 ======================
void loop() {
  unsigned long currentTime = millis();

  // 1. 定时刷新
  if (currentTime - lastRefreshTime >= AUTO_REFRESH_INTERVAL) {
    requestAndParseDujitang();
    lastRefreshTime = currentTime;
    needRefresh = false;
  }

  // 2. 手动按键触发
  if (needRefresh) {
    requestAndParseDujitang();
    lastRefreshTime = currentTime;
    needRefresh = false;
  }

  delay(10);  // 降低CPU占用
}

这个项目展示了如何将现成的API、开源的硬件平台与智能的AI工具结合起来,快速实现一个有趣的小应用。如果你有更多类似的IoT奇思妙想,欢迎到云栈社区的开发者广场一起交流探讨。




上一篇:精选19个FPGA开源项目:从USB控制器到FOC算法,你的学习宝库
下一篇:开发者如何选择:KIMI K2.5、MiniMax M2.5与GPT-5.3-Codex编程能力对比
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 12:57 , Processed in 0.505809 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表