简介一套基于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项目因为继电器接线顺序搞错导致火线零线接反或者短路的事情。这东西真的不是开玩笑的慢一点稳一点永远比追求速度重要。整个项目做下来我发现最大的收获反而不是技术上的。以前炒菜总是下意识去按油烟机开关手忙脚乱不说还经常忘关。现在系统自己判断、自己执行我只需要在极端情况下按一下手动键干预。你以为你装的是一个智能油烟机其实是在给自己省掉一个每天重复几十次的动作。下一步我准备把油烟浓度数据接入厨房的空气质量看板顺便做一个油网堵塞提醒——当排风效率持续下降时自动在手机上报修。这个压缩包的故事应该还能继续写上几个版本。本文还有配套的精品资源点击获取