mirror of
https://github.com/arduino/Arduino.git
synced 2025-01-18 07:52:14 +01:00
Added additional examples to EEPROM lib
This commit is contained in:
parent
bed78fd144
commit
80f01fbab1
@ -0,0 +1,47 @@
|
|||||||
|
/***
|
||||||
|
Written by Christopher Andrews.
|
||||||
|
CRC algorithm generated by pycrc, MIT licence ( https://github.com/tpircher/pycrc ).
|
||||||
|
|
||||||
|
A CRC is a simple way of checking whether data has changed or become corrupted.
|
||||||
|
This example calculates a CRC value directly on the EEPROM values.
|
||||||
|
The purpose of this example is to highlight how the EEPROM object can be used just like an array.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
void setup(){
|
||||||
|
|
||||||
|
//Start serial
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
//Print length of data to run CRC on.
|
||||||
|
Serial.print( "EEPROM length: " );
|
||||||
|
Serial.println( EEPROM.length() );
|
||||||
|
|
||||||
|
//Print the result of calling eeprom_crc()
|
||||||
|
Serial.print( "CRC32 of EEPROM data: 0x" );
|
||||||
|
Serial.println( eeprom_crc(), HEX );
|
||||||
|
Serial.print( "\n\nDone!" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){ /* Empty loop */ }
|
||||||
|
|
||||||
|
unsigned long eeprom_crc( void ){
|
||||||
|
|
||||||
|
const unsigned long crc_table[16] = {
|
||||||
|
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
|
||||||
|
0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
|
||||||
|
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
|
||||||
|
0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned long crc = ~0L;
|
||||||
|
|
||||||
|
for( int index = 0 ; index < 32 ; ++index ){
|
||||||
|
crc = crc_table[( crc ^ EEPROM[index] ) & 0x0f] ^ (crc >> 4);
|
||||||
|
crc = crc_table[( crc ^ ( EEPROM[index] >> 4 )) & 0x0f] ^ (crc >> 4);
|
||||||
|
crc = ~crc;
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
/***
|
||||||
|
eeprom_get example.
|
||||||
|
|
||||||
|
This shows how to use the EEPROM.get() method.
|
||||||
|
|
||||||
|
To pre-set the EEPROM data, run the example sketch eeprom_put.
|
||||||
|
This sketch will run without it, however, the values shown
|
||||||
|
will be shown from what ever is already on the EEPROM.
|
||||||
|
|
||||||
|
This may cause the serial object to print out a large string
|
||||||
|
of garbage if there is no null character inside one of the strings
|
||||||
|
loaded.
|
||||||
|
|
||||||
|
Written by Christopher Andrews 2015
|
||||||
|
Released under MIT licence.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
void setup(){
|
||||||
|
|
||||||
|
float f = 0.00f; //Variable to store data read from EEPROM.
|
||||||
|
int eeAddress = 0; //Location of the IP address inside the class.
|
||||||
|
|
||||||
|
Serial.begin( 9600 );
|
||||||
|
Serial.print( "Read float from EEPROM: " );
|
||||||
|
|
||||||
|
//Get the float data from the EEPROM at position 'eeAddress'
|
||||||
|
EEPROM.get( eeAddress, f );
|
||||||
|
Serial.println( f, 3 ); //This may print 'ovf, nan' if the data inside the EEPROM is not a valid float.
|
||||||
|
|
||||||
|
/***
|
||||||
|
As get also returns a reference to 'f', you can use it inline.
|
||||||
|
E.g: Serial.print( EEPROM.get( eeAddress, f ) );
|
||||||
|
***/
|
||||||
|
|
||||||
|
/***
|
||||||
|
Get can be used with custom structures too.
|
||||||
|
I have separated this into an extra function.
|
||||||
|
***/
|
||||||
|
|
||||||
|
secondTest(); //Run the next test.
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyObject{
|
||||||
|
float field1;
|
||||||
|
byte field2;
|
||||||
|
char name[10];
|
||||||
|
};
|
||||||
|
|
||||||
|
void secondTest(){
|
||||||
|
int eeAddress = sizeof(float); //Move address to the next byte after float 'f'.
|
||||||
|
|
||||||
|
MyObject customVar; //Variable to store custom object read from EEPROM.
|
||||||
|
EEPROM.get( eeAddress, customVar );
|
||||||
|
|
||||||
|
Serial.println( "Read custom object from EEPROM: " );
|
||||||
|
Serial.println( customVar.field1 );
|
||||||
|
Serial.println( customVar.field2 );
|
||||||
|
Serial.println( customVar.name );
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){ /* Empty loop */ }
|
@ -0,0 +1,73 @@
|
|||||||
|
/***
|
||||||
|
eeprom_iteration example.
|
||||||
|
|
||||||
|
A set of example snippets highlighting the
|
||||||
|
simplest methods for traversing the EEPROM.
|
||||||
|
|
||||||
|
Running this sketch is not necessary, this is
|
||||||
|
simply highlighting certain programming methods.
|
||||||
|
|
||||||
|
Written by Christopher Andrews 2015
|
||||||
|
Released under MIT licence.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
/***
|
||||||
|
Iterate the EEPROM using a for loop.
|
||||||
|
***/
|
||||||
|
|
||||||
|
for( int index = 0 ; index < EEPROM.length() ; index++ ){
|
||||||
|
|
||||||
|
//Add one to each cell in the EEPROM
|
||||||
|
EEPROM[ index ] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
Iterate the EEPROM using a while loop.
|
||||||
|
***/
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
while( index < EEPROM.length() ){
|
||||||
|
|
||||||
|
//Add one to each cell in the EEPROM
|
||||||
|
EEPROM[ index ] += 1;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
Iterate the EEPROM using a do-while loop.
|
||||||
|
***/
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
do{
|
||||||
|
|
||||||
|
//Add one to each cell in the EEPROM
|
||||||
|
EEPROM[ index ] += 1;
|
||||||
|
index++;
|
||||||
|
}while( index < EEPROM.length() );
|
||||||
|
|
||||||
|
/***
|
||||||
|
Iterate the EEPROM using a C++11 ranged for loop.
|
||||||
|
|
||||||
|
This version of the loop is best explained in the example 'eeprom_pointer'
|
||||||
|
as this kind of iteration uses pointers rather than an index/integer.
|
||||||
|
|
||||||
|
!! Note: C++11 is not yet enabled by default in any IDE version.
|
||||||
|
Unless you manually enable it, this sketch will not compile.
|
||||||
|
You can comment the loop below to verify the non C++11 content.
|
||||||
|
***/
|
||||||
|
|
||||||
|
for( auto cell : EEPROM ){
|
||||||
|
|
||||||
|
//Add one to each cell in the EEPROM
|
||||||
|
cell += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
} //End of setup function.
|
||||||
|
|
||||||
|
void loop(){}
|
@ -0,0 +1,74 @@
|
|||||||
|
/***
|
||||||
|
eeprom_pointer example.
|
||||||
|
|
||||||
|
This example shows how the built-in EEPtr
|
||||||
|
object can be used to manipulate the EEPROM
|
||||||
|
using standard pointer arithmetic.
|
||||||
|
|
||||||
|
Running this sketch is not necessary, this is
|
||||||
|
simply highlighting certain programming methods.
|
||||||
|
|
||||||
|
Written by Christopher Andrews 2015
|
||||||
|
Released under MIT licence.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
/***
|
||||||
|
In this example, we will iterate forward over the EEPROM,
|
||||||
|
starting at the 10th cell (remember indices are zero based).
|
||||||
|
***/
|
||||||
|
|
||||||
|
EEPtr ptr = 9;
|
||||||
|
|
||||||
|
//Rather than hard coding a length, we can use the provided .length() function.
|
||||||
|
|
||||||
|
while( ptr < EEPROM.length() ){
|
||||||
|
|
||||||
|
Serial.print( *ptr, HEX ); //Print out hex value of the EEPROM cell pointed to by 'ptr'
|
||||||
|
Serial.print( ", " ); //Separate values with a comma.
|
||||||
|
ptr++; //Move to next cell
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
In this example, we will iterate backwards over the EEPROM,
|
||||||
|
starting at the last cell.
|
||||||
|
***/
|
||||||
|
|
||||||
|
ptr = EEPROM.length() - 1;
|
||||||
|
|
||||||
|
do{
|
||||||
|
|
||||||
|
Serial.print( *ptr, HEX );
|
||||||
|
Serial.print( ", " );
|
||||||
|
|
||||||
|
}while( ptr-- ); //When the pointer reaches zero the loop will end as zero is considered 'false'.
|
||||||
|
|
||||||
|
|
||||||
|
/***
|
||||||
|
And just for clarity, the loop below is an equivalent implementation
|
||||||
|
of the C++11 ranged for loop.
|
||||||
|
***/
|
||||||
|
|
||||||
|
for( EEPtr ptr = EEPROM.begin() ; item != EEPROM.end() ; ++item ){
|
||||||
|
Serial.print( *ptr, HEX );
|
||||||
|
Serial.print( ", " );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
The actual C++11 version:
|
||||||
|
|
||||||
|
for( auto ptr : EEPROM ){
|
||||||
|
Serial.print( *ptr, HEX );
|
||||||
|
Serial.print( ", " );
|
||||||
|
}
|
||||||
|
***/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){}
|
@ -0,0 +1,53 @@
|
|||||||
|
/***
|
||||||
|
eeprom_put example.
|
||||||
|
|
||||||
|
This shows how to use the EEPROM.put() method.
|
||||||
|
Also, this sketch will pre-set the EEPROM data for the
|
||||||
|
example sketch eeprom_get.
|
||||||
|
|
||||||
|
Note, unlike the single byte version EEPROM.write(),
|
||||||
|
the put method will use update semantics. As in a byte
|
||||||
|
will only be written to the EEPROM if the data is actually
|
||||||
|
different.
|
||||||
|
|
||||||
|
Written by Christopher Andrews 2015
|
||||||
|
Released under MIT licence.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
void setup(){
|
||||||
|
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
float f = 123.456f; //Variable to store in EEPROM.
|
||||||
|
int eeAddress = 0; //Location we want the data to be put.
|
||||||
|
|
||||||
|
|
||||||
|
//One simple call, with the address first and the object second.
|
||||||
|
EEPROM.put( eeAddress, f );
|
||||||
|
|
||||||
|
Serial.println("Written float data type!");
|
||||||
|
|
||||||
|
/** Put is designed for use with custom structures also. **/
|
||||||
|
|
||||||
|
struct MyObject{
|
||||||
|
float field1;
|
||||||
|
byte field2;
|
||||||
|
char name[10];
|
||||||
|
};
|
||||||
|
|
||||||
|
//Data to store.
|
||||||
|
MyObject customVar = {
|
||||||
|
3.14f,
|
||||||
|
65,
|
||||||
|
"Working!"
|
||||||
|
};
|
||||||
|
|
||||||
|
eeAddress += sizeof(float); //Move address to the next byte after float 'f'.
|
||||||
|
|
||||||
|
EEPROM.put( eeAddress, customVar );
|
||||||
|
Serial.print( "Written custom data type! \n\nView the example sketch eeprom_get to see how you can retrieve the values!" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){ /* Empty loop */ }
|
@ -0,0 +1,93 @@
|
|||||||
|
/***
|
||||||
|
eeprom_reference example.
|
||||||
|
|
||||||
|
This example shows how to use the EEPROM
|
||||||
|
reference object EERef, which allows usage
|
||||||
|
similar to using a simple char (uint8_t in this case).
|
||||||
|
|
||||||
|
Running this sketch is not necessary, this is
|
||||||
|
simply highlighting certain programming methods.
|
||||||
|
|
||||||
|
Written by Christopher Andrews 2015
|
||||||
|
Released under MIT licence.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
|
||||||
|
/***
|
||||||
|
To create a reference to an EEPROM cell, simply create an EERef variable.
|
||||||
|
To let it know which cell you want to reference, you can simply assign the
|
||||||
|
address when you create it.
|
||||||
|
***/
|
||||||
|
|
||||||
|
EERef ref = 0;
|
||||||
|
|
||||||
|
/***
|
||||||
|
An equivalent way is by calling the constructor directly:
|
||||||
|
EERef ref( 0 );
|
||||||
|
***/
|
||||||
|
|
||||||
|
/** Using the reference **/
|
||||||
|
|
||||||
|
/***
|
||||||
|
Updating cell data.
|
||||||
|
To prevent unnecessary wear on the EEPROM cells
|
||||||
|
this function will only write the data when it
|
||||||
|
is different to what is already stored.
|
||||||
|
***/
|
||||||
|
|
||||||
|
ref.update( 44 ); //May write 44 if not present.
|
||||||
|
ref.update( 44 ); //This second call will not write anything.
|
||||||
|
|
||||||
|
/***
|
||||||
|
Assign values directly to the EEPROM cell.
|
||||||
|
|
||||||
|
You can use any form of assignment that would otherwise be available
|
||||||
|
to a standard uint8_t:
|
||||||
|
|
||||||
|
*=
|
||||||
|
/=
|
||||||
|
+=
|
||||||
|
-=
|
||||||
|
^=
|
||||||
|
%=
|
||||||
|
&=
|
||||||
|
|=
|
||||||
|
<<=
|
||||||
|
>>=
|
||||||
|
|
||||||
|
***/
|
||||||
|
|
||||||
|
ref = 4; /***
|
||||||
|
Take care to notice, this changes the EEPROM cell data, it does not
|
||||||
|
change the index of the cell referenced by 'ref'.
|
||||||
|
|
||||||
|
Only the initial declaration like 'EERef ref = 0;' will set the address.
|
||||||
|
Using an assignment anywhere else modifies the referenced cell.
|
||||||
|
To modify the referenced address after declaring your variable see below.
|
||||||
|
***/
|
||||||
|
|
||||||
|
/***
|
||||||
|
Changing the referenced object.
|
||||||
|
The class has a member named 'index' which is an integer you can modify.
|
||||||
|
***/
|
||||||
|
|
||||||
|
ref.index++; //Move reference to the next cell.
|
||||||
|
|
||||||
|
|
||||||
|
/***
|
||||||
|
Grouping of references.
|
||||||
|
|
||||||
|
Using EERef objects you can create a contiguous array referencing
|
||||||
|
non-contiguous EEPROM cells.
|
||||||
|
***/
|
||||||
|
|
||||||
|
EERef array[] = { 0, 20, 40, 60, 80 };
|
||||||
|
|
||||||
|
|
||||||
|
} //End of setup function.
|
||||||
|
|
||||||
|
void loop(){}
|
@ -0,0 +1,52 @@
|
|||||||
|
/***
|
||||||
|
EEPROM Update method
|
||||||
|
|
||||||
|
Stores values read from analog input 0 into the EEPROM.
|
||||||
|
These values will stay in the EEPROM when the board is
|
||||||
|
turned off and may be retrieved later by another sketch.
|
||||||
|
|
||||||
|
If a value has not changed in the EEPROM, it is not overwritten
|
||||||
|
which would reduce the life span of the EEPROM unnecessarily.
|
||||||
|
|
||||||
|
Released using MIT licence.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
/** the current address in the EEPROM (i.e. which byte we're going to write to next) **/
|
||||||
|
int addr = 0;
|
||||||
|
|
||||||
|
void setup(){ /** EMpty setup **/ }
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
/***
|
||||||
|
need to divide by 4 because analog inputs range from
|
||||||
|
0 to 1023 and each byte of the EEPROM can only hold a
|
||||||
|
value from 0 to 255.
|
||||||
|
***/
|
||||||
|
int val = analogRead(0) / 4;
|
||||||
|
|
||||||
|
/***
|
||||||
|
Update the particular EEPROM cell.
|
||||||
|
these values will remain there when the board is
|
||||||
|
turned off.
|
||||||
|
***/
|
||||||
|
EEPROM.update(addr, val);
|
||||||
|
|
||||||
|
/***
|
||||||
|
The function EEPROM.update(addr, val) is equivalent to the following:
|
||||||
|
|
||||||
|
if( EEPROM.read(addr) != val ){
|
||||||
|
EEPROM.write(addr, val);
|
||||||
|
}
|
||||||
|
***/
|
||||||
|
|
||||||
|
|
||||||
|
/** advance to the next address. there are 512 bytes in the EEPROM, so go back to 0 when we hit 512. **/
|
||||||
|
addr = addr + 1;
|
||||||
|
if (addr == 512)
|
||||||
|
addr = 0;
|
||||||
|
|
||||||
|
delay(100);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user