不过它有一个问题:出厂时冷却风扇就不能正常工作。电压不超过 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 上的程序。我们没有重新烧录功率板:ESP32 每 500 ms 通过 I²C 向功率板发送命令并接收遥测数据,而原厂控制器仍然负责线圈、继电器、风扇和硬件保护。为了开发,我们制作了两套独立测试固件:一套用于检查面板,另一套用于安全地研究和控制功率部分。
功率模式范围为 0 到 99,温度模式范围为 40 到 175 °C。系统提供最长五小时的定时器、暂停、未来 24 小时内的延时启动,以及五个可保存配置文件,每个配置文件包含五个阶段。界面完整支持俄语、英语和中文。我们还为 OLED 显示屏准备了不同状态的图片,并为蜂鸣器制作了多段旋律。
我们特别重视安全性。电磁炉通电后始终处于 Stop 状态;仅旋转编码器不能启动加热,必须实际按下 Start 按钮。固件监控 NTC 和 IGBT 温度、电网电压、功率板状态以及与功率板的通信。发生通信中断、过热或错误时,加热会被关闭。此外,还提供独立的无锅检测、五小时连续运行限制,以及防止程序卡死的 watchdog。
Wi-Fi 默认关闭。本地 Web 界面可以修改设置和编辑配置文件,但设计上明确禁止远程启动、停止或改变加热。所有与烹饪有关的命令只能通过电磁炉的物理控制面板执行。
在开始实验前,我们两次读取了完整的 16 MiB 闪存,并使用 SHA-256 验证副本。新程序只写入一个原有 OTA 分区,没有改动 bootloader、原厂固件、设置或功率板固件。因此,恢复电磁炉原始状态的能力得以保留。
最终我很满意:电磁炉按照我希望的方式工作,显示和语言现在很好,功能也同样令人满意。我删除了没有用的 Mi Home 连接,以及那些几乎不会有人使用的菜谱。说实话,Wi-Fi 的确方便,尤其适合时钟,不过我想最后也不会使用它。这只是一台电磁炉,又不是宇宙飞船。大家都已经疯了。)))