Lưu các giá trị double, float, int… vào bộ nhớ EEPROM của arduino
Trong tất cả các chíp AVR đều có bộ nhớ eeprom, người dùng có thể lưu trữ các giá trị nhất định như các giá trị setting hệ thống, các hằng số, các biến số... mà khi thiết bị khởi động lại không bị mất các giá trị đó (giống như khi lưu vào ổ cứng máy tính).Trong thư viện EEPROM.h của arduino cho phép thực hiện được việc lưu trữ này. Tuy nhiên, các hàm trong thư viện EEPROM.h chỉ cho phép đọc, ghi giá trị của 1 byte nào đó thôi. Đối với các dữ liệu khác byte như float, double, int ... hoặc tất cả các dữ liệu dài hơn 1 byte thì người dùng cần phải viết code để có thể read() and write() các giá trị đó.
Ví dụ : một số float 823.5 bao gồm 4 byte như bản dưới. Để lưu trữ hoặc đọc ra giá trị float này cần đọc, ghi 4 byte đó.
Float (823.5) |
|||
01000100 |
01001101 |
11100000 |
00000000 |
Byte [3] |
Byte [2] |
Byte [1] |
Byte [0] |
Để thuận tiện trong quá trình sử dụng lưu trữ, đọc dũ liệu từ epprom người ta đã tạo ra thư viện eeprom mở rộng: http://playground.arduino.cc/Code/EEPROMex
Thư viện này có thêm nhiều tính năng rất hay mà người lập trình arduino có thể sử dụng ngay:
Ví dụ muốn ghi một giá trị Interger vào vị trí nào đó thì chỉ cần gọi lệnh:
EEPROM.writeInt(addressInt,input);
Trong đó:
- addressInt là địa chỉ trên eeprom cần ghi;
- input là giá trị interger cần ghi.
Sau này cần đọc giá trị này ra sử dụng ta chỉ cần gọi lệnh:
int output = EEPROM.readInt(addressInt);
Chú ý: Trước khi lưu một gía trị nào đó vào eeprom cần nhớ địa chỉ và kích thước (size) của kiễu dữ liệu của nó. Địa chỉ ở đây là địa chỉ của byte đầu tiên, các byte tiếp theo sẽ chiếm vị trí (địa chỉ) tiếp theo. Muốn lưu giá trị khác thì phải tránh những địa chỉ này.
Để sử dụng thư viện này chúng ta cần thực hiện các bước sau:
- Tải thư viện về gồm 3 file: EEPROMex.cpp; EEPROMex.h và EEPROMVar.h
- Copy vào vị trí file: ino (file lập trình chính cho arduino)
- Include vào chương trình chính, và khai báo biến, khai báo vị trí lưu dữ liệu trên eeprom
#include <EEPROMex.h>
int addressInt = 30; // vị trí lưu biến Int
int value;
- trong phần setup
Void Setup()
{
EEPROM.setMemPool(0, 1024); //vị tri dau tien và dung luong cua eeprom
EEPROM.setMaxAllowedWrites(1024); // số byte cho phép lưu
}
và trong chương trình ta thêm vào dòng lệnh đọc, hoặc ghi giá trị là được:
int input = 30000;
int output = 0;
EEPROM.writeInt(addressInt,input); // lưu input vào eeprom
output = EEPROM.readInt(addressInt); // đọc int từ eeprom tại địa chỉ addressInt, lưu vào output
//phan debug
Serial.print("adress: ");
Serial.println(addressInt);
Serial.print("input: ");
Serial.println(input);
Serial.print("output: ");
Serial.println(output);
Serial.println("");
Kết quả thu được của đoạn chương trình trên là:
adress: 30
input: 30000
output: 30000
Để sử dụng thêm tính năng cần đọc file example hoặc các file .cpp, .h của thư viện
mình theo hướng dẫn bị lỗi, nhờ giúp đỡ:
‘struct EEPROMClass’ has no member named ‘WriteInt’
Bạn thử làm theo các bước sau:
1. Download thu viện về: https://github.com/thijse/Arduino-EEPROMEx/archive/master.zip
2. Vào Aruino menu > Sketch > Include library > Add .Zip library, Chọn file Zip vừa tải về
3. Chạy thử đoạn code sau:
#include // Chỉ cần Include file này
int address = 0; //địa chỉ cần ghi vào
double input = 100.12; //Giá trị cần ghi vào EEprom
double output = 0;// Giá trị cần đọc ra từ EEprom
void setup()
{
Serial.begin(9600);
EEPROM.writeDouble(address, input);
output = EEPROM.readDouble(address);
Serial.print(address);
Serial.print("\t");
Serial.print(output);
Serial.println();
}
void loop()
{
}