Сохранение состояния вывода GPIO при перезагрузке

У меня есть ESP-12, припаянный к этой плате-адаптеру. Я использую прошивку NodeMCU на основе Lua для кодирования логики.

Я запланировал периодическое выполнение node.restart. Один из пинов GPIO используется для управления внешним компонентом, используя состояние HIGH или LOW. Я могу восстановить состояние GPIO (HIGH/LOW) после node.restart, но во время перезапуска состояние GPIO не определено. Я хочу сохранить это состояние, особенно если оно было HIGH.

1 подход, который я имею в голове, заключается в том, чтобы иметь другой микроконтроллер, такой как ATTinyX, который подключен к ESP-12 через UART. ESP-12 может передать ATTinyX строку/знак для поддержания состояния (GPIO пин ESp-12 и ATTinyX пин соединены с внешним компонентом через OR gate) и затем пойти на перезагрузку. После завершения перезагрузки ESP-12 может сообщить ATTinyX, что не нужно поддерживать состояние, поскольку ESP-12 может поддерживать его сейчас после перезагрузки.

Это добавляет немного затрат и компонентов, есть ли другой способ достичь того же самого? Я больше занимаюсь программным обеспечением, у меня меньше знаний в области электроники. Любая помощь будет принята с благодарностью. Может быть, это похоже на 1-битную память, которая устанавливается/сбрасывается ESP-12, могу ли я использовать флип-флоп в этом случае?

Рисунок 1. Государственный удерживающий конденсатор.

Подключите запасной GPIO, как показано на рисунке. При сбросе считайте состояние конденсатора и установите соответствующий выход. Это даст вам кратковременную 1-битную память.

//Pseudo code to go early in boot sequence.
pinPullup(pin) = false;        //Turn off the pull-up.
pinMode(pin) = input;          //Set the pin to input mode, if required.
pdState = pinRead(pin);        //Read the input to get the power-down state.
pinMode(pin) = output;         //Configure as output.
pinWrite(pin) = pdState;       //Restore the power-down state.

Вы можете поменять местами порядок последних двух строк (в зависимости от микросхемы), чтобы избежать кратковременного всплеска.

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

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

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

http://www.electronics-tutorials.ws/rc/rc_2.html

редактирование:

Чтобы быть более конкретным, я предполагаю, что время, необходимое для перезагрузки, составляет менее двух секунд, поэтому теперь постоянная времени RC-сети должна быть почти в два раза больше времени перезагрузки. Выбираю постоянную времени 4,7 секунды.

Постоянная времени T = R * C

т.е. 4,7 с = 4,7K OHMS * 1000uf

Причина, по которой постоянная времени должна быть в два раза больше требуемого времени, заключается в том, что когда конденсатор начинает разряжаться, при половине постоянной времени напряжение конденсатора будет составлять около 60% от напряжения при полной зарядке, что составляет 3 вольта при 2,35 секунды, так как время перезагрузки меньше этого, будет поддерживаться высокий уровень.

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

Если состояние вывода до выключения питания известно, можно использовать подтягивание или опускание для поддержания этого состояния во время загрузки. Также могут помочь большие конденсаторы.

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

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