Lưu giá trị bytes, int, float, String trên Arduino không bị mất khi mất nguồn với bộ nhớ EEPROM

posted in: Vi điều khiển | 0

EEPROM là một chip nhớ không bay hơi 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. EEPROM thuộc loại “bộ nhớ không mất dữ liệu khi ngừng cung cấp điện”. رهان مباشر

EEPROM trên Arduino có dung lượng là 1024 bytes, mỗi byte sẽ tương ứng với một địa chỉ. Hỗ trợ xóa/ghi tối đa 100,000 lần, nghĩa là quá số lần này bộ nhớ EEPROM sẽ bị hỏng.

Khoảng thời gian delay giữa 2 lần đọc/ghi nên là 10ms. رهانات المباريات

1. Lưu giá trị kiểu bytes

#include <EEPROM.h>

// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;

void setup() {
  // initialize serial and wait for port to open:
  Serial.begin(9600);

  EEPROM.write(address,10);
  delay(10);
  value = EEPROM.read(address);
  Serial.println(value);
}

void loop() {
  // read a byte from the current address of the EEPROM
  
}

Lệnh ghi

EEPROM.write(Địa chỉ,giá trị ghi vào);

Lệnh đọc

EEPROM.read(Địa chỉ);

2. Lưu giá trị kiểu Int

Kiểu Int có kích thước 2 bytes nên phải phải ghi vào 2 thanh ghi liên tiếp nhau.

#include <EEPROM.h>
void setup() {
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  int number = 32000;
  int adress=0; 
  //Viết giá trị vào EEPROM
 
  EEPROM.write(adress, number/256);
  delay(10);
  EEPROM.write(adress+1, number%256);
  delay(10);
  
  int readint;
  readint = int(EEPROM.read(adress))*256;
  delay(10);
  readint |= int(EEPROM.read(adress+1));
    Serial.print("Giá trị viết vào : ");
    Serial.println(readint);
}

void loop() {
  // read a byte from the current address of the EEPROM
  
}

Lệnh ghi

EEPROM.write(adress, number/256);
delay(10);
EEPROM.write(adress+1, number%256);
delay(10);

Lệnh đọc

int readint;
readint = int(EEPROM.read(adress))*256;
delay(10);
readint |= int(EEPROM.read(adress+1));

3. Lưu giá trị kiểu float

Kiểu float có kích thước 4 bytes nên phải phải ghi vào 4 thanh ghi liên tiếp nhau.

#include <EEPROM.h>


void setup() {
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  float number = 234.678;
  int adress=0; 
  //Viết giá trị vào EEPROM
  union {
    float fval;
    byte bval[4];
  } floatAsBytes;

  floatAsBytes.fval = number;
  EEPROM.write(adress, floatAsBytes.bval[0]);
  EEPROM.write(adress+1, floatAsBytes.bval[1]);
  EEPROM.write(adress+2, floatAsBytes.bval[2]);
  EEPROM.write(adress+3, floatAsBytes.bval[3]);
  
  float readfloat;
  union u_tag {
    byte b[4];
    float fval;
  } u;
  u.b[0] = EEPROM.read(adress);
  u.b[1] = EEPROM.read(adress+1);
  u.b[2] = EEPROM.read(adress+2);
  u.b[3] = EEPROM.read(adress+3);

  readfloat = u.fval;
    Serial.print("Giá trị viết vào : ");
    Serial.print(readfloat,4);
}

void loop() {
  // read a byte from the current address of the EEPROM
  
}

Lệnh ghi

union {
    float fval;
    byte bval[4];
  } floatAsBytes;

  floatAsBytes.fval = number;
  EEPROM.write(adress, floatAsBytes.bval[0]);
  EEPROM.write(adress+1, floatAsBytes.bval[1]);
  EEPROM.write(adress+2, floatAsBytes.bval[2]);
  EEPROM.write(adress+3, floatAsBytes.bval[3]);

Lệnh đọc

float readfloat;
  union u_tag {
    byte b[4];
    float fval;
  } u;
  u.b[0] = EEPROM.read(adress);
  u.b[1] = EEPROM.read(adress+1);
  u.b[2] = EEPROM.read(adress+2);
  u.b[3] = EEPROM.read(adress+3);

  readfloat = u.fval;

4. Lưu giá trị kiểu string

Trước tiên để lưu giá trị kiểu String bạn cần quy định độ dài lớn nhất của nó ở đây mình đặt là 32.

#include <EEPROM.h>
void setup() {
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  String str = "SinhVienDien";
  int adress =0;
  //Viết giá trị str vào EEPROM
 
  for (int i = adress; i < adress+str.length(); ++i)
  {
      EEPROM.write(i, str[i]);
      delay(10);
  }
   for (int i = adress+str.length(); i < adress+32; ++i)
  {
      EEPROM.write(i, 0);
      delay(10);
  }
  
  String readstr="";
    for (int i = adress; i < adress+32; ++i)
    {
        readstr += char(EEPROM.read(i));
        delay(10);
    }
    Serial.print("Giá trị viết vào : ");
    
    readstr.trim();
    Serial.println(readstr);
}

void loop() {
  // read a byte from the current address of the EEPROM
  
}

Lệnh ghi

String str = "SinhVienDien";
  int adress =0;
  //Viết giá trị str vào EEPROM
 
  for (int i = adress; i < adress+str.length(); ++i)
  {
      EEPROM.write(i, str[i]);
      delay(10);
  }
   for (int i = adress+str.length(); i < adress+32; ++i)
  {
      EEPROM.write(i, 0);
      delay(10);
  }

Lệnh đọc

 String readstr="";
    for (int i = adress; i < adress+32; ++i)
    {
        readstr += char(EEPROM.read(i));
        delay(10);
    }
    
    readstr.trim();

Trả lời

Email của bạn sẽ không được hiển thị công khai.