Gibt es eine Möglichkeit, die Werte der erforderlichen Variablen irgendwo zu speichern (möglicherweise in einer Datei, die bei verschiedenen Ereignissen vom Programm aktualisiert wird), die beim Programmstart nach dem Neustart der Arduino-Karte zurückgelesen werden kann?
Ich versuche, meine AC-Geräte mit der IR-Fernbedienung zu steuern. Wo ich möchte, dass Arduino sich daran erinnert, was in meinem Zimmer nach einem Stromausfall eingeschaltet und was ausgeschaltet war.
Die Verwendung von EEPROM scheint eine ziemlich gute Lösung zu sein, obwohl die Beschränkung auf 100.000 Schreibvorgänge begrenzt ist, weshalb ich versuche, einen anderen Ausweg zu finden.
Die Verwendung eines externen EEPROMs, das diese Einschränkung nicht aufweist oder ziemlich groß ist, ist eine wirklich gute Idee, die ich von fuenfundachtzig erhalten habe, danke für diese großartige Idee. Aber ich weiß nicht, wie ich das in meinem Projekt umsetzen soll. Jede Ressource, um Wissen über die Verwendung eines externen EEPROM zu sammeln, wird sehr geschätzt.
Danke euch allen...
quelle
Antworten:
Der interne RAM des Arduino wird zurückgesetzt, wenn Sie den Chip neu starten. Wenn Sie also Ihre Daten behalten möchten, müssen Sie sie im EEPROM speichern.
Wenn Sie sich Sorgen über die begrenzten Schreib- / Löschzyklen machen, sollten Sie abschätzen, wie oft die Daten aktualisiert (dh in das EEPROM geschrieben) werden und wie lange Sie die Lebensdauer des von Ihnen erstellten Geräts planen. Wenn 100.000 Zyklen dann immer noch ein Problem sind, haben Sie mehrere Möglichkeiten:
Beachten Sie jedoch, dass Ihre Beschreibung wie ein typischer Anwendungsfall für Benutzereinstellungen klingt, die beim Neustart nicht verloren gehen sollen. Für diese ist das interne EEPROM der richtige Ort: Speichern Sie sie nur, wenn sie geändert wurden und Sie golden sind - der Benutzer wird sie nicht 100.000 Mal leicht ändern ...
quelle
Speichern Sie sie im On-Chip-EEPROM.
quelle
Der EEPROM-Speicher funktioniert, wie bereits erwähnt, wenn nichtflüchtig ist. Sie haben sich jedoch nicht qualifiziert, ob es nicht flüchtig sein muss oder nicht. Wenn nicht, können Sie ein __attribute__ verwenden, um den Variablenraum zu definieren, der nicht initialisiert werden soll. Da der SRAM auf den ATmega's nicht durch Reset oder Power Cycle gelöscht wird. Der Compiler initialisiert sie standardmäßig. Wo dies pro Variable wie im folgenden Beispiel deaktiviert werden kann:
Die Ausgabe des obigen Codes ist unten. Beachten Sie, dass der erste Ausgang das Ergebnis des Einschaltens der UNO bei gedrückter Reset-Taste war und nach dem Start des Monitorfensters wieder freigegeben wurde. Andernfalls wäre der Druck "Falsche Einstellung" übersehen worden, bevor das Monitorfenster gestartet werden kann.
Damit bleiben Ihre Variablen beim Zurücksetzen erhalten. Solange die Energie nicht verloren geht. Beachten Sie, dass Sie zu Beginn zufällige Daten erhalten.
Wenn Sie entweder EEPROM oder .noinit verwenden, würde ich empfehlen, dass Sie Ihren persistenten Variablenbereich während des Setups auf die Prüfsumme prüfen. Wenn dies nicht korrekt ist, können Sie eine Warnung initialisieren oder ausgeben.
quelle
Wenn Sie Ihr NVRAM wirklich häufig aktualisieren müssen, schauen Sie sich FRAM (Ferroelectric Random Access Memory) an, das eine Schreiblebensdauer von 10 ^ 13 Zyklen beansprucht (das sind ~ 318.000 Jahre, wenn Sie einmal pro Sekunde schreiben!). Sie sind 8 KB groß und bei 20 MHz (SPI) schneller als Flash oder EEPROM.
Adafruit (in den USA) verkauft sie auf einem Breakout-Board für etwa 6 US-Dollar in Onesies. Oder Sie können die nackten Chips bei den üblichen Lieferanten für etwa 1,30 US-Dollar kaufen, nicht jedoch DIP, sondern nur SOP8-Pakete.
quelle
Wenn Sie offen für eine Off-Chip-Lösung sind, ist es nicht allzu schwierig, einen SD-Kartenleser zu kaufen / zu bauen.
quelle