AI脑洞板
完整教案
自学课件
第 27 课 · 共 27/51 课

AI 看图 · 你画我猜 你画我猜

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
无
配套代码
见项目 demo 目录

一、先玩起来:让板子"长眼睛"

烧录 demo01_draw_guess(需要 WiFi + 密钥,见 README)。屏幕上是一张"白纸",下面是两个按钮:蓝色 Guess(问号) 和 灰色 Clear(X)。

用指头在白纸上画一个太阳(一个大圆 + 周围几条短线),点一下蓝色 "Guess" 按钮。屏幕先变成深蓝、写着 "AI guessing...",然后弹窗里出现 — 它猜出"太阳"了!还会开口念:"我猜你画的是,太阳。"

别急着画下一张,先记三件事:

  1. 点 Guess 后,屏幕先变成什么、再变成什么?
  2. 猜出来的结果是中文还是英文?
  3. 它念出来的那句,是不是"我猜你画的是,xxx"?

二、AI 是怎么"看见"的:记住"图要先变信"

AI 没有眼睛,它在云端的服务器里,看不见你的屏幕。它怎么知道你在画太阳?因为板子把你的画变了一封信(一串数据) 寄给它。这封信是这么做的:

flowchart LR
    A[1 内存画布<br/>画笔画进 PSRAM<br/>uint16_t canvas] --> B[2 缩图+包 PNG<br/>240x320 缩到 120x160<br/>RGB565→RGB888]
    B --> C[3 译成 base64<br/>图片变一长串<br/>字母数字]
    C --> D[4 塞进 HTTP 信封<br/>手动拼 JSON<br/>WiFi 寄给火山]
    D --> E[5 视觉模型猜画<br/>云端·看小图<br/>直接说答案]
    E --> F[6 显示+念出来<br/>中文字体+百度 TTS]
    style A fill:#22d3ee,color:#131a22
    style B fill:#22d3ee,color:#131a22
    style C fill:#22d3ee,color:#131a22
    style D fill:#22d3ee,color:#131a22
    style F fill:#22d3ee,color:#131a22
    style E fill:#f472b6,color:#131a22
步骤谁在做在哪里干了什么
1 内存画布板子PSRAM手指每画一笔,同步写进 canvas(240×320 的 RGB565 数组)
2 缩图 + 包 PNG板子PSRAM240×320 缩到 120×160,RGB565 转 RGB888,手动拼成一张 PNG
3 译成 base64板子内存把 PNG 字节译成一串字母数字
4 塞进 HTTP 信封板子WiFiHTTP POST JSON 到火山 Ark,带上提示词 + 这张图
5 视觉模型猜画火山云端看着那张小图,按 system 提示词"直接说答案"
6 显示 + 念出来板子TFT+SD+喇叭中文字体显示答案;百度 TTS 念"我猜你画的是,xxx"

看第 2、3 步——这是本课的命根子:板子把"像素点"变成了"一张真正的小图片",再变成"一封信(文字)"。视觉模型不认识一堆像素数字,它只认"图片格式",所以要把像素点打包成 PNG 再寄。

AI 看图链路:内存画布→缩图+PNG→base64→HTTP信封→视觉模型猜→显示+念出来


三、关键一棒:画为什么存在"内存画布"里,不在屏幕上?

你可能想问:屏幕上都画出来了,直接从屏幕"截"下来寄走不就行了吗?不行。 这里有块板的硬件小秘密:

这块屏幕有一条线(MISO)物理没接,所以从屏幕"回读"画面,只会读回一堆噪点。换句话说:屏幕只能"往外画",不能"往里读"。

所以板子聪明的做法是:边画,边把画好的像素存进一块内存(画布)里。 寄信时,从这块内存里取画,不是去"截屏幕"。

一句话记住:屏幕负责"给人看",内存画布负责"给机器用"。 AI 看的,是内存里那份画,不是屏幕上那份。屏幕负责"给人看",内存画布负责"给机器用"。 AI 看的,是内存里那份画,不是屏幕上那份。

⚠️ 比喻的边界:说"从内存取画"像"从草稿本抄",但它不是"抄"——是从第一笔起就画在内存这份草稿上。屏幕是展示板,内存才是真正的草稿纸。AI 看的一直是内存草稿纸。

为什么从内存画布取:屏幕 MISO 没接只能往外画不能往里读;屏幕给人看、内存画布给机器用


四、让 AI"猜"而不是"描述":那行提示词

同一张太阳图,提示词写法不同,AI 的回答差很多:

写法 A——让它"讲讲":

请描述这幅画。

AI 可能回:"图中有一个黄色圆形,周围有几条放射状线条……"——在描述,不猜。

写法 B——让它"直接说答案"(本课的写法):

system:你是猜画游戏助手。用户画了简笔画,请直接说出答案,
回复尽量简短(几个字即可),不要解释、不要思考过程。

AI 会回:"太阳。"——猜中了!

差别就在这四句话:

提示词里写的它"指挥" AI 什么写了 vs 没写
直接说出答案让它猜,不是描述写了才猜,没写就描述
回复尽量简短(几个字)限长度不啰嗦
不要解释只给结论不画蛇添足
不要思考过程直接给答案不让它"先想再答"

💡 这条提示词是第 26 课那个"提示词决定它怎么答"的延伸。想让 AI"干到点"的事,常常要同时告诉它"别干多余的"——"不要解释、不要思考过程"就是"负面指令"。你还可以在请求体里看到一句 "thinking":{"type":"disabled"},是正式关掉它的思考模式,让它别"想太久"把答案挤没。(如果不关,它可能只思考、不给答案——踩坑 #6。)

同一张图,说「猜」还是「讲」:提示词「直接说答案/要简短/不要解释/不要思考过程」让 AI 猜而不是描述


五、动手做实验:它猜得准不准

实验一:画四个常见图

每次先写预测,再点 Guess 再对答案:

✏️ 可以直接在表格里填写
我画的简笔画预测 AI 会猜实际猜了什么对了吗
太阳(大圆+放射线)
房子(方框+三角屋顶+小门)
笑脸(圆+两点+弯线)
花(小圆+几瓣椭圆)

实验二:画一团"抽象"的线

随便乱涂一团线,点 Guess。三种都可能:猜个怪东西 / 说"不知道" / 像在脑补。都记下来。

实验三:空白画布就点 Guess

按一下灰色 "Clear" 擦白,啥也不画直接点 Guess。

✏️ 可以直接在表格里填写
我做了什么预测实际
空白就点 Guess

这三个实验在帮你回答同一件事:AI 看见的,是它收到的那张缩略图。 画得越糊,它越"看不清";画得清楚、常见,它越容易说中。


六、它猜错,是坏了吗?(拆台实验)

试着拔掉 WiFi,再点 Guess。

✏️ 可以直接在表格里填写
观察推测
屏幕出现什么?喇叭响了吗?
为什么?

再连回网。记住:AI 猜错、说 "no idea"、念不出来,多半不是板子坏了——真正"看图说话"的是云端那个模型,板子只负责"把画包成信、寄出去、念回来"。想让它猜得准,就换一张更清楚、更常见的画。

试试把提示词从"直接说答案"改成"详细描述这幅画",再点 Guess——它的口吻会由"猜"变"讲"。这又是一次"提示词说了算"。


七、想自己看懂一点点代码:两个名字就够

打开 demo01_draw_guess.ino(或问 AI 帮手),只看两个名字:

  • canvas:内存里的那张纸。240×320、ps_malloc 开在 PSRAM。读画从它读,不 readRect(屏幕 MISO 没接,readRect 读回噪点)。
  • captureAsBase64():把纸变信的那一棒。缩图 → 转 RGB888 → 手动拼 PNG(CRC32 + adler32 + zlib stored 块)→ base64。图片几万字节,塞不进 JsonDocument(会被截断),所以请求体是手动拼字符串(踩坑 #5)。

中文伪代码(不用背):

手指在画布区按下拖动:
    屏幕画一条线
    同时写进内存画布 canvas
    抬手 :停止画

点蓝色 Guess:
    屏幕变深蓝 + "AI guessing..."
    captureAsBase64(120, 160):
        画布缩成 120x160 像素 → 拼 PNG → base64
    askVision(base64):
        手动拼 JSON(model + thinking disabled + 提示词 + 图片)
        HTTP 寄给火山 Ark
        读回 content
    showResult(答案):
        中文字体居中显示
        百度 TTS 念"我猜你画的是,xxx"
    再点一下屏幕,回到画笔继续画

八、过关检查:自己讲一遍

不看答案,用自己的话说:

  1. AI 没有眼睛,它靠哪几步"看到"你的画?
  2. 为什么画要从内存画布取,不从屏幕"截"?屏幕哪个硬件原因导致的?
  3. base64 是干什么的?为什么图要"翻译成文字"才能寄?
  4. 提示词里"直接说答案、不要解释、不要思考过程"分别命令 AI 什么?
  5. 拔掉 WiFi 再点 Guess,会发生什么?这证明了"看图说话"发生在哪一边?
  6. AI 猜错是板子坏了吗?它到底"看见"了什么?
点开对答案 1. 内存画布 → 缩图包 PNG → base64 → HTTP 寄给视觉模型 → 它看小图直接说答案 → 板子显示+念出来。 2. 屏幕 MISO 物理没接,readRect 读回噪点。所以画存在内存画布,从内存读。 3. base64 是把图片"翻译"成一串字母数字,让图片能装进 HTTP/JSON 信封寄走。 4. 猜不是描述 / 简短 / 只给结论 / 直接给答案——用提示词"剪掉"多余行为。 5. 请求发不出去,一直卡或报错。说明"看图说话"发生在云端,板子只负责发货+念回。 6. 不是坏。它看见的是收到的那张缩略图,画得糊就猜错;更常见/清楚就容易说中。

今天请留下三样东西:① 一个"你画了、AI 猜对了"的证据(画了什么 + 猜了什么);② 一个"AI 显然猜错"的画(并说说它"看见"的到底是什么);③ 一句话——"AI 看见的,究竟是不是你屏幕上的那幅画?"


九、往哪边玩(创意方向)

想做什么要怎么改 / 需要什么会观察到
画个会动的东西猜完让屏幕把答案变成会动的图板子从"猜"到"动"
成语 / 谜语你画我猜把提示词改成"这是成语,猜一个成语"同一张图,换个提示词,说法就变
画不出就题诗提示词改成"看这幅画,写一句诗"AI 从"猜"变"创作"
连环画画 5 张,AI 逐个猜,串成故事把多次答案连成一个故事
和第 28 课合体你说"我画好了",它念"我猜是……"你就复刻了第 28 课语音助手的雏形

密钥提醒:源码里 WIFI_SSID/WIFI_PASS、ARK_KEY、BAIDU_API_KEY/SECRET_KEY 都是 YOUR_* 占位符。只放本机,别写进笔记、截图、串口日志。

第 27 课 · 你画我猜

第 27 课 · 你画我猜

手指在屏幕上画画,点一下「Guess」让 AI 猜你画的是什么,还会念出答案。

27视觉模型画画AI识图