У меня есть холодильник с очень крутой «фичей»: он пищит, если дверца открыта дольше, чем 60 секунд. В 95% случаев это больше раздражает, чем помогает. На мой взгляд, он просто должен заткнуться и считать, что мне виднее.

Чтобы поменять его поведение, я сначала попытался добраться до пьезодинамика, чтобы вырвать его с корнем. Оказалось, что это довольно бесплодное занятие, потому что основная плата встроена глубоко в холодильник. Я не особо готов отодвигать его от стены, чтобы добраться до платы, хоть и попробовал проползти к ней через панель управления, но без особого успеха:

Однако мне удалось добраться до дочерней платы, используемой в качестве панели управления холодильником.

Хакаем панель

Чтобы понять поверхность атаки и разобраться, можно ли как-то отключить сигнал, я выполнил реверс-инжиниринг панели управления. По сути, она имеет две функции:

  • Считывание кнопок (в том числе электромагнитный переключатель для определения состояния дверцы).

  • Управление светом.

Эти функции реализуются при помощи шестиконтактного разъёма на дочерней плате:

Этот разъём — последовательный интерфейс, позволяющий управлять двумя восьмибитными сдвиговыми регистрами (74HC595) на материнской плате:

Такая система позволяет холодильнику контролировать до 16 бит на дочерней плате; часть этих битов привязана к конкретным светодиодам на плате, другая часть используется для считывания состояния кнопок.

Каждая кнопка напрямую соединена с контактом OUT. Сначала это сбило меня с толку, потому что холодильник как будто не сможет определить, какая кнопка нажата в конкретный момент времени. Но здесь на помощь приходят сдвиговые регистры: кнопка не создаёт сигнала на OUT, если её бит в текущий момент не включен в сдвиговом регистре:

Таким образом, последовательность считывания кнопки имеет следующий вид:

  • Нажатие кнопок включает бит сдвигового регистра.

  • Считываем состояние контакта OUT.

  • Повторяем для каждой кнопки.

Мне удалось доказать это при помощи Raspberry Pi, притворившейся холодильником: я смог управлять светом:

И распознавать состояние кнопок:

Создание модчипа

После изучения панели управления я придумал пару способов потенциального отключения сигнала:

  • Автоматическое нажатие на отключение сигнала при его включении.

  • Убедить электромагнитный датчик, что холодильник закрыт.

Управление кнопкой отключения сигнала завело бы меня в тупик по следующим причинам:

  • Кнопка отключения сигнала не работает, пока не зазвучит сигнал.

  • При нажатии кнопка издаёт собственный звук, то есть если бы мы нажимали её по таймеру, то просто поменяли бы один шум на другой.

  • У панели управления нет обратной связи о том, когда звучит сигнал, поэтому мы не можем распознать его и нажимать на кнопку.

Перехват электромагнитного датчика выглядел более перспективно, но один из недостатков такого способа заключается в том, что когда холодильник находится в состоянии «дверца закрыта», его внутреннее освещение отключается.

Чтобы обойти эту проблему, я решил ждать максимально долго (примерно 59 секунд), а затем просто примерно 100 мс сообщать холодильнику, что дверцу закрыли.

Изначально я хотел использовать для модчипа микроконтроллер, но описанная выше система — это, по сути, цепь таймера. Поэтому нужную нам функциональность можно реализовать на простом таймере 555.

Таймер 555

Таймер 555 в автоколебательном режиме — это именно то, что нам нужно. Под «автоколебательностью» подразумевается, что 555 колеблется в цикле между включенным и отключенным состоянием. Временем, проводимым во включенном и отключенном состоянии, можно управлять при помощи пары резисторов (r_1​ и r_2​) и конденсатора (c).

Для вычисления времени в отключенном состоянии (t_0​) можно использовать формулу:

t_0​=0.694⋅r_2​⋅c

Время во включенном состоянии (t_1​) вычисляется так:

t_1​=0.694⋅(r_1​+r_2​)⋅c

В идеале нам нужно следующее:

t_0​=59000 ms, t_1​=100 ms

Но приведённые выше вычисления демонстрируют проблему: по умолчанию схема позволяет выбирать рабочий цикл в интервале 50% - 100%. Даже если сделать r_1​ минимальным (220 Ом), то мы получим рабочий цикл примерно 50%:

Решить эту проблему можно, добавив параллельно r_2​ диод, который позволит нам достичь рабочего режима в интервале от 0% до 50%:

 

Добавление диода меняет формулу вычисления t_0​ и t_1​:

t_0​=0.694⋅r_2​⋅c, t_1​=0.694⋅r_1​⋅c

Обратите внимание, что теперь t_1​ больше не зависит от значения r_2​.

Я остановился на следующих значениях резисторов и конденсатора:

r_1​=220 Ω, r_2​=300 kΩ, c=220 μF

Подставив эти значения в формулу, мы получим:

t_0​=0.694⋅300000⋅220⋅10−6=45804 mst_1​=0.694⋅220⋅220⋅10−6=48 ms

Это достаточно близко к тому, что нам нужно, поэтому я изготовил модчип с теми же значениями r_1​, r_2​ и c:

Затем я написал короткий скрипт time-delta.py для определения реального времени в отключенном состоянии в тестовой цепи. На самом деле, получилось даже ближе к нужному нам времени (около 59 секунд):

> python3 time-delta.py
avg=56.970      min=55.283      max=58.160

Идеально! Осталось только хорошенько обернуть всё это каптоновой лентой и снова засунуть в холодильник:

Вот видео того, как модчип на короткий промежуток времени подаёт высокий сигнал на электромагнитный датчик:

Победа! Мы научились общаться с холодильником и приказали ему перестать выполнять одну задачу.

Дополнительные ресурсы

Скрипты на Python

Комментарии (0)


  1. alan008
    24.09.2025 10:40

    А мне так не хватает такой пищалки в холодильнике!


    1. backfield9818
      24.09.2025 10:40

      Я на Озоне покупал и ставил, только было давно и не помню, как именно оно называлось. А, вот: Магнитная дверная/оконная сигнализация ALFA MC-03(батарейки в комплекте) 4 шт. купить на OZON по низкой цене (1659479218)
      Только так и не смог настроить, чтобы пищало не сразу.


      1. alan008
        24.09.2025 10:40

        Спасибо, добрый человек!


    1. viktoriaklishevs
      24.09.2025 10:40

      Согласна, отключать её это какое-то варварство. Однажды, пищалка привлекла моё внимание, и я пошла проверить что не так, оказалось, что бутылка с полки слегка выпирала в ящичек, который вверху дверцы, и она закрылась не полностью, а я даже не заметила, выходит она помогла. Однажды...


  1. almirus
    24.09.2025 10:40

    У меня пищалки нет, добавил

    alias: Оставили открытой дверь холодильника
    description: более 55 сек, произносит фразу 3 раза
    triggers:
      - entity_id:
          - binary_sensor.0xa4c138fc8e834dc9_contact
        to: "on"
        for:
          hours: 0
          minutes: 0
          seconds: 55
        trigger: state
    actions:
      - repeat:
          while:
            - condition: state
              entity_id: binary_sensor.0xa4c138fc8e834dc9_contact
              state: "on"
            - condition: template
              value_template: "{{ repeat.index <= 3 }}"
          sequence:
            - data:
                message: дверь холодильника осталась открытой
              action: script.play_text
            - delay:
                hours: 0
                minutes: 0
                seconds: 54
                milliseconds: 0
    mode: restart


    1. sintech
      24.09.2025 10:40

      А что говорит эту фразу, как это технически выполнено?


      1. almirus
        24.09.2025 10:40

        Подключена алиса через интеграцию YandexStation


  1. n0isy
    24.09.2025 10:40

    Ночной дожор?!


    1. almirus
      24.09.2025 10:40

      Есть и такое
      alias: Сколько раз открыли холодильник
      description: Издевательства Алисы
      triggers:
        - entity_id:
            - binary_sensor.0xa4c138fc8e834dc9_contact
          to: "on"
          trigger: state
      actions:
        - target:
            entity_id: counter.door_open_counter
          data: {}
          action: counter.increment
        - choose:
            - conditions:
                - condition: time
                  after: "20:20:00"
                  before: "01:00:00"
              sequence:
                - data:
                    message: >-
                      {{ [ "В холодильнике так ничего нового и не появилось", "Хватит
                      говорю", "Помни: после шести вечера каждая калория становится
                      врагом твоей формы!", "Холодильник не отдыхает, а ты должен!
                      Лучше выпей воды.", "Установлен запрет", "Лёгкость в теле —
                      лучший результат вечернего воздержания!",  "Закрой холодильник,
                      открой путь к стройности!", "Сильные люди не едят на ночь, будь
                      среди них!", "Кстати, а когда вы взвешивались?", "«не есть после
                      шести» быстрый способ сбросить лишний вес", "я устала
                      повторять", "(закатываю глаза)", "Еще один бутерброд? Ладно, но
                      не жалуйся потом на тесные джинсы!", "Кстати, в морозильнике
                      есть мороженое или уже нет?", "Вы ж за миниралкой?", "Может
                      похрустим морковкой?", "А может сделаем салатик?", "Пора спать",
                      "у датчика открывания двери скоро сядет батарейка", "Сегодня Вы
                      открывали дверь холодильника " ~
                      states("counter.door_open_counter") ~ " раз" ] | random }}
                  action: script.play_text
            - conditions: []
              sequence: []
      mode: restart


  1. Dmitry_604
    24.09.2025 10:40

    А что делать более 60 секунд с открытой дверцей? Ну кроме уборки какой-нибудь?


    1. kmx
      24.09.2025 10:40

      хомячить бутерброд, выбирая, что приговорить следующим)


    1. Kopilov
      24.09.2025 10:40

      Укладывать продукты после шопинга


  1. hira
    24.09.2025 10:40

    Да ну.

    Когда не один живёшь, холодильник хорошо так заполнен.

    И иногда его закрывают, а что-то чуток выпирает и поддавливает дверь. И вроде выглядит, как нормально закрытое, а по факту щель есть.

    Писк помогает обнаружить и устранить косяк.

    Пару-тройку раз в месяц происходит.


  1. lleo_aha
    24.09.2025 10:40

    А я бы с такой необходимостью - кнопку бы заклеил просто :)


  1. JohnDoe_71Rus
    24.09.2025 10:40

    а у меня в холодильнике такая пищалка просто выключается кнопкой, если не нужна.