Купил отличную индукционную плитку MCL02M, которой остаюсь очень доволен и по сей день. Самое крутое в ней — это то, что на низкой мощности она всё ещё плавно регулирует мощность, а не за счёт интервалов включения и выключения. Из 99 уровней только на уровне 1 идут интервалы по 3 секунды. Уже с уровня 2 идёт именно плавный нагрев! И это реально круто.
Исходный код, документация и инструкции по прошивке опубликованы в репозитории: VlasovLabTech/mcl02m-custom-firmware.
Но была проблема — у плитки из коробки не работал кулер охлаждения. При напряжении до 8 В он вращался на малых оборотах, а дальше только дёргался. Плитка уходила в перегрев IGBT — китайцы поставили датчик температуры, и это очень круто! Деньги продавец вернул, а плитку оставил мне в подарок. В итоге я заменил кулер на радиальный (центробежный) вентилятор типа «улитка» из 3D-принтера и заказал запчасть C1015B1.
Надо сказать, что кулер из принтера ревёт сильно, но справляется со своей задачей. Кулер принтера рассчитан на 12 В, но для 18-вольтового питания вентилятора плитки подошёл как временный вариант. Я заранее протестировал его на 24 В.
Также интерфейс был исключительно на китайском. Раз уж разобрал плитку, то сразу посмотрел интерфейсную плату — она оказалась на обычной ESP32. А ещё между интерфейсной платой и силовой частью был интерфейс I²C, явно подписанный на плате. Поэтому было принято стратегическое решение: скачать текущую прошивку, попытаться в ней что-то найти, прослушать I²C и написать свою прошивку. Благо родная прошивка была открыта, спасибо китайцам за это!
Пришлось подключать GPT. Надо сказать, что прямо сразу с задачей декомпиляции он справился отлично! Он вытащил практически всё: какие ножки используются, какие интерфейсы, таблицы LUT для датчиков температуры, как передаются данные по I²C, что именно передаётся, и многое другое. Просто из бинарной прошивки!
Далее мы с ним написали тестовую прошивку, в которой уточнили органы управления и интерфейс: кнопки, светодиоды, пищалку и дисплей. Ещё мы подключились логическим анализатором LA2016 и использовали функционал другого моего проекта — OpenBench, в котором я подключаю все свои приборы, измерительные и не только, к одной среде и веб-морде для сбора данных и автоматизации тестов. GPT сам прослушал шину, сам пообщался с силовой платой, и, потратив около часа, мы восстановили протокол в достаточной степени для управления силовой платой.
Дальше накидали план, каким я хочу видеть управление этой плиткой, и начали реализовывать. Больше всего времени ушло на интерфейс, чтобы он начал выглядеть нормально, читаемо и удобно. На это реально ушло около целого долгого вечера.
Из того, что реализовано и что мне особо нравится: в режиме поддержания температуры реализован PI-контроллер. Сначала идёт быстрый нагрев, а крайняя ступень — поддержание температуры без выхода за мощность 35, чтобы не прыгать через переключение реле: поддерживаем только за счёт IGBT. Скачки происходят между уровнями 35–36 и 55–56. У этой плитки два кольца, поэтому в зависимости от мощности она включает внутреннее, внешнее, а затем оба. Ещё отображение на экране я сделал так, чтобы в режиме мощности можно было видеть текущую температуру, и наоборот.
Остальные улучшения уже так, для красоты: картинки, звуки, часы, отложенный старт, старт в установленное время, подключение по Wi-Fi и настройки через веб-интерфейс, время из интернета и так далее. Ещё реализовал режим кастомных профилей: до пяти последовательно выполняемых режимов в профиле. Это если надо сначала потушить, потом потомить, затем немного дать жару и снова потомить. Но кажется, что этим никто пользоваться не будет!
Немного информации от GPT — для всего этого я, естественно, пользуюсь Codex:
Новая прошивка заменяет только приложение интерфейсной ESP32. Раз в 500 мс она обменивается командами и телеметрией с силовым 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. Таймер и профиль ограничены пятью часами, retained-сессия — восемью, ручная Pause — двумя, cooking lease — тремя секундами. E09 возникает после шести подряд неудачных 500-мс циклов I²C.
R26=01 означает маленькую или ограниченную посуду, а не ошибку: реальный выход ограничивается 35/A1, POWER показывает честное значение и экран SMALL с P<36; уменьшать мощность можно, повышать выше 35 нельзя. В актуальных исходниках NoPan включает active zero, полностью проигрывает 128-секундную мелодию из «Щелкунчика» и только затем фиксирует E02. Возврат посуды отменяет мелодию и запускает двухэтапное восстановление; повторное снятие начинает мелодию заново.
В OLED-наборе 19 полноэкранных кадров: три чередующихся Ready, а также Time, Small, Wi-Fi, Hot и крупный код ошибки. Hot появляется после пяти секунд бездействия при температуре выше 60 °C, мигает 2 с / 1 с и блокирует Sleep до охлаждения. Таймер настраивается последовательно: секунды, минуты, часы; Set/Disable выполняются синхронно, START AT запрещён без установленного времени, а Delayed Start хранится только в RAM. Публичная и приватная звуковые сборки используют один код; публичная содержит NoPan-мелодию, приватная меняет только Wake/Sleep. Приватные MIDI и бинарник не публикуются. Код проекта распространяется по MIT с сохранением notice и без гарантии; исключённые приватные мелодии этой лицензией не покрываются.
После включения плитка всегда находится в Stop, а нагрев запускается только физическим нажатием Start. Wi-Fi по умолчанию выключен, а локальный web-интерфейс не содержит команд нагрева. Перед работой полную 16-МиБ flash считали дважды и сверили по SHA-256. Обычная запись затрагивает только ota_1 по адресу 0x170000; bootloader, partition table, ota_0, eFuse и силовой MCU не перепрошиваются. Позднее один раз отдельно и с разрешения очищался диапазон NVS 0x9000…0xCFFF, поэтому настройки не считаются неизменными. Возможность восстановления опирается на индивидуальный полный backup. Возможности текущих исходников, ещё не прошедшие отдельный тест на плитке, не считаются аппаратно подтверждёнными.
В итоге я доволен: плитка работает, как мне нравится, отображение и язык теперь супер, и функционал тоже. Убрал бесполезное подключение к Mi Home и все эти рецепты, которыми никто никогда не будет пользоваться. Да и, если честно, Wi-Fi удобен, конечно, и особенно хорош для часов, но я думаю, что в итоге тоже не буду им пользоваться. Это же просто плитка, а не космический корабль. С ума все уже сошли)))