EEPROM read and write in Arduino - Time & Space Complexity
When working with EEPROM in Arduino, it's important to know how the time to read or write data changes as the amount of data grows.
We want to understand how long these operations take when we read or write multiple bytes.
Analyze the time complexity of the following code snippet.
#include <EEPROM.h>
void writeData(int start, byte* data, int length) {
for (int i = 0; i < length; i++) {
EEPROM.write(start + i, data[i]);
}
}
void readData(int start, byte* buffer, int length) {
for (int i = 0; i < length; i++) {
buffer[i] = EEPROM.read(start + i);
}
}
This code writes and reads a sequence of bytes to and from EEPROM starting at a given address.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that calls EEPROM.write or EEPROM.read for each byte.
- How many times: The loop runs once for each byte in the data, so it repeats length times.
Each byte requires one write or read operation, so the total time grows directly with the number of bytes.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 EEPROM writes or reads |
| 100 | 100 EEPROM writes or reads |
| 1000 | 1000 EEPROM writes or reads |
Pattern observation: The time increases steadily and proportionally as the number of bytes increases.
Time Complexity: O(n)
This means the time to read or write grows in a straight line with the number of bytes processed.
[X] Wrong: "Reading or writing multiple bytes takes the same time as one byte because EEPROM is fast."
[OK] Correct: Each byte requires a separate operation, so more bytes mean more time, not the same time.
Understanding how EEPROM operations scale helps you write efficient code for devices with limited memory and speed, a useful skill in embedded programming.
"What if we used EEPROM.update instead of EEPROM.write? How would the time complexity change?"
Practice
EEPROM.write(address, value) do in Arduino?Solution
Step 1: Understand EEPROM.write function
The functionEEPROM.write(address, value)saves a byte value at the given address in EEPROM memory.Step 2: Differentiate from EEPROM.read
EEPROM.read(address)is used to read data, not write it.Final Answer:
Stores a byte value at the specified EEPROM address -> Option AQuick Check:
EEPROM.write saves data [OK]
- Confusing write with read function
- Thinking EEPROM.write clears memory
- Assuming EEPROM.write initializes EEPROM
Solution
Step 1: Identify correct EEPROM read syntax
The correct function to read a byte from EEPROM isEEPROM.read(address).Step 2: Check options for exact match
OnlyEEPROM.read(10);matches the correct syntax.Final Answer:
EEPROM.read(10); -> Option DQuick Check:
EEPROM.read(address) reads byte [OK]
- Using EEPROM.write to read data
- Using non-existent EEPROM.readByte function
- Confusing EEPROM.get with EEPROM.read
EEPROM.write(5, 42); byte val = EEPROM.read(5); Serial.println(val);
Solution
Step 1: Write value 42 at EEPROM address 5
The code stores the byte 42 at address 5 usingEEPROM.write(5, 42);.Step 2: Read the value back from address 5
EEPROM.read(5)reads the stored value, which is 42.Final Answer:
42 -> Option BQuick Check:
Write 42, read 42 [OK]
- Assuming EEPROM.read returns address instead of value
- Forgetting to write before reading
- Expecting default 0 without writing
EEPROM.write(1024, 100); byte val = EEPROM.read(1024); Serial.println(val);
Solution
Step 1: Check EEPROM address range
Typical Arduino EEPROM size is 1024 bytes, so address 1024 is out of range (valid addresses are 0-1023).Step 2: Validate other code parts
EEPROM.write has correct arguments, EEPROM.read returns byte, and Serial.println can print bytes.Final Answer:
Address 1024 is out of EEPROM range -> Option CQuick Check:
EEPROM address must be within 0-1023 [OK]
- Using address equal to EEPROM size
- Assuming EEPROM size is larger than actual
- Misunderstanding Serial.println capabilities
Solution
Step 1: Understand data size and EEPROM functions
High score is an integer (2 bytes), soEEPROM.write(1 byte) is insufficient to store full value.Step 2: Use EEPROM.put and EEPROM.get for multi-byte data
EEPROM.put(address, highScore);saves the entire integer, andEEPROM.get(address, highScore);reads it back correctly.Final Answer:
Use EEPROM.put(address, highScore); and EEPROM.get(address, highScore); -> Option AQuick Check:
Use put/get for multi-byte data [OK]
- Using EEPROM.write for multi-byte integers
- Not reading back with EEPROM.get
- Mixing read and write roles
Ready to prove it?
Pass the test and this pattern moves unknown
