做嵌入式这么多年,我碰过不少设备,但真正让我觉得“这个小东西能撬动整个生活体验”的,还是那台被我拆了又装的意式浓缩咖啡机。标题里这个项目——“Wi-Fi Espresso Machine Uses ESP32 MCU”——如果你也在玩ESP32,又想喝上一杯稳定、安全、还能远程控制的意式浓缩,那这个改造思路应该能帮上忙。说白了,就是用一颗ESP32接管咖啡机的温度传感器、加热棒和泵,把水温从“随缘”变成“设定多少就是多少”,再通过网络把状态推到手机和电脑上。
这项目不挑基础,嵌入式新手能跟着把硬件和安全做对;玩单片机有段时间的人,能在这套方案里看到状态机、PID、WebSocket这些老知识,是怎么在真实场景里组合起来的。下面我把整个设计逻辑、硬件选型、固件实现和踩坑记录全部倒出来。
1. 项目整体设计与方案选型
1.1 为什么用ESP32而不是普通单片机或树莓派
先从最根本的问题说起:给咖啡机加“大脑”,市面上可选方案很多。STM32、树莓派、甚至51都能干,但实操下来ESP32几乎是这个场景的最优解。
第一,ESP32原生的Wi-Fi和蓝牙,省掉一堆外围。这年头给咖啡机装大脑,核心诉求是远程监控、App控制、曲线下发。你如果用STM32,要么配一个ESP8266模块做透传,要么折腾以太网PHY,链路长、出问题点就多。ESP32内部自带Wi-Fi协议栈,开机几行代码就能连上路由器,不用自己移植协议栈,开发周期缩短一大截。
第二,ESP32的计算能力和外设资源足够。意式咖啡机的控制任务看着简单,实际算下来要同时跑温度采集、PID算法、泵的逻辑控制、网络服务、网页推送,偶尔还要OTA升级。ESP32是双核240MHz,跑这些完全有余量。我自己甚至把LVGL界面一起塞进去也不卡,如果将来想加屏幕,这条路也通。
第三,生态成熟。Arduino IDE里配置好ESP32开发环境,或者直接用ESP-IDF,几乎没有找不到适配库的坑。你在帖子搜索里看到一堆“esp32 spiffs插件”、“esp32 温湿度”、“esp32 lvgl”之类的高频词,就是因为这个圈子把常见需求都填得差不多了。相对于树莓派,ESP32开机秒起、功耗低、没有Linux那套更新和崩溃恢复的问题,更适合做开关机频繁的小家电控制器。
当然,选它也有代价——GPIO引脚数量有限,有些复杂控制需要扩展IO或I2C总线;另外如果项目用ESP32-S3,那原生USB串口和更多GPIO会让接线舒服很多,但要注意部分开发板的引脚复用规则。只要提前把引脚规划好,这块基本不是问题。
1.2 系统架构:传感器、执行器和控制链路
一个典型的ESP32意式咖啡机控制系统,从物理层面可以分成三层。
传感器层负责采集“状态”。这里最核心的是锅炉温度。意式浓缩的萃取温度通常在88℃到96℃之间,温度偏差超过±1℃,口感就已经有明显差别,所以温度采集必须有足够的分辨率和稳定性。温度之外,还有几个关键信号:锅炉水位(避免干烧)、泵的工作状态、萃取流量、压力参考值(如果条件允许)。我用了一个双金属机械温控器作为最后一道硬件保险,和MCU完全无关,这是项目安全的底线。
执行器层包括两大部分:一是加热棒的功率控制,我用的是过零型固态继电器(SSR),通过调整开启时间的比例来稳定温度;二是泵的控制,振动泵或旋转泵需要的是开关控制,外加预浸泡时的低频间歇动作。这里最容易被新手忽略的问题是:继电器或SSR的切换频率、驱动电流、以及高压端的隔离,都必须在设计时确认好,不加隔离直接拿GPIO去控制大功率负载,是相当危险的。
控制链路的核心是ESP32主控。它一边通过I2C或SPI读传感器,一边跑温度控制和萃取状态机,同时还对外提供Wi-Fi服务。实际工程中我建议把“控制回路”和“网络服务”分开看待,虽然都在这颗芯片上,但代码模块要分开,控制回路必须保证实时性,不能因为网页请求或者OTA中断导致水温控制脱离目标。
1.3 改造与安全:哪些地方绝对不能让程序接管
聊到家用电器改造,安全这块我永远放在第一位。用ESP32接管咖啡机,本质上是在给一台大功率、高温、带水的设备“重写大脑”,如果代码跑飞或者SSR击穿,后果不只是咖啡难喝那么简单。
我给自己定了几条红线,写代码和画电路时都会反复核对。
第一,必须有纯硬件冗余保护。MCU可以控制加热,但我不允许“MCU失效”成为唯一的安全失效模式。所以在加热回路里,我串了一个和软件无关的机械式温控器,温度超过设定阈值(比如105℃)就直接断开加热回路,MCU烧了、程序死循环了,它都会兜底。同理,锅炉缺水保护除了靠水位传感器反馈,我还会在底板上留一个浮球开关,串在控制回路里,无水就断电。
第二,SSR必须选“过零触发”且留足余量。咖啡机加热棒一般800W到1400W,市电220V下峰值电流大约6.4A到9A,SSR长期工作的额定电流要选25A以上,并配散热片。我踩过教训——第一次用10A SSR带1300W加热棒,不装散热片,连续工作两杯就热保护了。
第三,软件层面要做“看门狗+安全态”。ESP32跑网络服务,偶尔会出现任务阻塞或Wi-Fi重连时的卡顿,如果这时加热任务得不到调度,水温会失控。我在主循环里给加热控制任务一个独立优先级,确保它不被网络任务饿死;同时开看门狗,一旦某个任务挂死,立即重启到安全状态,安全状态下加热默认关闭。
第四,断网降级策略。Wi-Fi断连时,设备不能变成“砖头”或失控状态。我的固件里有一个本地模式:网络挂了,用户仍然可以通过机器面板上的物理按键完成开关机、设定恒温、一键萃取。远程控制只是便利,本地控制才是底线。
2. 核心硬件选型与电路连接
2.1 ESP32开发板选型建议(S3/WROOM的取舍)
先说结论:新项目建议直接选ESP32-S3,玩老模块的也可以继续用ESP32-WROOM-32,两者开发流程一致,但S3在外设和调试体验上更有优势。
S3和经典ESP32的区别,对我来说最明显的是三点。一是S3原生支持USB串口和USB OTG,插上Type-C就能烧录,不用额外接USB转TTL。二是S3的引脚数量更多,引脚复用也灵活,咖啡机这种需要同时接温度传感器、流量计、水位开关、串口屏的场景,GPIO规划从容很多。三是S3的AI加速指令集,虽然本项目用不上,但以后想加语音控制或者摄像头识别咖啡液状态,就不用在硬件层面重新换平台。
当然WROOM-32也完全够用,尤其是手上正好有料的情况下。需要注意的是部分开发板虽然写着32,但引脚可能被板载LED、电池充电芯片等占用,比如GPIO12、GPIO2,接线前一定查清楚。
我实际采用的是一块S3 DevKitC,用它做测试,然后直接把GPIO按计划引到端子上。这里有个实操小习惯:把每路信号的引脚分配记录成一张表,写进项目说明里。我见过不少朋友改咖啡机,全凭脑子记,最后接线乱了,排查半天才发现是GPIO冲突。
2.2 温度采集链路:NTC、PT100与热电偶怎么选
温度传感器是这台咖啡机最关键的感知单元。市面常见的三种方案,我都试过,感受完全不同。
NTC热敏电阻,优点是便宜、电路简单、响应快,缺点是线性差、需要查表或公式换算。我之前用NTC做过温度控制,在80℃以上时分辨率确实不如专业方案,而且NTC的一致性参差不齐。如果你只是入门验证逻辑,用NTC加一个10kΩ分压电阻、接ESP32的ADC口,够用;但要精准控制萃取温度,我建议至少把NTC校准几个关键点。
PT100铂电阻,是我最终推荐的方案。它的线性度和长期稳定性很好,配合MAX31865专用放大芯片,全程冷端补偿。咖啡机工作温度范围不大,PT100在这个区间可以做到±0.2℃的精度,满足意式萃取的稳定性需求。硬件连接上,我用的是3线制接法,消除导线电阻误差,SPI接口读取数据,非常稳。
热电偶理论上测温范围更广,但咖啡机场景其实用不到那么高的上限,而且热电偶需要冷端补偿,参考端温度一漂,读数也跟着偏。如果未来想测量蒸汽温度远超300℃的场景,热电偶才是必备选项。但就浓缩咖啡机锅炉来说,PT100已经完全覆盖。
接线的时候,还有一个容易被忽视的点:传感器线要和不加热的控制线分开走。咖啡机内部有加热棒的高压线,会产生磁场干扰,温度传感器信号线如果和它绑在一起,ADC或SPI读数会出现周期性的尖峰。我自己第一次装的时候,把PT100导线和加热棒电源线一起走线槽,结果读数在加热时跳了将近0.5℃,后来分开走线才恢复正常。
2.3 加热与泵控制:SSR选型和接线细节
加热控制我直接选了固态继电器,普通电磁继电器在这个项目里并不适合。原因很简单:温度控制需要频繁通断,如果用机械继电器,每一次动作都有电弧烧蚀和触点老化的风险,寿命在以万次为单位的控温循环里不够看;而SSR没有机械触点,过零导通时几乎没有EMI干扰,寿命和静音特性都更适合。
选SSR有几个关键参数,必须根据咖啡机实际功率算清楚。假设加热棒是1300W,市电220V,电流 = 1300 / 220 ≈ 5.9A。再看启动瞬间,加热棒是纯阻性负载,没有电机那种大启动电流,但电压波动和设备老化时要留冗余,我选的是40A的输出额定电流。实际接的负载不到额定电流的四分之一,SSR发热很小。散热片照配,长期工作更安心。
接线时,SSR的控制输入端是直流低压,我用GPIO输出3.3V信号通过三极管驱动到SSR的输入侧。其实很多SSR输入电压支持3-32V DC,直接用GPIO接也可以,但为了给GPIO留点保护,我加了一个限流电阻和电压转换。高压端:L线进SSR输出侧,然后接到加热棒,N线直接接到加热棒另一端。所有高压接线用热缩套管和陶瓷端子固定,不与低压部分混在一起。
泵的控制类似,我用的是第二路SSR或者大电流MOSFET。意式咖啡机的泵是交流振动泵,启动瞬间会有浪涌电流,MOSFET要留足够裕量。如果可以,在泵控回路里并联一个RC吸收回路,可以减小开关瞬间的电压尖峰。这些都是很实际的经验,说明书上未必写。
2.4 压力、流量与水位传感器的接入
温度之外,真正提升意式咖啡“玄学”程度的是压力和流量。这两个数据不直接参与安全控制,但对萃取曲线的研究和一致性很有价值。
压力测量,市面上有工业级的4-20mA压力变送器,也有I2C数字压力表。考虑到成本和接线难度,我选择在锅炉后端安装一个量程0-20bar的传感器,它的模拟电压输出接入ESP32的ADC口,通过一段比例换算得到bar值。实操中要注意:压力传感器的供电电压必须稳定,否则读数和实际压力会漂移,所以我单独用一路带稳压的电源给它供电,不和泵共地(共地可以,但供电要稳)。
流量测量,用霍尔流量计(比如YF-S201)就能出数据。流量计内部是一个叶轮加霍尔传感器,通过ESP32的外部中断引脚检测脉冲数量。每次脉冲对应固定的毫升数,累积计算就能得到萃取液量。这个数据对自动停止萃取非常有用——当你设定“40ml出杯”时,不需要再盯着杯子看。
水位检测,我用了两个浮球开关,一个装在高位报警,一个装在低位保护。低水位开关串进加热控制回路,水位不足时直接断开加热,这是冗余保护的一部分。用浮球而不是电容式传感器,是因为咖啡机锅炉里有水垢,电容式测液位很容易误判。
2.5 电源与隔离设计的关键细节
整个系统的供电设计,是很多DIY项目翻车的高发区。ESP32本身需要3.3V,但咖啡机箱内没有3.3V电源,需要一个纹波控制不错的LDO或者DC-DC模块。我建议用DC-DC降压到5V,再用LDO降到3.3V,避免直接12V或24V变3.3V的过度压差发热。
这里有个容易踩的坑:ESP32对电源噪声比较敏感。咖啡机的泵启动、SSR通断瞬间,市电侧会出现较大电流浪涌,如果ESP32的电源和泵驱动共用一条供电链路,可能导致主控复位或读数异常。我的做法是:泵驱动用单独一路供电,ESP32用另一路DC-DC供电。又因为需要检测220V高压侧的泵状态,我会把状态信号通过光耦隔离后送入GPIO。
隔离的思路可以说得很直白:高压弱电之间,除了地可以共通(通常还要小心),信号必须通过光耦、磁隔离等方式传递。如果我直接用一根杜邦线把220V侧的传感器信号接到开发板,一旦某个器件击穿,开发板和电脑都可能遭殃。所以做这类项目,隔离不是“高级选项”,而是必须项。
3. 固件开发:从点灯到智能萃取
3.1 开发环境搭建与离线包的处理
固件部分,我用的标准开发方式是VS Code加PlatformIO,不过群里也有不少人还在用Arduino IDE。Arduino IDE搭建ESP32开发环境时,最容易遇到的问题就是“下载库失败”,尤其是网络不稳定的情况下,在线安装包经常卡在最后一步。实操层面,直接下载别人打包好的离线包,解压到Arduino的hardware目录里,是最省心的方案。网上常见的esp32离线包到2.0.6或3.3.10版本,选一个稳定的版本用,不要追新。
我自己从Windows切换到WSL开发的时候,也遇到不少环境问题,比如USB设备怎么桥接进WSL、串口权限怎么设置。后来在VS Code里装了Remote-SSH / WSL扩展,配合PlatformIO的USB passthrough设置,才把整个流程理顺。如果你觉得这一套太麻烦,那就乖乖用Arduino IDE,功能完全够。
环境搞定后,固件里首先要初始化的是硬件外设:SPI读PT100、IO控制SSR、中断读流量计、ADC读压力。跑通“读温度→控制加热→温度稳定”的最小闭环,我建议先不要写任何Wi-Fi功能,这样硬件问题能尽早暴露。
3.2 温度控制核心:PID参数与加热PWM周期
咖啡机控温,最难的不是“加热到90℃”,而是“长时间保持90℃±0.5℃”。基础做法是开关控制:低于阈值开加热,高于阈值关掉。这种bang-bang控制最大问题是温度会在目标值附近往复波动,波动范围往往能到±3℃,对浓缩萃取来说太粗糙。
我用的是PID算法,实现方式不复杂。采样周期设为1秒,输出是加热的PWM占空比。一个关键参数是PWM周期,我用了20秒:20秒内按占空比控制SSR开多久、关多久。为什么不用常见的1-2秒周期?因为SSR通断越频繁,电网冲击和发热越明显;而20秒周期在热惯性较大的锅炉系统里,足够细腻。
PID调参方面,我最终整定的参数大约是P=800,I=0.008,D=0。但大家不要照抄,不同加热功率、不同锅炉容量,参数差别很大。先用“只有I项”的方式调:设定I很小,让温度缓慢逼近目标,稳定一段时间后看超调量;然后逐渐加大I,直到温度以可接受的幅度围绕目标波动;最后如果有过冲,再加一点P。实际效果是,锅炉从冷水加热到92℃的整个过程会有少量超调(大约2℃),稳定后能控制在±0.3℃以内。
还有一点必须强调:温度传感器读数要加数字滤波。我看过很多PID发散的案例,根本不是算法问题,而是原始温度数据噪声太大。用递推平均滤波,取最近5次采样的平均值,计算量小,效果立竿见影。核心控制循环大概长这样:
static unsigned long lastSample = 0; static bool heating = false; static unsigned long pwmStart = 0; void updateTemperatureControl() { unsigned long now = millis(); if (now - lastSample >= 1000) { lastSample = now; float temp = readPT100(); temp = lowPassFilter(temp); pid.Update(temp); heating = pid.output() > 0; pwmStart = now; } unsigned long onTime = (unsigned long)(pwmPeriodMs * pid.output() / 100.0f); bool shouldOn = heating && (now - pwmStart < onTime); digitalWrite(SSR_PIN, shouldOn ? HIGH : LOW); }这段代码里,pwmPeriodMs就是20秒对应的20000ms,pid.output()返回0-100的占空比。注意我用的是非阻塞写法,没有在循环里插入delay(),否则网络任务和高优先级控制任务会互相干扰。
3.3 萃取状态机:预浸泡、稳压和流量曲线
做了远程控制之后,我才意识到咖啡机的“逻辑核心”其实是状态机,而不是单向过程。
整个萃取状态大概是:IDLE → PREHEAT(预热)→ READY(待机)→ PREINFUSION(预浸泡)→ BREWING(萃取)→ DONE(完成)。每一个状态都有进入条件、退出条件和超时保护。
预浸泡这个功能,是很多家用机不具备但它对口感影响极大的环节。操作是:先以低压让热水缓慢浸润咖啡饼,持续几秒到十几秒,让咖啡粉吸收水分,然后暂停,再启动泵建立高压进行正式萃取。状态机里,我只用控制泵的开关时间就能实现:泵开2秒、停3秒、再开,循环三次后进入BREWING。如果你想做得更精细,还可以通过压力传感器反馈,让预浸泡阶段的压力保持在2-3bar左右。
正式萃取阶段,核心是“维持压力稳定”。这里我用泵的PWM或间歇控制来逼近目标压力,同时通过流量计实时累积体积。当累计液量达到设定值(比如40ml)时,自动停止泵,状态进入DONE。整个过程我会记录温度、压力、流量时间戳,通过WebSocket推到网页端,形成一条萃取曲线。多试几杯后,你会慢慢理解为什么说“温度、压力、时间三要素共同决定一杯浓缩的酸甜平衡”。
这部分的代码难度不高,重点是状态机的“状态迁移表”要定义清楚,不要让非法迁移发生。我习惯用枚举类型写状态,写一个统一的状态机更新函数,而不是散落在外循环里的一堆if-else:
enum BrewState { IDLE, PREHEAT, READY, PREINFUSION, BREWING, DONE }; BrewState currentState = IDLE; void brewStateMachine() { switch (currentState) { case IDLE: if (tempReady && brewButtonPressed) currentState = PREHEAT; break; case PREHEAT: runHeating(); if (reachedTargetTemp()) currentState = READY; break; case READY: if (startBrewRequested()) currentState = PREINFUSION; break; case PREINFUSION: // 泵开2秒、停3秒,循环3次 if (preinfusionFinished()) currentState = BREWING; break; case BREWING: runPump(); if (flowTotalMl >= targetMl || pressureTooHigh()) currentState = DONE; break; case DONE: stopPump(); break; } }代码只是一个骨架,真正要注意的是每个状态里的“超时保护”,比如预浸泡阶段如果压力一直上不去,不能死循环卡在那里,必须超时退回到错误状态并通知用户。
3.4 Wi-Fi控制端:Web页面与手机App
有了稳定的本地控制之后,Wi-Fi和App层面的开发才能谈得上。ESP32同时作为服务器和客户端,在我的项目里有几个核心功能。
Web界面我用了ESPAsyncWebServer加SPIFFS(或LittleFS)存储网页静态文件。用户通过局域网IP打开控制页,就能看到实时温度、压力、流量曲线,以及设定目标温度、启动萃取、暂停/停止等控制按钮。为了实时刷新数据,我用了WebSocket向所有已连接的客户端推送温度数据。ESP32的Wi-Fi吞吐量不大,但推一个小型JSON字符串,完全不是问题。
移动App方面,不熟悉原生开发的人可以直接做一个Web App,在手机上把网页保存到桌面,体验接近原生应用。如果一定要原生App,ESP32同时也支持BLE蓝牙,可以用手机App通过蓝牙控制。热搜词里“蓝牙app控制esp32”就是这么个场景:蓝牙通道适合近距离且现场没有路由器的环境。我把蓝牙作为本地后台通道和Wi-Fi并行工作,两个通道都能触发萃取,但通过同一个状态机去执行,不会发生双通道冲突。
另外要提一下“esp32在线烧录”这个高频需求。我用的ESPAsyncWebServer里有一个OTA路由,浏览器上传固件后直接重启烧写。这个功能在改完咖啡机又不想每次拆机烧录的时候,真是救命级的存在。配合Web页面上的“固件升级”标签页,全流程可视化,比串口烧录舒服太多。
3.5 配置保存、OTA升级与断网降级策略
固件的一个隐藏需求是参数持久化。我不想每次重启都把PID参数、目标温度、预浸泡时间重新设一遍,所以把配置写在SPIFFS里的一个JSON文件中。烧录时要把SPIFFS分区大小设置得当——如果你用Arduino IDE,Tools里选Partition Scheme为“Huge App (3MB No OTA/1MB SPIFFS)”,这样程序空间和文件系统空间都够用。否则写大的网页文件时可能溢出头大的问题,我在项目初期就被这个卡了半天。
固件升级方面,我设置了两个OTA方式:一是Web OTA(浏览器传.bin固件),二是带身份校验的串口OTA。升级过程中,控制回路处于暂停状态,并且自动回到安全态。做这个设计不只是为了“功能丰富”,更是因为一台已经嵌进机器里的设备,如果之后每次调PID都要拆机接线,会非常打击持续优化的热情。OTA做通了,调参和加功能都会快很多。
断网降级策略前面提过,这里补充实现细节。我写了一个network supervisor任务,定期检测Wi-Fi连接状态;一旦断连超过30秒,就把设备切到本地模式,同时点亮指示灯提示。本地模式下,面板按键的响应优先级最高,远程Web控制入口直接禁用。当Wi-Fi恢复后,再回到远程控制模式。这样即使家里路由器断电,咖啡机依然能正常工作,不会因为“智能”而变成废铁。
4. 校准、调试与常见问题排查
4.1 温度校准和PID整定的实操步骤
温度校准是必须做,但很多人会跳过。我的方法很简单:准备好一支可靠的数显温度计(至少±0.5℃),跟PT100读数做个对比。标准办法是两点校准——冰水混合物设定为一个低点,沸水设为另一个高点,然后对固件里的偏移量做线性修正。校准后,我在锅炉实际目标温度附近再复核一次,比如设定92℃,观察读数是否在合理误差范围内。如果偏差超过0.5℃,问题多半出在传感器安装位置,而不是校准公式。
PID整定我不能只给你一套参数,因为加热器功率、锅炉热容量差异太大。我建议的流程是:先把I设为0,P设为一个很小的值(比如100),看温度是否能在较长时间内稳定在一个较低的水平;然后慢慢加I,直到温度收敛到目标值附近;最后如果超调太大,加一点D。整个调参的过程要记录数据,不要把参数改来改去不记。后来我发现,60%以上的控温质量问题,根源不是PID,而是PWM周期太长和传感器滤波不够,而不是那几个数字。
4.2 常见问题速查与排查思路
这个项目做到后半程,问题清单越来越长,我整理成一张速查表,顺手贴在机箱上。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| ESP32无法连上Wi-Fi | SSID或密码错误、路由器2.4G被关闭 | 先确认手机能连同一路由;再检查设备是否上电稳定后连网 |
| 温度读数跳变 | 传感器线缆靠近加热电源线、ADC电源噪声大 | 分开走线;给传感器独立稳压供电 |
| 加热棒不工作 | SSR控制端无信号、SSR损坏、安全温控器断开 | 用万用表量SSR输入电压;检查机械温控器是否断开 |
| 温度严重过冲 | PID的I项过大、PWM周期太短 | 减小I、加大PWM周期、提高传感器滤波强度 |
| 自动萃取不停止 | 流量计无脉冲、中断函数未触发 | 检查流量计接线、用串口打印看脉冲是否进来 |
| 泵启动时ESP32复位 | 泵驱动和主控共用电源链路 | 泵驱动用独立电源;GPIO控制信号加光耦隔离 |
| 网页页面打不开 | SPIFFS未写入或分区太小 | 确认烧录时SPIFFS分区设置;重新上传网页文件 |
| OTA升级失败 | 固件体积超分区容量、上传速度过快 | 检查Flash分区表;重新选择Huge App分区 |
排查问题的时候,我习惯先看“最基本的链路通不通”,再往上层查。比如Web页面打不开,第一步不是改代码,而是确认MCU有没有正常连网、SPIFFS文件到底有没有烧进去。串口日志是最直观的突破口,在关键节点加Serial.println,比用调试器更快定位问题。
4.3 安全与长期运行的避坑经验
这部分是我最想认真分享的。做智能家电改造,尤其是带220V高压、高温、水的设备,任何“图省事”都可能变成风险。
第一个经验是:第一次上电测试,不要直接接锅炉。我先用一个大功率白炽灯泡代替加热棒,验证SSR和PID控制逻辑。灯泡亮暗变化就是占空比直观的体现,温度曲线用小加热杯验证。逻辑全部跑通后,再切换到真实锅炉做极限测试。这样万一接线错误,最多烧个灯泡,不会伤到人或者设备。
第二个经验是:给设备加一个总电源开关和急停按钮。我习惯在改造机器上保留原机的物理开关,同时新增加一个独立的急停按钮,接在主回路里。任何异常,拍下去就全机断电,比等MCU处理强得多。不要觉得自己代码很稳就省掉这一层,可靠性和“我很有信心”完全是两码事。
第三个经验是:长期运行要定期检查。SSR的散热器过几个月可能积灰,浮球开关在水垢浸泡下会卡滞,接线端子会因热胀冷缩而松动。我在固件里记录了每次开机时间和加热总时长,每隔一段时间就手动巡检一次。智能家居的核心价值是“可控”,不是“不用管”。
第四个经验是关于用户体验的:远程开启加热,一定要有“预热完成”通知。我刚开始没有推送,咖啡机预热完成后我在另一个房间完全不知道,等走过去发现已经过了最佳状态。后来在状态机里加了预热完成的事件,通过本地MQTT推送通知,手机弹一条消息,才真正把“远程操作”变成了“舒心操作”。
最后再分享一个小技巧:所有参数尽量做成运行时可以通过Web页面调整,而不是每次改代码重新烧录。实测下来,这套系统最频繁的改动是预浸泡秒数和目标温度,PID参数反而很少动。把这些都放到配置页后,调咖啡口味就变成纯软件操作,机器本尊只负责执行,省心非常多。