0 đánh giá

Lưu dữ liệu không bị mất khi mất điện với Arduino

Thường để lưu dữ liệu không bị mất thì ta dùng Epprom ngoài, nhưng rất may với Arduino thì bạn đã được trang bị sẵn, bài hướng dẫn này sẽ giúp bạn làm sao để đọc và ghi cho nó

Bước 1: Giới thệu về EEPROM

Theo định nghĩa:

EEPROM (tiếng Anh: Electrically Erasable Programmable Read-Only Memory) là một chip nhớ không mất thường dùng trong các máy tính và các thiết bị di động để lưu trữ một lượng dữ liệu thấp và cần thiết thay đổi nội dung được. (wiki).

Nó tương tự như ổ đĩa Flash trên USB của bạn vậy

Trên Arduino có :

    - Arduno Due:          512b EEPROM storage.
    - Arduino Uno:         1kb EEPROM storage.
    - Arduino Mega:       4kb EEPROM storage.

Bạn có thể đọc ghi khoảng 100.000 lần, quá số lần này sẽ ko ghi được nữa

 

Bước 2: Ví dụ
/***
   Ví dụ lập trình EEPROM
   Ví dụ này lưu giá trị analog tại chân A0 vào EEPROM. Khi mất điện thì giá trị vẫn được lưu lại 
   để bạn đọc lại vào lần khởi đôg sau
   

   Hàm EEPROM.update(address, val); sẽ ko ghi khi giá trị được lưu trước đó giống với giá trị val được nhập vào tại address.

 ***/

#include <EEPROM.h>

/** địa chỉ hiện tại của eeprom, bạn có thể ghi từ địa chỉ 0 đến hết bộ nhớ, ví dụ ở arduino uno đó là từ 0 đến 1024, một lần bạn ghi được 1 byte **/
int address = 0;

void setup() {
  /** EMpty setup **/
}

void loop() {
  /***
    Bạn chia 4 vì eeprom chỉ lưu được 1 byte (giá tri từ 0 đến 255)
  ***/
  int val = analogRead(0) / 4;

  /***
    Lưu vào..
  ***/
  EEPROM.update(address, val);

  /***
    hàm EEPROM.update(address, val)  tương đương với 2 lệnh sau

    if( EEPROM.read(address) != val ){
      EEPROM.write(address, val);
    }
  ***/


  /***
    Advance to the next address, when at the end restart at the beginning.

    Larger AVR processors have larger EEPROM sizes, E.g:
    - Arduno Duemilanove: 512b EEPROM storage.
    - Arduino Uno:        1kb EEPROM storage.
    - Arduino Mega:       4kb EEPROM storage.

    Rather than hard-coding the length, you should use the pre-provided length function.
    This will make your code portable to all AVR processors.
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  /***
    As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an
    EEPROM address is also doable by a bitwise and of the length - 1.

    ++address &= EEPROM.length() - 1;
  ***/

  delay(100);
}

 

(!) Nếu có bất kỳ thắc mắc nào cần hỏi vui lòng đặt câu hỏi tại HỏiHay.Net, Cộng đồng Hỏi đáp Hỏi Hay sẽ trả lời bạn.
393 lượt xem ^tháng ^ngày, ^năm
admin 2,010 điểm

Please log in or register to Comment this Media.