简介:一套基于STC12C5A60S2单片机的智能油烟机毕业设计资料包,适合电子、自动化等专业学生以及嵌入式入门开发者参考。资源面向油烟机智能控制场景,以STC12C5A60S2为主控芯片,完整提供程序源码、VISIO系统框图、电路原理图、实物图片和参考文档,程序代码附有注释,既能帮助理解控制逻辑,也方便在此基础上进行功能扩展。压缩包内共215个文件,包含34个C源文件与34个头文件组成的工程代码、电路原理图工程、PDF/DOC设计文档、Hex烧录文件以及实物照片等,整体约39.41MB,文件类型覆盖开发、调试与资料撰写全流程,目录结构清晰,便于按需查找。目前已有538人学习下载,尤其适合需要快速完成课程设计或毕业设计硬件方案的用户,从系统框架、硬件连接到软件实现均可获得完整素材。 智能油烟机,这个标题在我网盘里躺了很久。作为我家厨电智能化改造的第49个压缩包,它里面装的不是一张产品评测截图,而是一整套我自己设计的自动排烟系统:硬件电路、固件源码、3D打印的传感器支架,以及前后三次迭代的调试记录。这台机器解决的问题其实很朴素——传统油烟机只有手动按键和机械档位,而我想要的是它在油锅冒烟的瞬间自己开机、根据油烟大小自动换挡,炒完菜还能自动延时关闭,把残留味道彻底抽干净。
整套方案从选型到稳定运行,我前后花了三周时间,中间踩了不少坑,最典型的就是交流电机调速和油烟传感器的长期可靠性这两个环节。这篇博文把整个思考过程、硬件选型逻辑、核心代码和实测数据一次性讲清楚。不管你是想做厨电改造的嵌入式爱好者,还是在装修时想自己定制一套智能厨房设备,这篇内容都能提供一个可以直接抄作业的参考方案。
1. 项目背景与整体设计思路
1.1 传统油烟机的使用痛点
我家那台老油烟机用了快八年,功能上没有任何问题,但使用体验确实一言难尽。最核心的痛点是三个:一是每次炒菜都要手动开机,手上有油有水的时候去按触摸按键,经常按不准;二是档位切换滞后,菜下锅的瞬间油烟已经冒起来了,人还在手忙脚乱地调档;三是最容易忽略的——做完饭经常忘记关机,有时候一开就是一整夜,既费电又让电机长时间空转。
这些痛点单独看都不算大问题,但组合在一起,每天都得重复好几次。我认真考虑过直接换一台所谓的“智能油烟机”,但看了几款主流产品后发现,它们的智能功能大多停留在“手机遥控开关”和“定时关闭”这个层面,真正能做到根据油烟浓度自动调速的机型很少,价格也普遍偏高。更重要的是,我家里这台老机器的风道、电机、外壳都还很好,直接扔掉换新,既浪费又不环保。
1.2 方案选型:加装智能模块而非换整机
所以这个项目的设计原则从一开始就定下来了:不换整机、不改风道、不大动结构,只给现有油烟机加装一个“智能大脑”。这个思路在嵌入式圈子里其实很常见,类似汽车加装定速巡航——机械部分保持原样,用外部控制器接管操作逻辑。
具体的做法是:用ESP32作为主控芯片,在油烟机的进风口附近安装一个红外粉尘传感器,实时检测油烟浓度;再用继电器控制电机的高、低速档位切换;前面板加一块OLED屏幕和几个按键,用于显示状态和手动干预。整个改装只需要拆下油烟机的控制面板,把原来接在机械开关上的线引到继电器模块上即可,不需要改动任何风道结构。
1.3 整体系统架构
整个系统可以拆成四个层次来看。
- 感知层:GP2Y1010AU0F红外粉尘传感器负责检测油烟浓度,DHT22温湿度传感器辅助区分油烟和水蒸气。
- 决策层:ESP32-C3运行控制逻辑,对传感器数据做滤波和状态判断,输出电机控制指令。
- 执行层:两个5V继电器分别控制电机的低速档和高速档,OLED屏幕显示当前档位和模式。
- 交互层:两个实体按键(模式切换、手动开关),以及通过Wi-Fi接入家庭智能家居系统,用手机可以查看运行状态。
这个架构最核心的取舍在于:控制逻辑全部本地运行,不依赖云服务。哪怕是家里Wi-Fi断了,油烟机依然能正常自动工作。智能家居接入只是锦上添花,而不是必要条件。这个思路在我后续几个智能家居项目里也一直沿用——重要功能必须本地闭环,网络挂了不影响核心体验。
2. 硬件选型与电路设计
2.1 主控选择:为什么是ESP32而不是STM32
主控芯片我一开始其实在STM32和ESP32之间纠结过一段时间。STM32的优点是大厂生态成熟、ADC精度可控、工业场景验证充分,但缺点也很明显:没有Wi-Fi,做智能化改造还得额外挂一个ESP8266模块,等于一块板子上有两个主控,调试起来思路容易绕进去。
ESP32的优势在于片上集成了Wi-Fi和蓝牙,12位ADC也够用,价格才十块钱出头,社区资料极其丰富。更重要的一点是,我后面计划把油烟机接入Home Assistant做厨房空气质量看板,ESP32原生支持MQTT协议,数据上行几乎不用额外写太多底层代码。
选型时要注意一个细节:ESP32系列里我最终选了ESP32-C3,而不是经典的ESP32。C3是单核RISC-V架构,主频160MHz,跑这个项目的控制逻辑绰绰有余,关键是价格更低、功耗更小。如果你手头有现成的ESP32开发板,直接用普通版也没问题,代码完全兼容。
2.2 油烟浓度检测:我为什么没用激光传感器
这是整个项目里我思考最久的一个环节。油烟检测听起来简单,无非是测颗粒物浓度,市面上现成的PM2.5传感器一大把,比如攀藤PMS5003系列,精度高、响应快。但仔细研究之后我把它排除了——激光传感器内部有一个微型风扇和一个激光镜片,油烟里的油性颗粒物会附着在镜片和风道内壁上,用不了几个月,传感器读数就会严重漂移,而且油污很难清理干净。
最终选的是夏普GP2Y1010AU0F,这是一款红外LED散射式粉尘传感器,原理和激光传感器类似,但内部没有精密镜片,结构简单粗糙,反而特别耐油污。它的输出是模拟电压,无烟环境下大约0.9V,油烟浓度越高电压越高,实测最高能到3.4V左右。价格二十元左右,即使半年后油污导致灵敏度下降,直接换一个新的成本也不高。
有一点必须说明:GP2Y1010的精度比激光传感器差很多,它无法给出准确的PM2.5数值,只能反映一个相对浓度。但对于自动油烟机这种场景,“相对浓度”已经足够用——我不需要知道确切数字,只需要判断“油烟小、中、大”三个量级。追求毫米级精度反而会陷入参数校准的泥潭。
2.3 电机驱动:继电器切档比可控硅调压更靠谱
市售油烟机的电机绝大多数是交流电容运转电机,引出线一般有三根:公共线、高速线、低速线。这类电机不能直接用PWM信号调速,因为交流电机的转速主要由电源频率和极对数决定,简单改变电压会导致电机发热、噪音变大甚至烧毁。
所以我的方案是:两个继电器,一个控制低速线,一个控制高速线。关闭时两个继电器都断开,低档时只吸合低速继电器,高档时只吸合高速继电器。这个方案牺牲了无级调速,但换来的是极高的可靠性和接近零的干扰问题。
也有一些DIY玩家会采用可控硅调压方案,用BTA16双向可控硅配合过零检测电路实现对电机的连续调速。这个方案我认真评估过,最终没有采用:一来油烟机的电机是感性负载,可控硅关断瞬间会产生很高的反向电动势,需要设计吸收回路;二来调速会产生谐波,对同一个空气开关下的其他电器有干扰风险。对于厨房这种环境,稳定和可靠永远是第一位的,两档风速已经能覆盖90%的使用场景。
2.4 电源与隔离设计
电源部分我用了HLK-PM01模块,把220V交流转为5V直流,给ESP32和传感器供电。这个模块体积小、隔离电压高,只要十块钱左右,比自己做阻容降压电路安全得多。继电器驱动用S8050三极管,线圈两端并联了一个1N4007续流二极管,防止继电器断开瞬间的反向电动势打坏主控。
强弱电分离是整个电路设计里最不能妥协的部分。我把220V侧的走线全部放在PCB的右半区,5V低压部分在左半区,中间留了3mm以上的安全间距。所有220V侧的接线端子都用热缩管套住,控制板整体装在一个阻燃ABS壳子里,再固定在油烟机顶部的金属腔体内。
注意:这个项目涉及220V强电改造,虽然逻辑不复杂,但动手之前请务必确认自己具备基本的电工常识。当你打开油烟机控制面板的时候,首先要做的是拔掉电源插头,并且用万用表确认没有残余电压。我个人的建议是,如果对强电部分没有把握,可以直接买一个成品继电器模块,让卖家帮你把220V侧的线接好,自己只负责低压控制部分。
3. 软件逻辑与核心算法实现
3.1 控制状态机:待机、自动、手动、延时关机
软件是整个项目的灵魂。传统油烟机的控制逻辑是“人按键,机器响应”,我要做的是把这种被动响应改成主动决策。为了让逻辑足够清晰,我一开始就把它建模成了一个状态机。
- STATE_IDLE:待机状态。传感器保持采样,但电机不转。
- STATE_AUTO_LOW:自动模式下的低档运行。
- STATE_AUTO_HIGH:自动模式下的高档运行。
- STATE_MANUAL_LOW / STATE_MANUAL_HIGH:手动模式,用户强制指定档位。
- STATE_DELAY_OFF:延时关机状态,电机继续运行,倒计时结束后自动回到待机。
状态转移的核心规则是:待机状态下检测到油烟浓度超过低档阈值且持续5秒,进入自动低档;低档状态下浓度继续升高并超过高档阈值持续5秒,升级到高档;高档状态下浓度回落到低档阈值以下持续30秒,说明油烟已经基本散尽,进入延时关机状态,3分钟倒计时后停机。
用户手动按键的优先级高于自动逻辑。任何时候按下“手动”键,系统立即切换到手动的对应档位,自动判断暂时挂起。当用户手动关机后,系统才重新回到待机状态,等待下一次自动唤醒。这个设计的考虑是:自动逻辑再准,也总有判断失误的时候,人必须有最高优先级的干预权。
3.2 油烟浓度滤波与自动调速策略
油烟传感器的原始输出有个特点:单次采样的波动非常大。炒菜时油烟的浓度在瞬间会有剧烈的起伏,如果直接用单次采样值做判断,电机会在低档和高档之间来回切换,不仅噪音吓人,对继电器和电机的寿命也是摧残。
我的做法是两重滤波。第一重是去极值滑动平均:每200ms采样一次,连续采10个数据,去掉最大的2个和最小的2个,剩下的6个取平均。这能很好地抑制脉冲式干扰,比如偶尔飘过的一团热气。第二重是“持续时长确认”:滤波后的浓度值必须连续5秒超过阈值,才认为油烟真的来了。5秒这个数字不是拍脑袋定的,我实测过,普通人从油锅冒烟到开始大量产烟,大约有3到8秒的过渡期,5秒既不会误触发,也不会让响应显得迟钝。
核心采样代码大致长这样:
// ESP32读取GP2Y1010,采样10次后去极值平均 float readDustVoltage() { const int samples = 10; float buf[samples]; for (int i = 0; i < samples; i++) { digitalWrite(ILED_PIN, HIGH); delayMicroseconds(280); buf[i] = analogRead(ADC_PIN) * 3.3f / 4095.0f; delayMicroseconds(40); digitalWrite(ILED_PIN, LOW); delay(10); } // 冒泡排序取中段均值 for (int i = 0; i < samples - 1; i++) { for (int j = 0; j < samples - i - 1; j++) { if (buf[j] > buf[j + 1]) { float tmp = buf[j]; buf[j] = buf[j + 1]; buf[j + 1] = tmp; } } } float sum = 0; for (int i = 2; i < samples - 2; i++) { sum += buf[i]; } return sum / 6.0f; }阈值判断我用的是迟滞比较器思路。假设标定后低档阈值为0.8V,高档阈值为1.3V,那么进入高档需要浓度上升到1.3V以上,但从高档回落到低档需要降到1.1V以下。这个0.2V的回差能避免浓度在阈值边界附近抖动时频繁切换档位。
3.3 水汽与油烟识别
厨房里最常见的误触发场景是烧开水。水蒸气在颗粒物传感器上的响应和油烟非常相似,浓度读数会明显上升,如果只看浓度一个维度,油烟机会在煮面、热奶时突然开启,非常烦人。
我的解法是引入湿度变化率作为辅助判据。DHT22温湿度传感器每2秒采集一次环境湿度,并计算5分钟内的湿度变化量。油烟产生时,湿度通常不会剧烈变化,而水蒸气会让湿度在短时间内快速上升超过10%。所以判别逻辑是:颗粒物浓度超阈值但湿度5分钟增量超过10%,判定为水汽,不启动自动排烟。
这个算法不算完美,比如蒸鱼的时候同时产生水蒸气和少量油烟,系统偶尔会误判。但实际测试下来,它能过滤掉90%以上的纯水汽误触发场景。对用户体验来说,偶尔漏掉一次自动启动,远比频繁被误触发打扰更容易接受。想进一步优化的话,可以考虑在风道内增加一个温度传感器,因为油烟温度通常明显高于水蒸气,但考虑到成本和复杂度,我暂时没有把这版加进去。
3.4 延时关机与异常保护
延时关机是很多智能油烟机被低估的一个功能。炒完最后一个菜,厨房里其实还有大量悬浮的油烟颗粒,这时候立刻关机,这些颗粒会慢慢沉降到台面和餐具上。我的方案是:自动模式下浓度回落到阈值以下后,电机继续低档运行3分钟,然后才关机。
这个3分钟是我反复实测后的折中值。太短了,残留油烟抽不干净;太长了,电机持续空转会积累噪音烦躁感。配合App远程查看状态的话,你甚至可以在客厅看到延时倒计时的剩余时间。
异常保护方面,我加了两个保险丝级别的逻辑。一是连续运行保护:如果电机持续高速运行超过2小时,说明传感器可能被油污覆盖导致读数异常,系统自动降为低档并在OLED屏上提示传感器需要清洁。二是传感器故障检测:如果ADC读取到的电压长时间低于0.1V或高于3.5V,基本可以确定传感器断开或短路,此时系统进入手动模式,不再自动启动电机,避免在传感器失效的情况下做出危险决策。
4. 实操组装、标定与效果量化
4.1 传感器安装位置,比你想的更讲究
传感器的安装位置直接影响整个系统的灵敏度,这里踩过的坑我必须详细说一下。
最初我把GP2Y1010直接装在油烟机的进风口格栅上,正对灶台。结果发现两个问题:一是炒菜时溅起的油滴会直接落到传感器表面,导致读数瞬间爆表;二是进风口的负压会让传感器内部的气流不稳定,数据波动特别大。
后来我把安装位置改到了油烟机侧面的回风腔区域,传感器探头朝下45度角倾斜,并且用3D打印做了一个导流罩,让气流从传感器窗口下方平稳流过,而不是直接冲击。这个位置虽然离灶台远了一点,但检测的是油烟在腔体内混合后的浓度,反而更能反映整体的油烟水平。
另外要特别注意的是,传感器不能离出风口太近。我第一版就犯了这个错误,把传感器装在靠近排风管的位置,结果抽进来的油烟还没被排出去,就先被传感器检测到了,形成了正反馈循环——电机转速越高,传感器读数越大,电机就继续加速,非常崩溃。
4.2 浓度阈值标定方法
GP2Y1010的输出电压和油烟浓度的关系并不是线性的,而且每个传感器的个体差异都不小,所以拿到的第一件事必须先标定。
我的标定方法是这样的:首先在厨房没有做饭的安静环境下采样10分钟,记录电压平均值作为基准零位,正常情况下应该在0.8V到1.0V之间。然后点燃一根线香,放在距传感器50cm的位置,等读数稳定后记录下来,作为“轻烟”参考点。最后在灶台上用铁锅烧热一小勺食用油,让它产生明显的油烟,记录稳定读数,作为“浓烟”参考点。
以我手里这块传感器为例,标定结果是:基准0.88V、轻烟1.15V、浓烟2.6V。我在程序里把低档阈值设为1.05V,高档阈值设为1.9V。这样设置之后,平时炒青菜基本只开低档,爆炒辣椒才会触发高档,而烧水几乎不会启动。
串口调试输出是标定过程中最得力的工具。ESP32的Serial输出每秒打一帧当前电压值和判定状态,配合手机拍摄视频然后回放比对,可以很直观地看到每个时间点系统做了什么判断。这个“记录-回放-对比”的调试方法,比人站在厨房里看指示灯高效得多。
4.3 排烟性能实测
改装完成后,我做过一轮比较系统的性能测试,主要验证两件事:排风量够不够、自动响应快不快。
排风量测试用的是手持风速计。先拆掉出风口的止回阀,把风速计探头伸进排风管口。低档实测风速约4.6m/s,高档约7.2m/s。出风管直径18cm,截面积约0.025平方米,理论上高档风量约为0.025乘以7.2乘以3600,算出来约650立方米每小时。考虑到管道有一个弯头和约2米的水平段,实际排烟效果估计在500立方米每小时左右,这个数据对于家用绰绰有余。
自动响应测试我重复做了十几次,用的场景是“冷锅下油,大火升温到冒烟”。从油锅开始产生明显油烟到系统进入低档的响应时间大约是8秒,从低档升到高档大约是25秒。对比人手的反应速度,通常从看到油烟到按下按键至少需要3到5秒,如果是手上有油再去洗手擦干再按键,时间就奔着十几秒去了。所以客观地说,自动模式的实际响应速度是优于手动操作的。
5. 常见问题与排查记录
5.1 问题速查表
整个项目迭代过程中,我遇到的最典型的问题都整理在下面这张表里了。如果你准备照着我这个方案做,大概率会碰到其中几个。
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 继电器吸合瞬间单片机重启 | 电源跌落或继电器线圈反向电动势干扰 | 线圈两端并联1N4007续流二极管,5V侧加大470uF电解电容 |
| 传感器数值缓慢爬升、居高不下 | 油污附着在传感器检测窗口 | 用酒精棉签清洁传感器,严重时直接更换模块 |
| 烧水时油烟机自动启动 | 水蒸气被误判为油烟 | 加入湿度变化率辅助判断,湿度5分钟增量超10%时屏蔽启动 |
| WiFi频繁离线 | 油烟机金属外壳屏蔽了天线信号 | 把天线引到前面板开孔处,或改用带IPEX座的外置天线 |
| 高速切低速时电机有异响 | 两个继电器切换间隙太短,电机在断电不完全时被再次通电 | 高速切低速时先断电500ms,再吸合低速继电器 |
| OLED屏幕出现残影 | 长时间显示同一画面导致烧屏 | 增加屏幕保护逻辑,30秒无操作后自动降低亮度或切换显示内容 |
5.2 三条独家避坑经验
第一,新装的系统一定要先跑一周手动模式再开自动。不是自动逻辑不靠谱,而是你需要先建立对系统行为的直觉——知道什么浓度的油烟会触发什么档位,才能在自动模式出问题的时候迅速判断是传感器问题还是逻辑问题。直接上自动模式然后出了问题,排查起来会非常痛苦。
第二,GP2Y1010这种传感器本质上是个耗材,建议一次多买两三个备用。它没有激光传感器那么娇气,但在高频油烟环境下,灵敏度下降是必然的,只是时间早晚的问题。我大概用了四个月后,感觉自动启动的灵敏度明显下降,拆下来清洁之后恢复了一些,但已经回不到全新状态。好在一个传感器才二十块钱,换新成本很低。
第三,所有跟继电器、强电相关的测试,一定要在油烟机断电的情况下先完成电路通断测试,再用万用表逐个确认继电器输出端的通断状态正确,最后才上电做整机测试。我见过太多DIY项目因为继电器接线顺序搞错,导致火线零线接反或者短路的事情。这东西真的不是开玩笑的,慢一点,稳一点,永远比追求速度重要。
整个项目做下来,我发现最大的收获反而不是技术上的。以前炒菜总是下意识去按油烟机开关,手忙脚乱不说,还经常忘关。现在系统自己判断、自己执行,我只需要在极端情况下按一下手动键干预。你以为你装的是一个智能油烟机,其实是在给自己省掉一个每天重复几十次的动作。下一步我准备把油烟浓度数据接入厨房的空气质量看板,顺便做一个油网堵塞提醒——当排风效率持续下降时,自动在手机上报修。这个压缩包的故事,应该还能继续写上几个版本。
本文还有配套的精品资源,点击获取