我买了一台很棒的 MCL02M 电磁炉,直到今天我仍然非常满意。它最出色的地方,是在低功率下依然能够连续平滑地调节功率,而不是通过间歇开关来控制。在 99 个档位中,只有 1 档采用 3 秒的间歇;从 2 档开始就是真正的平滑加热。这一点确实很棒。
源代码、文档和烧录说明已经发布在仓库中:VlasovLabTech/mcl02m-custom-firmware。
不过它有一个问题:出厂时冷却风扇就不能正常工作。电压不超过 8 V 时,风扇会低速转动;电压再高,它就只会抖动。电磁炉因此导致 IGBT 过热——中国工程师安装了温度传感器,这一点非常好。卖家退了款,并把电磁炉留给了我。最后,我用 3D 打印机中常见的径向(离心式)“涡轮”风扇替换了它,并订购了 C1015B1 备件。
必须说明,这个打印机风扇噪声很大,但能够完成冷却任务。它的额定电压是 12 V,而电磁炉风扇供电是 18 V,所以它只适合作为临时方案。我事先已经在 24 V 下测试过它。
另外,原机界面完全是中文。既然已经拆开电磁炉,我便顺便查看了界面板,发现它使用的是普通 ESP32。界面板与功率部分之间采用 I²C 接口,而且 PCB 上标得非常清楚。因此我作出了一个战略决定:读取现有固件,尝试从中寻找信息,监听 I²C 总线,然后编写自己的固件。幸运的是,原厂固件可以读取——这要感谢中国工程师。
这项工作不得不请 GPT 参与。它从一开始就很好地完成了反编译任务,几乎提取出了所有信息:使用了哪些引脚、有哪些接口、温度传感器的 LUT 查找表、I²C 数据如何传输、具体传输了什么,以及更多内容。这些全部来自二进制固件。
随后,我们编写了测试固件,用来进一步确认控制器件和界面:按键、LED、蜂鸣器和显示屏。我们还连接了 Kingst LA2016 逻辑分析仪,并使用了我的另一个项目 OpenBench。在这个项目中,我把各种仪器——不仅是测量仪器——接入同一个环境和 Web 界面,用于采集数据和自动化测试。GPT 自己监听总线、自己与功率板通信。大约一个小时后,我们已经将协议恢复到足以控制功率板的程度。
接下来,我们列出了我希望电磁炉采用的控制方式,并开始实现。最耗时间的是界面:要让它看起来正常、清晰易读并且使用方便。这确实花掉了将近一整个漫长的晚上。
在已经实现的功能中,我尤其喜欢温度保持模式里的 PI 控制器。第一阶段快速加热,最后阶段则把功率限制在 35 档以内,以避免跨越继电器切换边界:仅通过 IGBT 进行调节。继电器切换发生在 35–36 档和 55–56 档之间。这台电磁炉有两个线圈,所以会根据功率依次使用内圈、外圈以及两个线圈同时工作。我还调整了屏幕显示:在功率模式下可以看到当前温度,在温度模式下也可以看到当前功率。
其他改进更多是为了美观和便利:图片、声音、时钟、延时启动、按设定时间启动、Wi-Fi 连接、通过 Web 界面设置、网络校时等。我还实现了自定义配置文件模式:每个配置文件最多可以包含五个依次执行的阶段。例如先炖煮,再慢煮,然后提高一点火力,再继续慢煮。不过我感觉可能没有人会使用它。
下面是 GPT 提供的一些信息——这些工作我当然使用了 Codex:
新固件只替换界面 ESP32 上的应用程序。它每 500 ms 与功率 MCU 交换命令和遥测数据,而线圈、继电器、风扇及硬件保护仍由功率 MCU 控制。协议中用于控制和诊断的工作部分已经恢复,但部分服务寄存器和功率控制器内部逻辑仍然未知。
手动 POWER 可使用 0…99。TEMPERATURE 范围为 40…190 °C,下部传感器另有 210 °C 的界面紧急限制;190 °C 尚未完成完整硬件验证。算法分为 PREHEAT、APPROACH 和 HOLD:PI 只用于 HOLD,并根据升温速度自适应制动;APPROACH/HOLD 最高为 35。自动控制会在 35 与 56 之间直接跨越,不使用 36…55;手动 POWER 仍保留全部范围。达到设定温度后进入 active zero。
POWER 0 和 Pause 通过 active zero 保留功率会话;Resume 会重新计算输出,不执行完整 Stop/re-arm。Start、Stop、Pause、Resume 和 active zero 都是需要确认的事务。Stop 会重复发送零输出命令,直到收到两个新的 R26=00。烹饪定时器和配置文件最长五小时,保留会话最长八小时,手动 Pause 最长两小时,cooking lease 为三秒。连续六个 500 ms I²C 周期失败后产生 E09。
R26=01 表示小型或受限锅具,并非错误:实际输出限制为 35/A1,POWER 显示真实允许值,并显示带 P<36 的 SMALL 图片;可以降低功率,但不能提高到 35 以上。在当前源代码中,NoPan 会进入 active zero,完整播放 128 秒《胡桃夹子》旋律,然后才锁定 E02。锅具放回会取消旋律并开始两阶段恢复;再次移走锅具时,旋律从头开始。
OLED 包含 19 个全屏画面:三个轮换的 Ready,以及 Time、Small、Wi-Fi、Hot 和大号错误代码。温度高于 60 °C 且五秒无操作时显示 Hot,以亮 2 秒 / 灭 1 秒闪烁,并在冷却前阻止 Sleep。定时器按秒、分、小时依次设置;Set/Disable 同步完成,没有有效时间时禁止 START AT,Delayed Start 只保存在 RAM。公开和私有声音构建共用同一套代码:公开构建包含 NoPan 旋律,私有构建只替换 Wake/Sleep。私有 MIDI 和二进制文件不公开。项目代码采用 MIT 许可证,须保留 notice,且不提供担保;排除在外的私有旋律不属于该许可证范围。
通电后电磁炉始终处于 Stop,必须实际按下 Start 才能加热。Wi-Fi 默认关闭,本地 Web 界面没有加热命令。开发前完整读取了两次 16 MiB 闪存,并用 SHA-256 比对。常规写入只涉及 0x170000 的 ota_1;bootloader、partition table、ota_0、eFuse 和功率 MCU 均不重写。后来曾单独获准擦除一次 NVS 0x9000…0xCFFF,因此不能说设置从未被改动。恢复依赖本机经过验证的完整备份。尚未在实机上单独测试的当前源代码功能,不作为硬件验证结果。
最终我很满意:电磁炉按照我希望的方式工作,显示和语言现在很好,功能也同样令人满意。我删除了没有用的 Mi Home 连接,以及那些几乎不会有人使用的菜谱。说实话,Wi-Fi 的确方便,尤其适合时钟,不过我想最后也不会使用它。这只是一台电磁炉,又不是宇宙飞船。大家都已经疯了。)))