QC

eeprom Arduino

- EEPROM hữu ích trong các dự án Arduino cần giữ dữ liệu ngay cả khi Arduino đặt lại hoặc khi nguồn điện bị ngắt.

- Điều đặc biệt hữu ích là nhớ trạng thái cuối cùng của một biến hoặc nhớ số lần một thiết bị đã được kích hoạt.

Ví dụ, hãy tưởng tượng tình huống sau:

   -Bạn đang điều khiển đèn bằng Arduino của mình và đèn đang bật;

   -Arduino đột ngột mất điện;

   -Khi bật lại nguồn, đèn sẽ tắt - không giữ lại lần thay đổi cuối cùng.

Bạn không muốn điều này xảy ra. Bạn muốn Arduino nhớ lại những gì đã xảy ra trước khi mất điện và trở về trạng thái cuối cùng.




BÂY GIỜ ĐÈN ĐANG SÁNG, BỔNG DƯNG MẤT ĐIỆN.


Arduino EEPROM nhớ trạng thái LED được lưu trữ.

Để Add thư viện EEPROM:

#include <EEPROM.h>

Write ( ghi dữ liệu vào eeprom).

   Để ghi dữ liệu vào EEPROM, bạn sử dụng hàm EEPROM.write () có hai đối số. Đầu tiên là vị trí hoặc địa chỉ EEPROM mà bạn muốn lưu dữ liệu và thứ hai là giá trị mà chúng tôi muốn lưu:
EEPROM.write(address, value);

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

EEPROM.write(0, 9);

Read ( đọc giữ liệu eeprom ).

   Để đọc một byte từ EEPROM, bạn sử dụng hàm EEPROM.read (). Hàm này lấy địa chỉ của byte có một đối số.
EEPROM.read(address);

Ví dụ, để đọc byte được lưu trữ trước đó trong địa chỉ 0:

EEPROM.read(0);

Điều này sẽ trả về 9, là giá trị được lưu trữ ở vị trí đó.

Update a value (Thay đổi giá trị mới).

   Hàm EEPROM.update () đặc biệt hữu ích. Nó chỉ ghi trên EEPROM nếu giá trị được ghi khác với giá trị đã được lưu.
Vì EEPROM có tuổi thọ hạn chế do các chu kỳ ghi / xóa bị giới hạn, việc sử dụng hàm EEPROM.update () thay vì EEPROM.write () sẽ lưu các chu kỳ.
EEPROM.update(address, value);

EEPROM.update(0, 9);


#include <EEPROM.h>

const int buttonPin = 8;    // pushbutton pin
const int ledPin = 4;       // LED pin

int ledState;                // variable to hold the led state
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin


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

void setup() {
  // set input and output
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);

  // initialize serial monitor
  Serial.begin (9600);

  //check stored LED state on EEPROM using function defined at the end of the code
  checkLedState(); 
}

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

  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;
      }
    }
  }

  // set the LED state
  digitalWrite(ledPin, ledState);
  // save the current LED state in the EEPROM
  EEPROM.update(0, ledState);
  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState
  lastButtonState = reading;
}

// Prints and upates the LED state
// when the Arduino board restarts or powers up
void checkLedState() {
   Serial.println("LED status after restart: ");
   ledState = EEPROM.read(0);
   if(ledState == 1) {
    Serial.println ("ON");
    digitalWrite(ledPin, HIGH);
   } 
   if(ledState == 0) {
    Serial.println ("OFF");
    digitalWrite(ledPin, LOW);
   }
}


Đây là mã gỡ lỗi thay đổi trạng thái đèn LED mỗi khi bạn nhấn nút. Nhưng có điều đặc biệt về mã này - nó ghi nhớ trạng thái đèn LED đã lưu, ngay cả sau khi đặt lại hoặc cấp nguồn cho Arduino.

Về cơ bản, chúng tôi lưu trạng thái LED hiện tại trong biến ledState và lưu nó vào EEPROM với dòng sau:

EEPROM.update(0,ledState);

Khi bắt đầu đoạn mã trên setup (), chúng ta kiểm tra ledState được lưu trên EEPROM và đặt led bật hoặc tắt tương ứng với trạng thái đó khi chúng ta khởi động lại chương trình. Chúng tôi làm điều đó với một hàm chúng tôi đã tạo ở cuối mã, checkLedState ()

void checkLedState() { Serial.println("LED status after restart: "); ledState = EEPROM.read(0); if (ledState == 1) { Serial.println ("ON"); digitalWrite(ledPin, HIGH); } if (ledState == 0) { Serial.println ("OFF"); digitalWrite(ledPin, LOW); } }




Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...