《基于掌控宝+人工智能、物联网的防疫面罩》
作品说明
一、背景分析与设计要求
摘要:本作品基于人工智能与物联网技术,用于提高社区核酸检测时的测温排查效率。在防疫人员原本佩戴的简易面罩上加装 AI 摄像头、红外测温头与语音合成模块,在采样动作的同时完成免接触口腔测温;体温异常时自动语音提醒、拍照留存并上报云数据库。
关键词:AI 人脸识别;红外测温;物联网;云数据库;防疫面罩;免接触测温
1.1 作品背景
测温是疫情排查最基础的手段。当时常见的做法是专业测温门或手持测温枪,但测量额头等体表温度受测温距离远近、环境天气、人体运动强度等因素影响很大,准确度普遍不高,排查漏洞大。
我们观察到一个细节:大多防疫人员本来就佩戴着简易防疫面罩。既然面罩已经在脸上,如果给它加上免触测温、异常温度汇总上报、自动拍照等功能,防疫人员不必增加额外动作,工作效率就能大幅提高。

图 1-1 防疫面罩作品全貌
1.2 作品主体结构
本作品以防护面罩为基础进行改造:语音合成模块、掌控板布置在面罩一侧,二哈(HUSKYLENS)AI 摄像头与红外温度传感器布置在另一侧;框架材料选用较轻的椴木板,保证长时间佩戴轻便舒适。
其中:红外温度传感器负责在采集核酸时通过口腔测温;二哈摄像头负责采集条形码及人脸信息;掌控板负责显示被采集人员信息与测温结果;语音合成模块负责播放测温结果,提示检测人员避免疏忽。

图 1-2 作品设计意向效果图(一)

图 1-3 作品设计意向效果图(二)
1.3 实现功能与工程结构设计要求
1.3.1 实现功能要求
对做核酸检测的人员进行免接触测温,并在 AI 摄像头屏幕上显示温度;
测温结果高于正常体温时,语音提醒、自动拍照存储,并上传中心数据库;
温度正常时掌控板亮绿灯;温度偏高时亮红灯并语音提醒;
云数据库可自动更新数据,指挥中心据此快速决策。
1.3.2 工程结构要求
转动灵活:AI 摄像头伸展臂可上下转动,摄像头显示屏可正反转动,方便调节观看角度;
轻便舒适:结构简洁轻便、成本低廉,配戴舒适、无压迫感,平衡性能良好;
透气去雾:上下通透,塑料面罩不结水蒸汽,且方便更换。
掌控板与 AI 摄像头屏幕上都会显示日期与时间;只有测到人脸且发现发热时才上传数据并保存到存储卡,同时发出声音报警,提醒检疫人员进一步处理。
二、设计思维导图
下图为本作品的整体设计结构——以「AI 识别 + 红外测温 + 多重提示 + 云端上报」四大模块协同,在防疫人员原有的面罩上完成免接触测温排查。

安全防护免触测温社区防疫项目定位人脸识别红外测温异常拍照云端上报核心功能掌控板 2.0HUSKYLENSGY-906 测温SYN6288 语音硬件构成初始化扫码/识别测温判定提示与上报软件逻辑椴木激光切割伸展臂转动轴佩戴配重平衡结构工艺防疫面罩
三、硬件选用与连接
3.1 硬件清单
下表为本作品的完整硬件清单(含型号与费用),合计 745 元:
| 序号 | 名称 | 型号 / 规格 | 数量 | 价格(元) |
|---|---|---|---|---|
| 1 | 掌控板 | 2.0 | 1 | 99 |
| 2 | 掌控宝 | I/O 扩展板 | 1 | 99 |
| 3 | AI 摄像头 | 哈仕奇(HUSKYLENS) | 1 | 379 |
| 4 | 测温头 | GY-906 DVI(红外测温) | 1 | 122 |
| 5 | 语音合成模块 | 绿深 SYN6288 | 1 | 44 |
| 6 | 喇叭 | 0.5 W | 1 | 2 |
| 7 | 杜邦线 | — | 若干 | — |
| 合计 | — | — | — | 745 |
3.2 硬件连接

图 3-1 硬件连接图
各模块与掌控板的连接关系如下(接口方式取自作品源程序中的初始化语句,具体引脚以实际接线为准):
| 模块 | 接口 / 引脚 | 在本作品中的作用 |
|---|---|---|
| HUSKYLENS 二哈识图 AI 摄像头 | I²C(beginI2CUntilSuccess()) | 读取条形码 ID 与人脸识别;温度叠加显示在摄像头画面上 |
| GY-906 红外测温头 | I²C(mlx90614.getObjectTempC()) | 采样同时对准口腔测温,连续多次取最高值 |
| SYN6288 语音合成模块 | 串口(begin(&Serial1, P6, P1, P2)) | 播报人员信息、温度数值与「体温正常 / 体温异常」 |
| 喇叭 | 接语音合成模块输出端 | 0.5 W 小喇叭,加装护板保护 |
| 掌控板板载 RGB 灯 | 板载(rgb.write()) | 绿灯 = 正常;红灯 = 异常;启动时三颗灯依次变绿作状态指示 |
| 掌控板板载 OLED 屏 | 板载(display.printLine()) | 显示人员信息与温度;启动时显示标题与「请扫描条形码」 |
| 云数据库 | Wi-Fi(TinyWebDB) | 以条形码 ID 为标签上传体温数据,中心可实时调用 |
3.3 各模块在本作品中的角色
申报材料未逐项列出模块技术参数,这里只说明选型理由与在系统中的分工(不编造参数):
| 模块 | 选型理由 / 系统分工 |
|---|---|
| 掌控板 2.0 + 掌控宝 | 作为主控:负责屏幕显示、板载 RGB 指示、Wi-Fi 联网与整体流程调度;掌控宝提供 I/O 扩展,方便接插各模块 |
| HUSKYLENS 二哈识图 | 承担 AI 部分:先用条形码识别区分受检者,再切到人脸识别;可在画面上叠加温度文字,并支持拍照存 SD 卡 |
| GY-906 红外测温头 | 承担测温:非接触式红外测温,配合采样动作对准口腔,避开额温枪受环境影响的短板 |
| SYN6288 语音合成 | 承担提示:把温度数值与异常结论直接播报出来,避免检测人员因低头看屏而疏忽 |
| TinyWebDB 云数据库 | 承担上报:以条形码为标签更新记录,社区大屏或 PC 端可调用数据,实现「即时上报、中心决策」 |
四、结构安装与制作过程
4.1 初步构思与外形设计
草图阶段就把佩戴体验放在第一位。参加核检工作的医务人员主要为女性,因此参照女同学的头型尺寸确定支架大小,并针对性地解决了六个问题:

图 4-1 草图设计(参照头型尺寸确定支架大小)
中间镂空、两侧留底板:掌控板与小喇叭分别固定在两侧,降低重量并增加平衡感;
顶部对接尼龙搭扣带 + 后面一条松紧带:保证支架稳定、减轻负重;
伸展臂前后固定点设计成转动轴:保证 AI 摄像头可以灵活调节角度;
小喇叭加一片护板:既保护喇叭,也更美观;
透明面罩用可拆卸的固定钉:方便随时更换面罩;
上下通透:保证透气,塑料面罩不结水蒸汽。

图 4-2 结构设计效果图

图 4-3 支架结构模型细化设计(一)

图 4-4 支架结构模型细化设计(二)
4.2 外观结构与佩戴设计
本作品的外观不是另做一套外壳,而是围绕「面罩必须长时间戴在脸上」这一约束做结构,所有外观取舍都服务于一件事:让防疫人员戴着不累、用着顺手。
| 外观 / 结构要点 | 设计目的 |
|---|---|
| 以防护面罩为载体 | 复用防疫人员原本必戴的装备,不额外增加穿戴负担,也更容易被接受 |
| 框架采用椴木板 | 材质轻、易于激光切割加工,适合学生自制与反复迭代 |
| 主体支架中间镂空 | 减轻整体重量,同时为走线与模块安装留出空间 |
| 掌控板与喇叭分置两侧 | 左右配重平衡,避免头戴时向一侧偏坠 |
| 顶部尼龙搭扣带 + 后部松紧带 | 把重量分散到头顶与后脑,长时间佩戴不易滑落、压迫感小 |
| 摄像头伸展臂用转动轴连接 | 摄像头可上下调整、屏幕可正反翻转,适应不同身高与操作习惯 |
| 伸展臂用 3 mm 铜丝 + 热收缩管 | 材料易得、可徒手弯形,热收缩管包覆后外观整洁、不刮手 |
| 喇叭加护板 | 保护小喇叭,同时收拢外观,避免线头外露 |
| 面罩用可拆卸固定钉 | 透明面罩属耗材,可随时更换;设备主体消毒后重复使用 |
| 上下通透的开放结构 | 保证透气、防止面罩结雾影响视线 |
这套外观取舍背后的判断是:先保功能与佩戴,再谈好看。所有造型上的圆润、收边、包覆,都是在不增加重量、不影响消毒更换的前提下顺手做到的。
4.3 激光切割与拼装

图 4-5 激光切割(椴木板)
为验证设计可行性,主体支架选用椴木板,并分解为四片切割:图 1 用 2 mm 椴木板,图 2、图 3、图 4 用 5 mm 椴木板;按顺序叠放、粘贴、固定,制作方便、易于安装。
4.4 AI 伸展臂与走线设计

图 4-6 AI 伸展臂固定盘设计
固定盒预留按键与镜头的裸露空间,不影响 HUSKYLENS 本身的操作与拍摄;
摄像头加固定架本身有重量,会影响角度调节,因此尽可能减少固定架重量,遵循简洁、轻便、美观、实用的原则;
为方便屏幕上下翻转,伸展臂与摄像头连接处设计成空心管轴,摄像头与测温头的 4PIN 线从金属伸展臂内走线;
4PIN 线在盒子内走线,从上端开口出线,避免线缆外露缠绕;
伸展臂材料:直径 3 mm 铜丝并排弯曲成适当形状,外层用热收缩管包裹。
4.5 组装与调试

图 4-7 组装与调试(一)

图 4-8 组装与调试(二)

图 4-9 组装与调试(三)

图 4-10 组装与调试(四)
4.6 成果呈现

图 4-11 作品成果呈现(一)

图 4-12 作品成果呈现(二)

图 4-13 作品成果呈现(三)
五、编程流程分析
主程序逻辑:上电后先初始化屏幕、Wi-Fi 与云数据库,HUSKYLENS 切换到条形码识别等待扫码;识别到条形码后按 ID 取出受检者信息并播报,再切到人脸识别等待人脸出现;人脸出现后用 GY-906 连续采样取最高温度值,把温度叠加显示在摄像头画面上并语音播报;若温度高于 37 ℃,则亮红灯、语音报警、自动拍照存入 SD 卡,并在云数据库对应标签上追加「体温异常」标记;否则语音播报「体温正常」。最后切回条形码识别,进入下一位。
开始 · 上电初始化Wi-Fi 联网 + 连接 TinyWebDB 云数据库HUSKYLENS 切到「条形码识别」,等待扫码识别到条形码 / 人脸?GY-906 红外测温(采样同时口腔测温)体温是否高于正常值(> 37 ℃)?温度正常:掌控板亮绿灯 + 屏幕显示 + 语音播报温度偏高:亮红灯 + 语音提醒 + 自动拍照存卡 + 上传云数据库循环检测下一位否 → 继续等待否

六、参考代码(图形化编程)
本作品使用 Mind+ 图形化编程(Arduino C 模式),由图形化模块自动生成下方 Arduino 代码。下面先给出图形化编程界面截图,再贴出对应的 Arduino 代码(含每行中文注释)。
6.1 图形化编程截图

图 6-1 图形化编程截图 1

图 6-2 图形化编程截图 2

图 6-3 图形化编程截图 3

图 6-4 图形化编程截图 4

图 6-5 图形化编程截图 5

图 6-6 图形化编程截图 6
6.2 Mind+ 生成代码(逐行注释)
/*!
* MindPlus / mpython 生成代码(图形化编程导出的 Arduino C)
*/
#include <DFRobot_HuskyLens.h> // 二哈识图(HUSKYLENS)AI 摄像头驱动库
#include <DFRobot_Iot.h> // 物联网模块库(掌控板 Wi-Fi 联网)
#include <mPython_TinyWebDB.h> // TinyWebDB 简易云数据库库
#include <DFRobot_SYN6288.h> // SYN6288 语音合成模块驱动库
#include <DFRobot_MLX90614_IIC.h> // GY-906 红外测温模块驱动库(I²C)
#include <MPython.h> // 掌控板基础库(OLED 屏 / RGB 灯 / 按键)
// ---------- 动态变量 ----------
String mind_s_CeLiangWenDu; // 测量温度字符串,如 "T=36.8°C"
String mind_s_GeRenXinXi; // 被检测人员信息(来自名单)
String mind_s_GengXinXinXi; // 上传到云数据库的完整信息
String mind_s_TiaoXingMa; // 条形码标签(作为数据库主键)
volatile float mind_n_CeWenJieGuo; // 最终测温结果(取多次采样的最高值)
volatile float mind_n_CeWen; // 单次采样温度
volatile float mind_n_KongZhi; // 等待循环控制标志
SimpleList<String> mind_l_CeWenRenYuan; // 被测人员名单
// ---------- 函数声明 ----------
void onButtonAPressed(); // A 键回调:重新连接 Wi-Fi
void DF_ChuShiHua(); // 初始化:屏幕 / 网络 / 摄像头 / 语音
void DF_CeWen(); // 测温:连续采样取最高值
void DF_TianJiaRenYuanLieBiao(); // 建立被测人员名单
void DF_DengDai(); // 等待画面中出现人脸
void DF_PingMuXianShi(); // 屏幕显示个人信息与温度
void DF_GengXinXinXi(); // 更新(上传)云数据库
void DF_HuoQuXinXi(); // 读取条形码 ID 与对应人员信息
void DF_WenDuYiChang(); // 体温异常处置
void DF_TiWenZhengChang(); // 体温正常播报
// ---------- 创建对象 ----------
DFRobot_HuskyLens huskylens; // I²C 总线上的 HUSKYLENS 摄像头
DFRobot_Iot myIot; // 物联网(Wi-Fi)对象
mPython_TinyWebDB mydb; // 云数据库对象
DFRobot_SYN6288 syn6288; // 语音合成模块对象
DFRobot_MLX90614_IIC mlx90614; // GY-906 红外测温对象(I²C)
// ---------- 主程序开始 ----------
void setup() {
mPython.begin(); // 掌控板初始化
buttonA.setPressedCallback(onButtonAPressed); // 注册 A 键回调
DF_ChuShiHua(); // 完成全部初始化
DF_TianJiaRenYuanLieBiao(); // 载入被测人员名单
}
void loop() {
huskylens.request(); // 向 HUSKYLENS 请求一帧数据
if (huskylens.isAppearDirect(HUSKYLENSResultBlock)) { // 画面中出现已学习目标
DF_HuoQuXinXi(); // 读取条形码 ID 与人员信息
DF_PingMuXianShi(); // 屏幕显示
DF_DengDai(); // 等待人脸出现
DF_CeWen(); // 红外测温
DF_GengXinXinXi(); // 上传云数据库
delay(1000);
if ((mind_n_CeWenJieGuo > 37)) { // 体温超过 37 ℃ 判为异常
DF_WenDuYiChang(); // 红灯 + 语音 + 拍照 + 上报
} else {
DF_TiWenZhengChang(); // 语音播报"体温正常"
}
DF_PingMuXianShi(); // 刷新屏幕
huskylens.writeAlgorithm(ALGORITHM_BARCODE_RECOGNITION); // 切回条形码识别
}
}
// ---------- 自定义函数 ----------
void DF_ChuShiHua() {
rgb.brightness(round(1)); // 板载 RGB 灯亮度设满
rgb.write(0, 0x0000FF); // 第 1 颗灯蓝:正在启动
display.setCursorLine(1);
display.printLine("测温助手启动中");
myIot.wifiConnect("123456", "66668888"); // 连接 Wi-Fi(账号密码以实际为准)
while (!myIot.wifiStatus()) { yield(); } // 等待联网成功
rgb.write(0, 0x00FF00); // 第 1 颗灯绿:网络就绪
rgb.write(1, 0x0000FF);
mydb.setServerParameter("http://tinywebdb.appinventor.space/api", "rgznmz", "a46a5f05"); // 云数据库参数
huskylens.beginI2CUntilSuccess(); // 反复尝试直到 HUSKYLENS 通过 I²C 就绪
huskylens.clearOSD(); // 清屏叠加
huskylens.writeAlgorithm(ALGORITHM_BARCODE_RECOGNITION); // 先切到条形码识别
rgb.write(1, 0x00FF00); // 第 2 颗灯绿:摄像头就绪
rgb.write(2, 0x0000FF);
syn6288.begin(&Serial1, P6, P1, P2); // 语音模块接串口(P6 / P1 / P2)
syn6288.setVolume(true, 12); // 音量设为 12
rgb.write(2, 0x00FF00); // 第 3 颗灯绿:语音就绪
syn6288.playText("测温助手启动成功", 0); // 语音播报启动成功
display.setCursorLine(1);
display.printLine("测温助手启动成功");
delay(500);
DF_PingMuXianShi();
display.setCursorLine(1);
display.printLine(" 人工智能防疫面罩");
display.setCursorLine(2);
display.printLine(" 测温助手");
display.setCursorLine(3);
display.printLine(" 请扫描条形码");
}
void DF_CeWen() {
mind_n_CeWenJieGuo = mlx90614.getObjectTempC(); // 读一次物体温度作为初值
for (int index = 0; index < N; index++) { // 连续采样 N 次(N 为原程序设定次数)
mind_n_CeWen = mlx90614.getObjectTempC(); // 再读一次
if ((mind_n_CeWen > mind_n_CeWenJieGuo)) { // 取多次采样中的最高值
mind_n_CeWenJieGuo = mind_n_CeWen;
}
delay(200);
yield();
}
syn6288.playText((String(mind_n_CeWenJieGuo) + String("度")), 0); // 语音播报温度
mind_s_CeLiangWenDu = (String("T=") + String((String(mind_n_CeWenJieGuo) + String("°C"))));
huskylens.clearOSD(); // 清叠加层
huskylens.writeOSD(String(mind_s_CeLiangWenDu), 230, 35); // 温度显示在摄像头画面右上角
}
void DF_TianJiaRenYuanLieBiao() {
mind_l_CeWenRenYuan.push_back("章伟杰17岁"); // 示例名单,实际以现场登记为准
mind_l_CeWenRenYuan.push_back("陈宇煊17岁");
mind_l_CeWenRenYuan.push_back("傅欣欣17岁");
mind_l_CeWenRenYuan.push_back("章程23岁");
mind_l_CeWenRenYuan.push_back("陈诚22岁");
}
void DF_DengDai() {
huskylens.writeAlgorithm(ALGORITHM_FACE_RECOGNITION); // 切换为人脸识别
syn6288.playText(mind_s_GeRenXinXi, 0); // 播报人员信息
delay(1000);
mind_n_KongZhi = 0;
while (!(mind_n_KongZhi == 1)) { // 一直等到画面里出现人脸
huskylens.request();
delay(100);
if (huskylens.isAppearDirect(HUSKYLENSResultBlock)) {
mind_n_KongZhi = 1;
}
yield();
}
}
void DF_PingMuXianShi() {
display.setCursorLine(3);
display.printLine(mind_s_GeRenXinXi); // 第 3 行显示人员信息
display.setCursorLine(4);
display.printLine(mind_s_CeLiangWenDu); // 第 4 行显示温度
}
void DF_GengXinXinXi() {
mind_s_GengXinXinXi = (String(mind_s_GeRenXinXi) + String((String(" ") + String(mind_s_CeLiangWenDu))));
if ((mind_n_CeWenJieGuo > 37)) { // 异常:加"体温异常"前缀再上报
mydb.updateTagValue(mind_s_TiaoXingMa, (String("体温异常 ") + String(mind_s_GengXinXinXi)));
} else {
mydb.updateTagValue(mind_s_TiaoXingMa, mind_s_GengXinXinXi);
}
}
void DF_HuoQuXinXi() {
mind_s_TiaoXingMa = (String("73050000") + String(huskylens.readBlockCenterParameterDirect().ID)); // 条形码标签
mind_s_GeRenXinXi = mind_l_CeWenRenYuan[huskylens.readBlockCenterParameterDirect().ID - 1]; // 按 ID 取人员
display.setCursorLine(4);
display.printLine("");
}
void DF_WenDuYiChang() {
rgb.write(-1, 0xFF0000); // 全部 RGB 灯亮红
syn6288.playText("体温异常", 0); // 语音报警
huskylens.screenshotToSDCard(); // 自动拍照存入 SD 卡
delay(3000);
rgb.write(-1, 0x00FF00); // 恢复绿灯
}
void DF_TiWenZhengChang() {
syn6288.playText("体温正常", 0); // 语音播报正常
}
// ---------- 事件回调函数 ----------
void onButtonAPressed() {
myIot.wifiConnect("123456", "66668888"); // 按 A 键重新连接 Wi-Fi
}注:原申报文档在格式转换时有少量字符缺失(如循环次数),代码中以 N 标出,实际取值以源程序为准;其余语句均按原文保留。
七、作品创新点
人工智能 + 物联网:把 AI、IOT 技术用于防疫防控,堵住检测过程中的漏洞,提高效率、减少工作人员负担;
测温准确:在采样的同时通过口腔测温得到人体准确温度,减少环境等因素影响——这是相对额温枪最大的改进;
多重提示:屏幕温度显示 + 色灯提示 + 语音提示,三重冗余降低疏忽与过错;
即时上报:数据即时上报,中心人员可快速做出决策;
影像留存:对发热者即时拍照、存储、上报,在后台建立完整资料;
可重复使用:透明面罩可随时更换,设备主体消毒后可重复使用;
测温方式自然:在采样同时完成免接触测温,无明显测温动作,避免测温枪动作引起的不适。
八、项目应用拓展
本作品的「识别 + 测温 + 多重提示 + 云端上报」架构可迁移到多种需要快速排查的场景,下表给出 4 条可落地的拓展方向:
| 拓展方向 | 实现要点 | 迁移能力点 |
|---|---|---|
| 校园晨检 / 食堂入口 | 把整套逻辑固定在门口支架上,学生刷码后自动测温并写入班级台账;异常自动通知校医 | AI 识别 / 红外测温 / 云端台账 |
| 提升测温可靠性 | 做一组对照实验:同一批人分别用额温枪、耳温枪与本装置口腔测温,统计偏差与环境温度的关系,用于编程时修正补偿 | 对照实验设计 / 误差分析 |
| 数据看板与排班 | 把云数据库数据做成实时看板,按时间段、检测点统计异常率,辅助排班与物资调配 | 数据可视化 / 决策支持 |
| 结构与成本迭代 | 用 3D 打印替代椴木板做一体化支架,主控换成体积更小的模块并改为焊接,做长时间佩戴舒适度测试与成本核算 | 材料工艺 / 人机工程 / 量产思维 |
九、小结
作品抓的是一个很具体的漏洞:额温枪测体表温度,受测温距离、环境天气、人体运动强度影响,准确度普遍不高,排查漏洞大。而防疫人员大多已佩戴简易面罩——既然面罩已经在脸上,为什么不让它顺便把测温这件事做好?
于是这套装置在采样动作的同时完成口腔测温,不增加额外动作、不打断检测节奏,异常时自动拍照上报。整个作品成本 745 元、结构用椴木板激光切割即可制作,是一个「问题找得准、方案做得轻」的典型创客项目。
9.1 设计反思与不足
免接触测温头的准确率在编程时可以人为修正、采取补足误差;
编程还不够成熟,特别是简易云数据库,没有做到相片与温度对应上传;
采用积木式开源硬件,体积偏大、没有很好地隐藏,且费用成本过高;若要实际生产,可考虑体积更小、价格更低的主控 / AI 摄像头 / 测温头,接线改为焊接;
哈仕奇 AI 摄像头采用的是普通版,不能识别条形码;若使用教育版可识别条形码,数据会更完整。
创造是个严谨中充满奇妙的事,需要想象力与耐心去仔细雕琢。经过这个项目,我们学到了课堂中学不到的知识,也切身体会到科技创新不是一蹴而就的。
9.2 团队成员与分工
章伟杰负责建模与编程;吴承瀚负责收集与整理信息、外形结构制作,并与指导老师多次交流,参考或借鉴了老师的一些建议。
项目推进中的两次关键研讨:2022 年 5 月确定作品定位与硬件选型(掌控板 + 测温头 + AI 摄像头 + 语音合成模块);2022 年 12 月确定最终定位为社区疫情防控中使用的防疫面罩终端,并决定使用 TinyWebDB 简易数据库与疫控中心联动,社区大屏或 PC 可调用数据。





