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

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

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

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

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

Да! Любая 1-битная память, запускаемая Edge, будет достаточной.
@Swanand спасибо. 74HC74 подойдет? Можете ли вы предоставить какой-либо номер DIP IC, который я могу использовать?
@ ritesht93 SOT23-6 PIC10F200 будет дешевле и меньше, чем 74hc74 (и его можно получить вместо этого в DIP8, если вы предпочитаете это). Но контакт ввода-вывода обычно перезапускается в состоянии с высоким импедансом, поэтому резистивная подтяжка может быть достаточно. Можете ли вы предоставить свою текущую схему?
Вы можете добавить фиксирующую подачу для управления внешним компонентом. Circuitdigest.com/электронные схемы/…

Ответы (5)

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Рис. 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.

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

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

Взгляните на расширители I2C, такие как MCP23008. В основном такая же настройка, как у вашего ATtiny, за исключением другой прошивки. Он просто сохранит любое состояние, которое вы пожелаете, независимо от перезагрузки ESP.

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

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

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

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

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

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

т.е., 4,7 с = 4,7 кОм * 1000 мкФ

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

введите описание изображения здесь

Вместо того, чтобы связывать что-то очень простое, вы могли бы объяснить, что все, что вам нужно сделать, это подключить резистор к конденсатору. Я поднял ваш ответ, но кто-то другой понизил его до 0. (Возможно, потому что вы связались)
Спасибо за совет. Я позабочусь о том, чтобы я дал все объяснения сам, а не дал ссылку.
Скопируйте соответствующую информацию и сохраните ссылку.
Просто интересно, @karthikJay, какой путь разряда (или заряда) при перезагрузке? Пока я отвечал, я предположил, что перезагрузка не отключит чип, поэтому не будет разряда через входные защитные диоды, и, поскольку выходы должны иметь три состояния, там также не будет никакого понижения. Конденсатор должен долго держать заряд.
@ Транзистор Я просто забыл о защитных диодах, что, если последнее состояние было НИЗКИМ, а предыдущее состояние было высоким, я думаю, что конденсатор будет иметь ВЫСОКИЙ уровень из-за диода, это правильно?
(1) Нет. Диоды будут работать только в том случае, если входное напряжение выше Vcc или ниже GND. ОП сбрасывает свой микро без цикла питания, поэтому питание остается на чипе. C будет либо немного ниже Vcc, либо немного выше GND. Выходы должны перейти в тройное состояние (отключиться) при сбросе и оставаться в таком состоянии до тех пор, пока программа снова не превратит их в выходы. См. мой псевдокод для объяснения этой части. (2) Есть только одно состояние, о котором следует беспокоиться: был ли вывод высоким или низким в момент сброса.

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

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

Попробуйте использовать простую защелку, но вам может понадобиться три контакта GPIO. Во время работы, если выход на GPIO, который вы используете, имеет ВЫСОКИЙ уровень, подайте высокий-низкий импульс на SET, а если НИЗКИЙ, сделайте то же самое на RESET. Во время включения питания проверьте состояние Q, если ВЫСОКИЙ, поддерживайте требуемый контакт GPIO как ВЫСОКИЙ, иначе сделайте его НИЗКИМ.

введите описание изображения здесь

Извините, снова я. Что происходит, когда и SET, и RESET плавают (из-за тройного состояния) при микросбросе? Вам может сойти с рук это на пару секунд. Небольшой конденсатор на каждой линии? Количество компонентов и выводов растет!