EEPROM ESP32/ESP8266

 

ESP32 Flash Memory – Store Permanent Data (Write and Read)


Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách lưu trữ và đọc các giá trị từ bộ nhớ flash ESP32 bằng Arduino IDE. Dữ liệu được lưu trong bộ nhớ flash vẫn ở đó ngay cả khi ESP32 đặt lại hoặc khi nguồn điện bị ngắt. Để làm ví dụ, chúng tôi sẽ chỉ cho bạn cách lưu trạng thái GPIO cuối cùng.

ESP32 Flash Memory


Trước khi tiếp tục với hướng dẫn này, bạn nên cài đặt tiện ích bổ sung ESP32 trong IDE Arduino của mình. Thực hiện theo một trong các hướng dẫn sau để cài đặt ESP32 trên Arduino IDE, nếu bạn chưa cài đặt.

  • Cài đặt ESP32 trong Arduino IDE (Hướng dẫn dành cho Windows)
  • Cài đặt ESP32 trong Arduino IDE (hướng dẫn Mac và Linux)

Flash Memory

Dữ liệu được lưu trong bộ nhớ flash vẫn ở đó ngay cả khi ESP32 đặt lại hoặc khi nguồn điện bị ngắt. Bộ nhớ flash rất giống với EEPROM. Cả hai đều là những bộ nhớ không thay đổi.

Lưu dữ liệu trong bộ nhớ flash đặc biệt hữu ích để:
  • Nhớ trạng thái cuối cùng của một biến;
  • Lưu các thiết lập;
  • Lưu số lần một thiết bị đã được kích hoạt;
  • Hoặc bất kỳ loại dữ liệu nào khác mà bạn cần lưu vĩnh viễn.
Một hạn chế với bộ nhớ flash là số lần bạn có thể ghi dữ liệu vào nó. Dữ liệu có thể được đọc từ flash bao nhiêu lần tùy thích, nhưng hầu hết các thiết bị được thiết kế cho khoảng 100.000 đến 1.000.000 hoạt động ghi.

EEPROM Library

Để đọc và ghi từ bộ nhớ flash ESP32 bằng Arduino IDE, chúng tôi sẽ sử dụng thư viện EEPROM. Việc sử dụng thư viện này với ESP32 rất giống với việc sử dụng nó với Arduino. Vì vậy, nếu bạn đã sử dụng Arduino EEPROM trước đây, thì điều này không khác nhiều.

Vì vậy, chúng tôi cũng khuyên bạn nên xem qua bài viết của chúng tôi về Arduino EEPROM.

Với ESP32 và thư viện EEPROM, bạn có thể sử dụng tối đa 512 byte trong bộ nhớ flash. Điều này có nghĩa là bạn có 512 địa chỉ khác nhau và bạn có thể lưu giá trị từ 0 đến 255 ở mỗi vị trí địa chỉ.

EEPROM ESP32/ESP8266

Write

Để ghi dữ liệu vào bộ nhớ flash, bạn sử dụng hàm EEPROM.write () giá trị truyền vào là địa chỉ nơi bạn muốn lưu dữ liệu và giá trị (biến byte) bạn muốn lưu:

EEPROM.write(address, value);

Ví dụ: để lưusố 9 trên địa chỉ 0, bạn sẽ có:

EEPROM.write(0, 9);

Để lưu dữ liệu lại bạn dùng lệnh comit() sau khi đã write xong;

EEPROM.commit();

Read

Để đọc một byte từ bộ nhớ flash, bạn sử dụng hàm EEPROM.read (). Hàm này ltruyền vào địa chỉ cần đọc dữ liệu và nó sẽ trả về 1 byte dữ liệu.

EEPROM.read(address);

Ví dụ, để đọc 1 byte được lưu trữ trước đó trong địa chỉ 0, hãy sử dụng:

EEPROM.read(0);

Remember Last GPIO State

Để chỉ cho bạn cách lưu dữ liệu trong bộ nhớ flash ESP32, chúng tôi sẽ lưu trạng thái cuối cùng của đầu ra, trong trường hợp này là đèn LED. Ví dụ, hãy tưởng tượng tình huống sau: Bạn đang điều khiển đèn bằng ESP32 Bạn bật đèn lên ESP32 đột ngột mất điện. Khi có nguồn trở lại, đèn vẫn tắt - vì đèn không giữ trạng thái cuối cùng

EEPROM ESP32/ESP8266


Schematic

Nối nút nhấn và đèn LED vào ESP32 như thể hiện trong sơ đồ sau.

EEPROM ESP32/ESP8266

Code

// include library to read and write from flash memory
#include <EEPROM.h>

// define the number of bytes you want to access
#define EEPROM_SIZE 1

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 4;    // the number of the pushbutton pin
const int ledPin = 16;      // the number of the LED pin

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() { 
  Serial.begin(115200);
  
  // initialize EEPROM with predefined size
  EEPROM.begin(EEPROM_SIZE);

  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // read the last LED state from flash memory
  ledState = EEPROM.read(0);
  // set the LED to the last stored state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH), and you've waited long enough
  // since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  // save the reading. Next time through the loop, it'll be the lastButtonState:
  lastButtonState = reading;
  
  // if the ledState variable is different from the current LED state
  if (digitalRead(ledPin)!= ledState) {  
    Serial.println("State changed");
    // change the LED state
    digitalWrite(ledPin, ledState);
    // save the LED state in flash memory
    EEPROM.write(0, ledState);
    EEPROM.commit();
    Serial.println("State saved in flash memory");
  }
}

Chúc các bạn thành công!

No comments:

Post a Comment