用ESP32打造自动烤棉花糖机器人:红外测温与PID温控实战

发布时间:2026/8/27 7:52:07
用ESP32打造自动烤棉花糖机器人:红外测温与PID温控实战 1. 项目概述为什么要做一台会烤棉花糖的机器人第一次看到“Robotic S’more Maker”这个概念的时候我脑子里弹出来的第一个念头是这不就是给“懒”找了一个冠冕堂皇的理由吗S’more这东西说白了就是烤棉花糖夹巧克力再夹全麦饼干露营时候围着篝火随便烤烤就行。但仔细一想这事儿还真不是“懒”这么简单——棉花糖烤到表面焦黄、内芯半融化这个度的把握其实相当微妙。烤轻了是嚼棉花糖烤重了就是一根黑炭棒而且篝火旁边的火候极不稳定手动旋转的节奏稍微一走神就翻车。所以做一台Robotic S’more Maker本质上是在解决一个“精准温控匀速旋转安全交互”的自动化控制问题。这个项目的定位很有意思它不完全是一个“刚需实用型”设备更多是硬核DIY爱好者、STEM教育场景以及家庭亲子互动的一个绝佳载体。从技术拆解来看它涉及机械结构设计、步进/舵机控制、红外温度传感、安全联锁逻辑、电源管理等多个嵌入式系统的基础模块。虽然最终成品只是一个烤棉花糖的小机器但它把一套完整的“传感器-控制器-执行器”闭环跑通了。你做完这个项目之后改造一下传感器和执行器换成烤香肠、烤年糕、甚至给小型工件做热风处理都不算难事。从适合人群来说我强烈建议这几类朋友认真看这篇内容一是正在学Arduino或者ESP32的嵌入式初学者这个项目比单纯点个LED灯好玩太多了而且涉及闭环控制能真正帮你建立“系统思维”二是带孩子做创客教育的家长或老师整个项目从搭架子到写代码差不多一个周末能搞定孩子能直观看到“程序如何改变物理世界”三是纯粹想在露营装备上折腾点花样的户外玩家一台自动化烤棉花糖机放在营地那就是话题中心。我在实际动手做这个项目之前其实走了不少弯路。最初我想的是用现成的烧烤架加一个旋转电机结果发现“旋转”和“烤得好”完全是两码事。棉花糖离热源的距离、旋转速度、热源功率这三者必须协同配合否则烤出来就是局部焦黑加整体软塌。所以后来我把方案推倒重来走了一条“模块化设计闭环温控”的路线下面把整个设计思路和踩坑记录完整拆开来讲。2. 整体方案选型为什么最终用了“旋转串杆红外测温”的组合2.1 热源与加热方式的选择权衡做这类小食自动化设备第一个需要拍板的问题是热源。市面上可选项其实不少酒精喷灯、小型丁烷气炉、电热丝、红外加热管、甚至大功率白炽灯都能加热。我在前期调研的时候列了一张对比表直接决定后面的设计路线我最后选了红外石英加热管核心原因是它有三个不可替代的优势。一是热辐射均匀不像明火那样有飘忽不定的火焰尖棉花糖表面受热相对一致二是没有明火在户外环境下安全冗余更高三是功率可控通过PWM或者固态继电器就能精确调整加热强度。这里有个关键认知烤棉花糖不是一个“越热越好”的过程表面温度到160°C左右开始美拉德反应颜色变成焦糖色这时候风味最好超过200°C就会碳化发苦。所以要实现“每次都烤出完美焦糖色”温度控制精度至少要达到±10°C以内这是整个系统设计的第一约束条件。2.2 执行机构舵机、步进电机还是直流减速电机执行机构的选择直接决定棉花糖的旋转质量。我一开始图省事用了普通直流减速电机结果发现转速一致性太差——电池电压一降转速就跟着掉导致同一批棉花糖有时候烤了三分钟还有一半是白的有时候一分钟就焦了。后来换了28BYJ-48步进电机问题立刻解决因为步进电机的转速由脉冲频率决定和负载、电压的关系不大。这里有个很多新手会忽略的点28BYJ-48是5V驱动的减速步进电机自带1:64减速箱输出轴转速本身就比较慢非常适合这种需要低速匀速旋转的场景。如果让我重新选一次我依然会坚持用步进电机而不是舵机因为普通舵机虽然控制简单但它的旋转范围一般在0°到180°要实现连续旋转需要改造成“360度舵机”而市售的360度舵机严格来说只支持“转”和“停”两个指令你要控制它精确转几圈再停下来反方向转非常难受。步进电机就没有这个问题想转多少度就发多少脉冲配合A4988或者ULN2003驱动板就能精准控制。我的建议是如果你手头有闲置的舵机可以先用着做原型验证但正式版一定要上步进电机省下来的调参时间远超电机的差价。2.3 温度反馈为什么不能用普通热敏电阻这是整个项目里最有技术含量、也最容易被忽略的一个环节。烤棉花糖时你想测的是“棉花糖表面的温度”而不是“空气温度”或者“热源温度”。如果用普通热敏电阻或者DS18B20去测探头必须接触到棉花糖表面才准但棉花糖是软的、粘的、还在旋转接触式测温会把糖粘在传感器上实测完全不可行。即便是用红外热电堆传感器也要注意一个问题——传感器视场角(FOV)内的所有物体都会贡献红外辐射信号如果视场太大把后面的加热管也包含了读数就会严重偏高。我最终选用的是GY-906 MLX90614红外温度传感器它是一款非接触式红外温度计模块默认I2C接口测温和控温逻辑写起来都不费劲唯一要注意的是视场角度问题。MLX90614有不同视场角的型号我用的这款大约是90°视场角实际测试下来在10厘米距离上会“看到”一个直径约20厘米的圆。为了避开加热管的干扰我把传感器安装在棉花糖的斜上方45°角位置让视场中心对准棉花糖中心同时给传感器加了一个3D打印的窄筒遮罩相当于人为把视场角收窄到大约30°实测干扰明显下降测温一致性提升很多。3. 核心硬件结构与传感系统拆解3.1 机械框架从“乐高式验证”到“亚克力定型”机械结构这部分我强烈建议分两轮来做。第一轮验证用铝型材或者乐高积木搭一个简易试验台目的不是好看而是快速验证旋转、加热、测温这三个核心动作能不能协同工作。我第一轮用的是2020铝型材加角件拼了一个L型支架电机座用3D打印加热管固定在一个小支柱上总共花了一个晚上就搭好了。这一轮验证下来发现的最大问题是棉花糖在旋转时因为重心偏移串杆会轻微抖动导致棉花糖距离加热管的距离在5毫米到15毫米之间波动反映到温度上就是±20°C的波动这完全不可接受。第二轮定型方案改成了亚克力切割加3D打印件混合结构。底座用5毫米厚的透明亚克力板激光切割强度足够而且能看到内部结构给孩子展示的时候很有科技感电机支架、传感器遮罩、串杆握持端这几个关键受力件用PLA材料3D打印因为PLA比普通PLA耐热性稍好而且韧性增加不会在长时间受热后变脆断裂。这里有一个非常实用的经验串杆直接买不锈钢烧烤签长度30厘米直径3毫米既不会生锈也不会在高温下释放有害物质比自己加工金属杆省事太多。3.2 传感系统红外测温、限位开关与火焰检测的三重保险传感系统是这个项目的灵魂也是保证“机器人烤棉花糖”安全可靠的关键。除了上面提到的主传感器MLX90614红外热电堆我还加了两个辅助传感器第一个是限位开关安装在串杆的插入位置。没有棉花糖的时候加热管绝对不能启动否则就是干烧。限位开关的逻辑很简单串杆插到位之后会压住一个微动开关控制器检测到这个信号才允许加热管通电。这个设计在第一次给朋友演示的时候就发挥了作用——有个大人随手把机器拿起来看串杆滑出来温控立刻切断了加热管电源。虽然之后重新插回去还能继续用但这种失误保护在真实场景里多一道就多一分安全。第二个是火焰传感器。虽然用的是电热管没有明火但如果棉花糖烤太久滴落糖浆到加热管上是有可能冒烟甚至起小火的别问我是怎么知道的。我在加热管支架上装了一个火焰传感器模块检测波长范围在760纳米到1100纳米之间能识别火焰发出的红外特征。一旦检测到异常火焰信号系统立刻断电并蜂鸣报警。这个模块成本不超过10块钱但是把整个设备的安全性提升了一个层级。3.3 主控与驱动ESP32的“降维打击”选择主控板的选择我推荐ESP32而不是Arduino Uno原因有三个。第一ESP32自带Wi-Fi和蓝牙后续如果你想做一个手机App来远程监控烤制进度或者把温度曲线实时推送到服务器不需要额外加通信模块。第二ESP32的主频是240MHz比Uno的16MHz快了一个数量级跑PID控制加多路传感器采集毫无压力。第三ESP32的价格甚至比原厂Uno还便宜开发体验却好很多。驱动的接线这一块我整理了一个标准的接线对照表照着插就不会错设备ESP32引脚供电说明MLX90614 SDAGPIO213.3V供电MLX90614 SCLGPIO223.3V供电ULN2003驱动板IN1-IN4GPIO25, GPIO26, GPIO27, GPIO14驱动板和电机用5V外置电源固态继电器控制端GPIO32接继电器DC和DC-注意共地限位开关GPIO33内部上拉接GND触发火焰传感器数字输出GPIO153.3V供电蜂鸣器GPIO13加一个三极管驱动不要直接接引脚4. 软件控制逻辑与完整制作流程4.1 状态机软件架构的核心思想写控制代码之前先想清楚软件架构。这个项目的核心逻辑用一张状态图就能描述清楚上电待机 → 检测串杆到位 → 启动预热 → 开始旋转 → 闭环温度控制 → 达到目标色值后停止 → 提示完成。我用了一个非常简单的有限状态机来管理整个烤制流程避免状态混乱。之所以要用状态机而不是平铺直叙的if-else是因为烤制过程中有大量的异步事件——用户可能在预热阶段突然抽出串杆也可能在烤制中途碰倒了加热管支架。如果代码里每个判断都嵌套一个if很快就会被各种边界条件和异常处理淹没。状态机的核心思想是每个状态里只处理“当前状态应该处理的事”遇到异常就切换状态。这样代码结构清晰后期加功能也非常方便。4.2 PID温控的调参实录温度控制这一块老实说普通开关控制就是温度低于设定值就全功率加热高于就关闭在这个场景下也能凑合用但温度波动比较大。我实测普通开关控制在加热管全功率1200W的情况下棉花糖表面温度波动能到±15°C到±25°C这种波动会导致棉花糖表面颜色不均匀有时候一边焦了另一边还是白的。后来我改成了位置式PID控制把加热管功率变成连续可调——固态继电器用PWM信号控制占空比从0%到100%线性调整配合PID算法温度波动降到了±5°C以内。我最终的PID参数是这样的P 420I 35D 150。这里特别想说的是不同位置的棉花糖、不同的环境温度、甚至不同批次的棉花糖大小都会影响最优参数。我建议你在烧录之前先做一个自动调参简单办法是把PID三个系数放到Web界面里实时修改ESP32自带Wi-Fi写个最基础的Web Server就行然后烤一根棉花糖看曲线再调参数再烤。我花了整整一下午调参试了6轮才得到稳定的曲线但这个过程对理解PID算法比看十篇教程都有用。4.3 关键代码逻辑主循环与温控片段下面是我实际在用的核心控制代码片段完整工程文件因为太长就不贴了但这段逻辑是整个系统最关键的部分// 主循环 - 基于状态的周期性调度 void loop() { switch(currentState) { case STATE_IDLE: if (digitalRead(SKEWER_SENSOR_PIN) LOW) { currentState STATE_PREHEAT; preheatStartTime millis(); } break; case STATE_PREHEAT: // 预热5秒让加热管达到稳定输出区 heaterOutput MAX_HEAT_PWM; if (millis() - preheatStartTime 5000) { currentState STATE_ROASTING; roastStartTime millis(); } break; case STATE_ROASTING: // 读取红外传感器温度带均值滤波 float surfaceTemp readIRTemperature(); float filteredTemp lowPassFilter(surfaceTemp, 0.2); // 计算PID输出映射到PWM占空比 float pidOutput computePID(targetTemp, filteredTemp, pidP, pidI, pidD); int pwmValue constrain(map(pidOutput, -100, 100, 0, MAX_HEAT_PWM), 0, MAX_HEAT_PWM); analogWrite(HEATER_PWM_PIN, pwmValue); // 如果达到目标温度进入完成状态 if (filteredTemp targetTemp) { currentState STATE_DONE; } break; case STATE_DONE: analogWrite(HEATER_PWM_PIN, 0); digitalWrite(BUZZER_PIN, HIGH); delay(200); digitalWrite(BUZZER_PIN, LOW); currentState STATE_IDLE; break; } }代码里值得注意的地方是那个低通滤波函数。红外传感器虽然测温快但在转动过程中信号会有些高频抖动一个简单的一阶低通滤波就能让温度曲线平滑很多。我用的是系数0.2的标准滤波公式响应速度和稳定性的平衡在这里比较合适。如果你用的是MLX90614原厂库记得把发射率(emissivity)设为0.95这是食物表面的常见发射率值设错了会导致整体温度读数偏差10°C以上。4.4 从3D建模到实体组装完整的制作顺序下面按我实际制作的先后顺序把整个手工和组装流程整理一遍。这一节比较长但对于想复刻的朋友来说照着做基本上能少走90%的弯路。第一步用Fusion 360免费个人版就够用设计三块核心零件电机座底板、红外传感器遮罩、串杆定位卡槽。设计的时候要重点考虑两个尺寸一是串杆中心到加热管表面的距离我实测最佳距离是25毫米到35毫米之间太近棉花糖表面升温过快来不及均匀熟化太远烤制时间太长内部水分流失严重二是红外传感器的安装角度要让遮罩的轴线与棉花糖表面成45度夹角。三块打印机打印时间大约4小时PLA材料填充率30%就足够。第二步是切割亚克力底座我画了一个250毫米×150毫米的底板图按激光切割参数——功率60%速度30毫米/秒切出来的边缘非常光滑。如果手头没有激光切割机可以用铝塑板或者木板加电钻手工加工视觉效果差点但功能不受影响。底板上要留四个孔两个用于固定加热管支架一个用于固定步进电机一个用于穿电源线。第三步是把加热管支架固定在底板上。我用的成品陶瓷灯座加304不锈钢反光罩加热管竖着安装这样棉签糖是横向插入、从侧面受热烤出来的效果最接近篝火旁自然烤制的状态。支架固定完之后一定要用万用表检查加热管外壳和支架之间没有短路这一步不能省。第四步是安装步进电机和传感器遮罩。步进电机用三颗M3螺丝固定在电机座上输出轴通过一个联轴器和不锈钢串杆连接。这里有个小技巧在串杆和联轴器之间垫一小段热缩管既能增加摩擦力又能避免金属直接摩擦产生的刺耳噪音。传感器的遮罩用M2螺丝固定在亚克力底板侧面将MLX90614插进遮罩里前端开口方向对准棉花糖的位置。第五步是接线和电源管理。我用的电源是12V/5A的开关电源通过一个DC-DC降压模块分出5V给ESP32和步进电机驱动板加热管单独用220V供电走固态继电器控制220V侧的开关。这一步千万注意220V侧的相关接线一定要做好绝缘继电器模块和所有高压触点都放在亚克力底板下方并加绝缘板隔离。我不建议新手直接上手220V可以先换成12V的车载加热管把整个逻辑调通再考虑升级。第六步是下载程序并调试。接好电脑后先不要插加热管220V电源只给控制板供电用串口监视器观察温度数据是否合理。用手靠近传感器看温度读数是不是跟着变化。测试正常之后再把220V加热管接入从最小功率开始试运行逐步提高到目标功率。5. 常见问题与排查技巧实录5.1 温度读数漂移视场角干扰与反射干扰这个问题我在项目调试阶段遇到了不下五次。现象是棉花糖没放上去的时候传感器显示环境温度30°C一旦加热管开始工作读数直接跳到100°C以上。我排查了一圈最终锁定两个原因。一个是传感器视场角太大把加热管本身也包含进去了解决方法是加遮罩上面已经提到。另一个更隐蔽——加热管表面的反光层会把热辐射反射到传感器上即使加了遮罩仍然有残余干扰。我的解决方案是把传感器支架的安装角从垂直向下改成45度斜装同时把反光罩内壁用耐高温哑光漆喷涂一遍实测干扰读数从100°C下降到了40°C以下。5.2 棉花糖烤焦的四个经典原因排查表现象可能原因排查方法解决方案局部焦黑旋转速度过慢或卡顿观察串杆是否平滑转动增加步进电机转速或检查联轴器是否松动表面焦但中心发硬加热管距离太近测量棉花糖表面到加热管距离调整到30毫米左右整体温度偏低PID输出饱和查看串口打印的PWM值是否长时间100%增大P值或调高加热管功率颜色不均匀红外测温点偏移检查棉花糖是否对准传感器视场中心调整传感器遮罩角度确保视场覆盖棉花糖中心5.3 断电重启后的状态恢复问题这个是在做产品化改造时才想到的。如果烤制过程中突然断电重新上电后系统会回到待机状态串杆上的棉花糖如果没取下来设备不会自动继续烤制这其实是一个好的安全设计——绝不自动恢复烤制状态。但随之而来的问题是操作步骤稍微繁琐每次断电后都要重新插拔一次串杆才能复位状态机。我的处理方式是把“限位开关触发”和“状态机复位”在逻辑上做了解耦限位开关负责判断“有没有串杆”状态机在检测到串杆到位且按下实体按键之后才启动烤制。这样一来断电恢复后续烤需要“插好串杆按一下按键”两个动作安全性和易用性都兼顾了。5.4 户外使用的功耗与供电优化在实际户外场景中很多人会问这个机器能不能用充电宝供电。我实测下来ESP32加步进电机和传感器控制部分总功耗不到10W用普通20000mAh的充电宝完全能撑过一整天的露营几十次烤制。真正费电的是加热管——1200W的加热管烤一根棉花糖大约需要两分钟用电量大约0.04度如果接汽车电瓶加逆变器一瓶12V/60Ah的电瓶可以连续烤大约十几个小时。但如果手头只有充电宝而没接220V那就只能改用低功率方案——我之前测试过用12V/50W的PTC陶瓷加热片烤制时间延长到6到8分钟但整个设备可以实现百分百低压供电户外安全性拉满适合家里有小朋友的场景。6. 这个项目的进阶扩展方向主体功能做完之后我觉得这个机器还有很大的折腾空间这里分享几个我踩过坑之后总结出的扩展方向优先级从高到低排列。第一个扩展方向是“多签位并行烤制”。现在单串杆一次只能烤一根棉花糖效率偏低。把步进电机换成42步进电机用一条同步带同时驱动三根串杆配合三个红外传感器和一套温控策略就能实现三根棉花糖同时烤制。这一步的难点不是机械结构而是三路温控的协同——三根棉花糖的大小不可能完全一样如果每根独立PID控制加热管又只有一根就需要做一个加权分配算法。我建议的简化方案是三根串杆共用一个温度目标取三路传感器读数的中间值作为反馈输入不用完全独立的PID。第二个扩展方向是“远程监控与数据记录”。借助ESP32自带的Wi-Fi把每次烤制的温度曲线记录到本地SD卡同时通过MQTT上报到Home Assistant。这样你可以把“温度曲线”和“口感评价”关联起来找到自己最喜欢的“色值-口感”组合。这部分我实际做过用的是ESP32配MicroSD卡模块外加Ubidots免费物联网平台代码量不大但非常“极客”。第三个方向是“结构升级为折叠便携版”。户外设备最怕体积大现在的亚克力底座加直立的加热管支架整体尺寸大约250×150×200毫米放进收纳包有点勉强。我尝试过把加热管支架改成铰链折叠结构用的时候撑开不用的时候折平贴住底板整机厚度能减少约70毫米。这个改造的难点在于折叠关节的强度——折叠铰链在长时间热胀冷缩后容易松动需要定期紧固螺丝。7. 写在最后做这个项目最大的收获不是机器本身做完这台Robotic S’more Maker之后我自己有个特别深的体会真正有价值的地方不是“烤棉花糖”这个动作本身而是为了完成它你需要把机械结构、传感检测、闭环控制、安全冗余这样一套完整的技术链路全部串起来。很多做嵌入式开发的朋友都有个共同的问题——学过单片机、写过传感器例程、调过电机但从来没有把这三样真正融合在一个完整的实际项目里。而这个项目刚好提供了一个复杂度适中、容错率高、反馈感强的载体你做的每一步都有即时的物理反馈代码写对了棉花糖就烤得金黄逻辑写错了棉花糖当场发黑。这种“即时正反馈”对学习驱动力的提升比任何教程都管用。另外我还想多说一句安全方面的经验做这种带加热模块的设备安全设计必须从第一天就考虑而不是最后补丁。我的习惯是“三层安全法”——硬件层有限位开关防止干烧逻辑层有时间上限比如超过10分钟强制停机使用层有明确的警示标识和断电快捷键。这三层互相独立任何一层失效其他两层都能兜底。这个思路后来我用到其他项目上也从来没用出过问题。如果你按照这篇文章的顺序把这个项目做出来烤出的第一根棉花糖我建议你什么都不蘸直接吃——那个味道是你用一行一行代码“编译”出来的和买来的零食完全是两回事。