5.15 EEPROM

EEPROM ist ein Speicher, dessen Daten nicht gelöscht werden, wenn das Hauptsteuerungsboard ausgeschaltet wird. Sie können es verwenden, um einige Daten zu speichern und diese beim nächsten Einschalten wieder abzurufen.

Als Beispiel könnten Sie einen Sportzähler erstellen, der verfolgt, wie oft Sie täglich Seil springen.

Sie können auch in einem Programm Daten darauf schreiben und in einem anderen Programm daraus lesen. Wenn Sie beispielsweise an einem Autoprojekt arbeiten und die Geschwindigkeiten der beiden Motoren nicht übereinstimmen, können Sie ein Kalibrierungsprogramm schreiben, um den Kompensationswert der Motorgeschwindigkeit zu speichern.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist sicherlich praktisch, ein ganzes Set zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

Sie können diese auch separat über die folgenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

SunFounder R3 Platine

BUY

Breadboard

BUY

Jumper-Kabel

BUY

Widerstand

BUY

LED

BUY

Servo

BUY

Knopf

BUY

Potentiometer

BUY

Schaltplan

../_images/circuit_515_eeprom.png

Verdrahtung

../_images/eeprom_servo.png

Code

Bemerkung

  • Öffnen Sie die Datei 5.15.eeproom.ino im Pfad 3in1-kit\basic_project\5.15.eeproom.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

  • Oder laden Sie den Code über den Arduino Web Editor hoch.

Um diese Schaltung zu verwenden, drücken Sie einfach den Knopf, um die Aufnahme zu starten, und geben die gewünschten Informationen über ein Potentiometer ein. Nun wird das Board Ihre Aktionen endlos wiederholen (und bei jeder Iteration blinkt eine LED), bis Sie den Knopf erneut drücken, um neue Aktionen aufzunehmen. Sie können auch die Aufnahmezeit variieren, indem Sie die Werte von Auflösung und Aufnahmezeit ändern.

Wie funktioniert das?

  1. Importieren Sie die Bibliothek EEPROM.h und initialisieren Sie den EEPROM-Speicher.

    ...
    #include <EEPROM.h>//wird verwendet, um aufgezeichnete Werte zu speichern
    
    ...
    float resolution = 1000;//MUSS kleiner sein als EEPROM.length()
    float recordTime = 5; //Verzögerungszeit
    bool recording = false;
    ...
    

    Beachten Sie, dass /MUST kleiner sein als EEPROM.length(), in setup() wird der Speicher Ihres Boards EEPROM angezeigt, welcher für das SunFounder R3 Board 1024 sein sollte. Wenn Sie ein anderes Board verwenden, können Sie den Wert der Variable resolution anpassen.

  2. Zeigen Sie den EEPROM-Speicher Ihres Boards an.

    void setup() {
        ...
        Serial.begin(9600);
        //Serial.println(EEPROM.length());
    }
    

    Um die Größe des EEPROM-Speichers Ihres Boards zu ermitteln, kommentieren Sie die Zeile Serial.println(EEPROM.read(i)) aus. Dies wird die Größe des EEPROM im seriellen Monitor anzeigen, und Sie können den Wert der Variable resolution entsprechend ändern.

  3. Sobald ein Tastendruck erkannt wird, beginnt die Aufzeichnung und die erforderlichen Informationen werden über ein Potentiometer eingegeben. Jetzt wiederholt das Board Ihre Aktion endlos (und eine LED blinkt bei jeder Wiederholung), bis Sie die Taste erneut drücken und eine neue Aktion aufzeichnen.

    void loop() {
        if (recording == true) {//aufzeichnen
            for (int i = 1; i <= resolution; i++) {
                digitalWrite(ledPin, HIGH); //Lichtstatus-LED
                int val = map(analogRead(A0), 0, 1023, 0, 180);
                EEPROM.write(i, val);
                //Serial.println(EEPROM.read(i));
                myServo.write(val);
                delay(recordTime);
            }
            digitalWrite(ledPin, LOW); //Status-LED ausschalten
            delay(1000);//Zeit für den Menschen geben
            recording = false;
        }
        else {
            for (int i = 1; i <= resolution; i++) {//Wiedergabe
                if (digitalRead(buttonPin) == 0) {//Stoppen Sie die Wiedergabe und zeichnen Sie neue Werte auf
                    recording = true;
                    break;
                }
                int readval = EEPROM.read(i);
                myServo.write(readval);
                //Serial.println(readval);
                delay(recordTime);
            }
            digitalWrite(ledPin, HIGH); //eine neue Wiederholung anzeigen
            delay(100);
            digitalWrite(ledPin, LOW);
        }
    }
    
    • Setzen Sie die Variable recording auf true, wenn die Taste gedrückt wird.

    • Wenn die Variable recording true ist, beginnen Sie mit der Aufzeichnung der Aktion im Speicherbereich.

    • Lesen Sie den Wert des Potentiometers und mappen Sie ihn auf 0-180, um ihn im EEPROM zu speichern und die Drehung des Servos zu steuern.

    • Die LED leuchtet zu Beginn der Aufzeichnung und erlischt am Ende.

    • Wiederholen Sie die aufgezeichnete Aktion mit einem kurzen Aufleuchten der LED, um Sie an eine neue Wiederholung zu erinnern.

  4. Über die EEPROM-Bibliothek.

    Hier sind einige ihrer Funktionen.

    • write(address,value): Schreibt ein Byte in das EEPROM.

      • address: die Adresse, an die geschrieben werden soll, beginnend bei 0 (int)

      • value: der zu schreibende Wert, von 0 bis 255 (byte)

      • Ein EEPROM-Schreibvorgang dauert 3,3 ms. Der EEPROM-Speicher hat eine angegebene Lebensdauer von 100.000 Schreib-/Löschzyklen, daher sollten Sie vorsichtig sein, wie oft Sie darauf schreiben.

    • Read(address): Liest ein Byte aus dem EEPROM. Orte, die noch nie beschrieben wurden, haben den Wert 255.

    • update(address,value): Schreibt ein Byte in das EEPROM. Der Wert wird nur geschrieben, wenn er sich von dem bereits an derselben Adresse gespeicherten unterscheidet.

      • Ein EEPROM-Schreibvorgang dauert 3,3 ms. Der EEPROM-Speicher hat eine angegebene Lebensdauer von 100.000 Schreib-/Löschzyklen, daher kann die Verwendung dieser Funktion anstelle von write() Zyklen sparen, wenn die geschriebenen Daten sich nicht oft ändern.

    • EEPROM.put(address, data): Schreibt jeden Datentyp oder jedes Objekt in das EEPROM.

      • address: die Adresse, von der gelesen werden soll, beginnend bei 0 (int).

      • data: die zu lesenden Daten, können ein primitiver Typ (z. B. float) oder eine benutzerdefinierte Struktur sein.

      • Diese Funktion verwendet EEPROM.update(), um den Schreibvorgang auszuführen, schreibt also den Wert nicht erneut, wenn er sich nicht geändert hat.

    • EEPROM.get(address, data): Liest jeden Datentyp oder jedes Objekt aus dem EEPROM.

      • address: die Adresse, von der gelesen werden soll, beginnend bei 0 (int).

      • data: die zu lesenden Daten, können ein primitiver Typ (z. B. float) oder eine benutzerdefinierte Struktur sein.