Behalten Sie den Zustand des GPIO-Pins über den Neustart hinweg bei

Ich habe ein ESP-12 auf diese Adapterplatine gelötet . Ich verwende NodeMCU Lua-basierte Firmware, um die Logik zu codieren.

Ich habe geplant, node.restartregelmäßig auszuführen. Einer der GPIO-Pins wird verwendet, um eine externe Komponente mit HIGH- oder LOW-Zustand anzusteuern. Ich kann den GPIO-Status (HIGH/LOW) danach wiederherstellen, node.restartaber während des Neustarts ist der GPIO-Status undefiniert. Ich möchte diesen Zustand beibehalten, insbesondere wenn der Zustand HOCH war.

Ein Ansatz, an den ich denke, ist ein weiterer Mikrocontroller wie ATTinyX, der über UART mit ESP-12 verbunden ist. ESP-12 kann ATTinyX einen String/ein Zeichen geben, um den Zustand beizubehalten (ESp-12 GPIO-Pin und ATTinyX-Pin sind über ein ODER-Gatter mit der externen Komponente verbunden) und dann einen Neustart durchführen. Sobald der Neustart von ESP-12 abgeschlossen ist, kann es ATTinyX anweisen, den Status nicht beizubehalten, da ESP-12 ihn jetzt nach dem Neustart beibehalten kann.

Dies fügt ein wenig Kosten und Komponenten hinzu. Gibt es einen anderen Weg, um dasselbe zu erreichen? Ich bin eher auf der Softwareseite, habe weniger Elektronikkenntnisse. Jede Hilfe ist willkommen. Vielleicht ähnelt es einem 1-Bit-Speicher, der von ESP-12 gesetzt / zurückgesetzt wird. Kann ich in diesem Fall ein Flip-Flop verwenden?

Ja! Jeder flankengetriggerte 1-Bit-Speicher wäre gut genug
@Swanand danke. 74HC74 würde funktionieren? Können Sie eine DIP-IC-Nummer angeben, die ich verwenden kann?
@ritesht93 Ein SOT23-6 PIC10F200 wäre billiger und kleiner als ein 74hc74 (und kann stattdessen in DIP8 erworben werden, wenn Sie das bevorzugen.) Aber ein E / A-Pin wird normalerweise in einem Zustand mit hoher Impedanz neu gestartet, also einem resistiven Pull-up könnte reichen. Kannst du deinen aktuellen Schaltplan zur Verfügung stellen?
Sie können einen Latch-Feed hinzufügen, um Ihre externe Komponente anzusteuern. circuitdigest.com/elektronische-schaltungen/…

Antworten (5)

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Abbildung 1. Zustandshaltekondensator.

Verdrahten Sie ein Ersatz-GPIO wie gezeigt. Lesen Sie beim Zurücksetzen den Zustand des Kondensators und stellen Sie den Ausgang entsprechend ein. Dadurch erhalten Sie ein kurzfristiges 1-Bit-Gedächtnis.

//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.

Möglicherweise möchten Sie die Reihenfolge der letzten beiden Zeilen (je nach Mikro) vertauschen, um einen vorübergehenden Blip zu vermeiden.

Beachten Sie, dass der Pin in dieser Konfiguration für nichts anderes verwendet werden kann.

Schauen Sie sich einen I2C-Expander wie MCP23008 an. Im Grunde das gleiche Setup wie bei Ihrem ATtiny, abzüglich einer anderen Firmware. Es behält einfach jeden gewünschten Zustand bei, unabhängig von ESP-Neustarts.

Versuchen Sie, einen Kondensator zu verwenden, der die erforderliche Spannung für die Dauer des Neustarts liefert. Der folgende Link kann Ihnen helfen, den passenden Kondensatorwert zu finden.

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

bearbeiten:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Genauer gesagt gehe ich davon aus, dass die für den Neustart erforderliche Zeit weniger als zwei Sekunden beträgt, sodass die Zeitkonstante des RC-Netzwerks jetzt fast doppelt so lang sein muss wie die Neustartzeit. Wählen Sie eine Zeitkonstante von 4,7 Sekunden.

Zeitkonstante T = R * C

dh 4,7 s = 4,7 K Ohm * 1000 uf

Der Grund, warum wir die Zeitkonstante doppelt so groß wie die erforderliche Zeit haben sollten, ist, wenn ein Kondensator mit der Entladung beginnt, würde die Kondensatorspannung bei der Hälfte der Zeitkonstante etwa 60 % der Spannung betragen, während er voll geladen ist, was 3 Volt bei 2,35 entspricht zweitens, da die Neustartzeit kürzer ist, wird ein hohes Niveau beibehalten.

Geben Sie hier die Bildbeschreibung ein

Anstatt etwas sehr Einfaches zu verknüpfen, könnten Sie erklären, dass Sie lediglich einen Widerstand an einen Kondensator anschließen müssen. Ich habe Ihre Antwort hochgeblättert, aber jemand anderes hat sie auf 0 heruntergeblättert. (Wahrscheinlich, weil Sie verlinkt haben)
danke für den Tipp. Ich werde sicherstellen, dass ich alle Erklärungen von mir selbst gebe und keinen Link zur Verfügung stelle.
Kopieren Sie die relevanten Informationen und behalten Sie auch den Link bei.
Ich frage mich nur, @karthikJay, was ist der Entlade- (oder Lade-) Pfad während des Neustarts? Während ich antwortete, ging ich davon aus, dass der Neustart den Chip nicht ausschaltet, sodass es zu keiner Entladung durch die Eingangsschutzdioden kommt, und da die Ausgänge Tristate haben sollten, gibt es dort auch keinen Pulldown. Der Kondensator sollte seine Ladung lange halten.
@Transistor Ich habe gerade die Schutzdioden vergessen. Was ist, wenn der letzte Zustand LOW und der vorherige Zustand hoch war? Ich vermute, dass der Kondensator aufgrund der Diode einen HIGH-Pegel haben wird, ist das richtig?
(1) Nein. Die Dioden leiten nur, wenn der Eingang über Vcc oder unter GND geht. Das OP setzt sein Mikro ohne Aus- und Einschalten zurück, damit die Stromversorgung auf dem Chip bleibt. C liegt entweder etwas unter Vcc oder etwas über GND. Die Ausgänge sollten beim Zurücksetzen in den Tri-State (getrennt) gehen und so bleiben, bis das Programm sie wieder zu Ausgängen macht. Siehe meinen Pseudo-Code für eine Erklärung dieses Teils. (2) Es gibt nur einen Zustand, über den man sich Sorgen machen muss: war der Pin zum Zeitpunkt des Zurücksetzens hoch oder niedrig.

Wenn der Zustand des Pins vor dem Ausschalten bekannt ist, können Sie diesen Zustand mit pull up oder pull down beibehalten, während my hochfährt. Große Kondensatoren können auch helfen.

Das Problem ist, dass die Pins normalerweise standardmäßig auf In-Out- oder Nicht-GPIO-Funktionen eingestellt sind, sodass Sie ihre Zustände im Reset anzeigen.

Versuchen Sie es mit einem einfachen Latch, aber Sie benötigen möglicherweise drei GPIO-Pins. Wenn der Ausgang am GPIO, den Sie verwenden, während des Betriebs HIGH ist, geben Sie einen High-Low-Impuls bei SET ab, und wenn LOW dasselbe beim RESET. Überprüfen Sie während des Einschaltens den Zustand von Q, wenn HIGH den erforderlichen GPIO-Pin als HIGH beibehalten, andernfalls LOW machen

Geben Sie hier die Bildbeschreibung ein

Entschuldigung, ich nochmal. Was passiert, wenn sowohl SET als auch RESET (aufgrund von Tristate) beim Mikro-Reset schweben? Sie könnten damit für ein paar Sekunden davonkommen. Ein kleiner Kondensator auf jeder Leitung? Die Anzahl der Komponenten und Pins steigt!