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

Chapichuse

Đam mê công nghệ

You may also like...

2 Responses

  1. Reed Noel viết:

    mình theo hướng dẫn bị lỗi, nhờ giúp đỡ:
    ‘struct EEPROMClass’ has no member named ‘WriteInt’

  2. Chapichuse viết:

    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()
    {
    }

Trả lời Chapichuse Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *