les 12 (EEprom)

Alleen lezen

Moderator: pe1br

Post Reply
pe1br
Posts: 66
Joined: Thu Apr 14, 2016 3:37 am

les 12 (EEprom)

Post by pe1br »

De Arduino microcontroller heeft een eigen EEprom aan boord.
Hierin kunnen we data opslaan vanuit onze code en terug lezen bij het opstarten van de Arduino.
Deze data gaat dus niet verloren als je de Arduino spanningsloos maakt (ook niet als dit voor lange tijd is).
Hoe groot deze ruimte is hangt af van het type Arduino dat je gebruikt, zie de Arduino EEprom pagina: https://www.arduino.cc/en/Reference/EEPROM

LET OP:
De EEprom mag volgens de datasheet van de Atmel controller maximaal 100.000 keer beschreven worden op hetzelfde adres.
Gebruik een EEprom write dus niet standaard in je loop want ook overschrijven met dezelfde waarde is 1 keer schrijven.
Het lezen van de EEprom mag zo vaak als je maar wilt.

De EEprom is dus uitermate geschikt om instellingen op te slaan die je volgende keer weer wilt gebruiken, maar gebruik de EEprom niet om op te slaan hoe vaak een led knippert.
Het Arduino Uno bord dat wij gebruiken heeft 1024 EEprom adressen waar we elk een byte aan data naartoe kunnen schrijven (0 tot 255).
Willen we een langer getal sturen dan zullen we deze op moeten delen is kleine stukjes en naar meerdere EEprom adressen moeten sturen.
Naderhand moeten we deze dan weer aan elkaar zetten.

Les12-1:
We hebben dit keer geen schema nodig, we gebruiken alleen de Arduino en de serial monitor.
Start het Arduino programma en sluit de USB kabel aan.
Typ de volgende code over of kopieer deze naar de arduino ide:

Code: Select all

#include <EEPROM.h>    //laad de eeprom bibliotheek
char getal = 0;        //maak een container voor het getal dat we op gaan slaan
int eepromaddress = 1; //Het eeprom adres waar we dit getal opslaan

//Eerst checken we of de eeprom eerder beschreven is door dit programma
//dit doen we door een random waarde te lezen op het laaste eeprom adres 1023
//Als deze waarde er niet staat is het zeer waarschijnlijk dat we dit programma voor de eerste keer gebruiken
//We zetten dan de waarde voor onze container getal op 0 en schrijven 123 naar adres 1023 zodat deze functie de volgende keer niet uitgevoerd wordt.
void checkeeprom() {                
  if (EEPROM.read(1023) != 123) {   //kijk of het eeprom adres 1023 de waarde 123 bevat zo niet voer hetvolgende uit
    EEPROM.write(eepromaddress, 0); //schrijf het eeprom adres voor het getal naar 0
    EEPROM.write(1023, 123);        //schrijf het eeprom adres 1023 naar 123
  }
}

void readserial() {
  if (Serial.available()) {              //controleer of er serial data beschikbaar is
    getal = Serial.read();               //stop de waarde van de serial data in de container getal
    EEPROM.write(eepromaddress, getal);  //schrijf het getal naar het eerder bepaalde eeprom adres (1)
    printserial();                       //voer de functie printserial uit
  }
}

void printserial() {
  getal = EEPROM.read(eepromaddress);            //lees het getal op het eerder bepaalde eeprom adres (1)
  Serial.print("type een getal tussen 0 en 9");  //uitleg voor de serial monitor gebruiker
  Serial.print("     het getal is nu ");         //uitleg voor de serial monitor gebruiker
  Serial.println(getal);                         //Print het getal dat we net uit de EEprom gelezen hebben en in de container getal hebben gezet.
}

void setup(){          
  Serial.begin(9600);  //start serial op 9600 baud
  checkeeprom();       //Voer de functie check eeprom uit
  printserial();       //voer de functie printserial uit
}

void loop(){
  readserial();        //blijf de functie readserial uitvoeren
}
Start de serial monitor en voer een getal in tussen 0 en 9.
sluit nu de serial monitor af en koppel de Arduino af van de pc.
Wacht een poosje en sluit de Arduino weer aan.
Start de serial monitor en je zult zien dat de waarde die je ingevoerd hebt onthouden is.

Les12-2:
Start het Arduino programma en sluit de USB kabel aan.
Typ de volgende code over of kopieer deze naar de arduino ide:

Code: Select all

#include <EEPROM.h>                                                               //laad de eeprom bibliotheek
String naam = "                                                                "; //maak een container voor de naam die we willen opslaan
int eepromstrartaddress = 0;                                                      //Het eerste EEprom adres waar we beginnen met de naam

//Eerst checken we of de eeprom eerder beschreven is door dit programma
//dit doen we door een random waarde te lezen op het laaste eeprom adres 1023
//Als deze waarde er niet staat is het zeer waarschijnlijk dat we dit programma voor de eerste keer gebruiken
//We zetten dan de waarde voor elk EEprom adres op 0 en schrijven 125 naar adres 1023 zodat deze functie de volgende keer niet uitgevoerd wordt.
void checkeeprom() {
  if (EEPROM.read(1023) != 125) {                        //kijk of het eeprom adres 1023 de waarde 125 bevat zo niet voer hetvolgende uit
    for (int i = 0; i <= 1021; i++) EEPROM.write(i, 0);  //schijf alle EEprom adressen van 0 tot 1021 naar waarde 0
    EEPROM.write(1023, 125);                             //schrijf het EEprom adres 1023 naar waarde 125 
  }
}

void writestringtoeeprom() {                            //functie om de naam naar de EEprom te schrijven
  for (int i = 0; i <= naam.length(); i++) {            //tel van 0 tot de lengte van de naam 
    EEPROM.write(i, naam.charAt(i));                    //Schrijf voor elk charakter de waarde van de letter naar het EEprom adres i
    EEPROM.write(1022, naam.length());                  //Schrijf de lengte van de naam naar EEprom adres1022
  }
}      

void readstringfromeeprom() {                           //Functie om de naam uit de EEprom te lezen
  for (int i = 0; i <= EEPROM.read(1022); i++) {        //tel van 0 tot het in EEprom adres 1022 opgeslagen getal
    naam.setCharAt(i, EEPROM.read(i));                  //Set elke waarde uit de EEprom in de container naam
  }
}

void readserial() {                                     //Funtie om de serial data te lezen
  if (Serial.available()) {                             //Als er nieuwe serial data binnen komt voer hetvolgende uit
    naam = Serial.readString();                         //lees de serial data en stop deze in de container naam
    writestringtoeeprom();                              //voer de functie writestringtoeeprom uit
    printserial();                                      //voer de functie printserial uit
  }
}

void printserial() {                                    //Functie om serial data te schrijven
  Serial.print("Uw naam is nu: ");                       //Informatie voor de serial monitor gebruiker
  readstringfromeeprom();                               //voer de functie readstringfromeeprom uit 
  Serial.println(naam);                                 //print de inhoud van de container naam naar de serial monitor
  Serial.println("Type uw naam in:");                     ////Informatie voor de serial monitor gebruiker
}

void setup(){                                           //functie setup wordt standaard 1 keer uitgevoerd aan het begin van het programma
  Serial.begin(9600);                                   //set de serial baudrate naar 9600 
  checkeeprom();                                        //voer de functie checkeeprom uit 
  printserial();                                        //voer de functie printserial uit
}

void loop(){                                            //functie loop wordt continu herhaald
  readserial();                                         //voer de functie readserial uit
}
Start de serial monitor en voer uw naam in.
sluit nu de serial monitor af en koppel de Arduino af van de pc.
Wacht een poosje en sluit de Arduino weer aan.
Start de serial monitor en je zult zien dat de naam die je ingevoerd hebt onthouden is.
Post Reply