引言:化学课上,有些不常见的仪器名称容易给学生们造成一定困扰。如何让认识仪器更直观、更高效?我利用Mind+的AI图像分类功能,结合掌控板和物联网,制作了一个“化学仪器AI助教”。它就像一双智能的眼睛,看一眼就能识别出仪器,并立刻通过掌控板屏幕“说”出它的名字!这个项目将AI、物联网和开源硬件完美结合,为传统学习方式注入了科技的魔力。
一、项目介绍
本项目旨在解决化学教学中仪器识别难、记忆枯燥的问题。我们利用Mind+ V2软件,训练了一个能识别“多孔式气体洗瓶”、“液封除毒气集气瓶”等化学仪器的AI图像分类模型。通过电脑摄像头实时捕捉仪器画面,AI识别后,通过MQTT物联网协议将结果无线发送给掌控板。掌控板接收到信息后,会立刻在屏幕上显示仪器名称,实现“所见即所学”的智能互动体验。
核心功能:
1. AI视觉识别:实时识别2种以上常见化学仪器,识别准确率高。
2. 物联网无线传输:利用SIoT平台,实现电脑与掌控板的无线通讯。
3. 交互式学习反馈:掌控板屏幕显示名称,实现无线连接,打破设备局限。
4. 模块化设计:该项目可轻松扩展识别更多仪器,或增加语音播报、用外接摄像头无线识别等新功能。
本项目采用“端云端”的简易架构。电脑端(Mind+实时模式)负责AI模型推理和MQTT消息发布;SIoT平台作为本地MQTT服务器负责消息中转;掌控板端(上传模式)负责接收消息、控制外设,实现人机交互。

图一 项目架构图

图二 项目实物图
二、项目演示
3.56 07/26 aAG:/ v@F.UY https://v.douyin.com/QVxtMaQp870/ 复制此链接,打开Dou音搜索,直接观看视频!
三、项目制作过程
(一) 硬件准备
| 硬件 | 数量 | 作用 |
| 电脑(带摄像头) | 1台 | 运行Mind+,训练模型进行AI识别 |
| 掌控板 | 1块 | 接收并文字显示仪器识别结果 |
| 手机(备选) | 1台 | 拍摄待识别仪器照片,准备制作数据集 |
(二)软件准备
Mind+ V2.0及以上版本 (下载地址: mindplus.cc)
SIoT 1.2 (物联网服务器)
(三)硬件连接
掌控板与电脑用USB线连接
图三 硬件连接实图
(四)AI模型训练
步骤1:打开Mind+,切换到实时模式,点击“模型训练”,新建“图像分类”项目。

图四 打开图像分类
步骤2:添加“多孔式气体洗瓶”、“液封除毒气集气瓶”、“空集”三个类别。
步骤3:分别采集图片或者上传图片。每个类别至少采集50张以上,要包括不同角度、光线和背景。
图五 上传数据集
步骤4:点击“训练模型”,等待完成。
步骤5:点击“导出模型”,保存到电脑。

图六 模型训练
(五) 电脑端编程 (Mind+ 实时模式)
步骤1:打开实时模式
图七 打开实时模式
步骤2:添加扩展和编程
图八 加载模型文件
用红色框标出关键积木:`加载图像分类模型`、`MQTT初始化`、`开启摄像头`、`图像分类开始使用摄像头推理`、`如果最高置信度0.8`、`MQTT发送消息至Topic_0`。
解释MQTT参数:服务器地址填电脑IP,Topic_0填`yiqi`。

图九 搜索和添加扩展
步骤3:SIoT服务器配置
图十 实时模式下编程

图十一 设置MQTT参数
(六)掌控板端编程 (Mind+ 上传模式)
步骤1:打开上传模式

图十二 打开上传模式
步骤2 :添加扩展和编程

图十三 搜索和添加扩展
步骤3:WiFi和MQTT参数设置

图十四 配置WiFi和MQTT参数
步骤4:连接掌控板和上传代码

图十五 积木编程编译后修改代码改成手动编程
(七)项目运行
按照“项目演示”视频中的步骤,先启动SIoT,再运行电脑端程序,掌控板可以无线接收信息。

图十六 点击绿旗项目运行

图十七 项目运行成功
整个项目完成。
四、项目总结
(一) 项目亮点:
1. 跨学科融合:将人工智能(图像分类)、物联网(MQTT)和开源硬件(掌控板)有机融合,是典型的STEAM教育案例。
2. 解决实际问题:为化学仪器启蒙学习提供了新颖、直观的交互方式。
3. 技术闭环完整:从输入(视觉)到处理(AI)再到输出(显示/声音),形成了完整的技术闭环。
4. 成本低廉,易于推广:使用常见硬件和免费软件,便于在学校或家庭中复现。
(二)待改进之处与展望:
当前识别依赖电脑摄像头,未来可以尝试将AI模型部署到更高性能的硬件上,实现完全脱离电脑的便携式设备。
可以增加语音播报功能,让“助教”更加生动。
可以建立云端数据库,记录学生的识别正确率,形成学习报告。
附件
#include <MPython.h>
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi配置
const char* ssid = "209-2.4G";
const char* password = "shiyanshi209";
// MQTT配置(请将IP改成你电脑的实际IP)
const char* mqtt_server = "192.168.1.100";
const char* mqtt_topic = "yiqi";
const char* mqtt_user = "siot";
const char* mqtt_pwd = "dfrobot";
const int buzzerPin = P0;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
mPython.begin();
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
display.fillScreen(0);
display.setCursorLine(1);
display.printLine("MQTT接收测试");
// 连接WiFi
display.setCursorLine(2);
display.printLine("连接WiFi...");
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 30) {
delay(500);
attempts++;
display.setCursorLine(2);
display.printLine(String("WiFi ") + attempts);
}
if (WiFi.status() == WL_CONNECTED) {
display.setCursorLine(3);
display.printLine("WiFi已连接");
display.setCursorLine(4);
display.printLine(WiFi.localIP().toString());
} else {
display.setCursorLine(3);
display.printLine("WiFi失败");
return;
}
// 连接MQTT
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
display.setCursorLine(4);
display.printLine("MQTT连接中...");
if (client.connect("mpython_test", mqtt_user, mqtt_pwd)) {
client.subscribe(mqtt_topic);
display.setCursorLine(4);
display.printLine("等待消息");
} else {
display.setCursorLine(4);
display.printLine("MQTT失败");
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
// 显示收到的消息
display.setCursorLine(4);
display.printLine(String("收到:") + message);
// 蜂鸣器响一下
digitalWrite(buzzerPin, HIGH);
delay(200);
digitalWrite(buzzerPin, LOW);
// 2秒后恢复
delay(2000);
display.setCursorLine(4);
display.printLine("等待消息");
}
void loop() {
if (!client.connected()) {
display.setCursorLine(4);
display.printLine("重连中...");
if (client.connect("mpython_test", mqtt_user, mqtt_pwd)) {
client.subscribe(mqtt_topic);
display.setCursorLine(4);
display.printLine("等待消息");
}
delay(5000);
}
client.loop();
delay(100);
}附件

返回首页
回到顶部
评论