醬是創客的ESP32教學主題第五篇,以Ai-Thinker安信可NodeMCU-32S(使用Arduino語言)來實作教學,本篇教學將著重於讀取/寫入資料至EEPROM記憶體,重開機資料依舊存在,通常我們會存放SSID、Password、User ID和授權碼等資訊進去EEPROM,ESP32的EEPROM有512個位置,每個位置可以放一個byte(0~255)

以下是我們今天的目標

  • 開發板使用EEPROM 160個位置
  • EEPROM位置0~31區域寫入iot
  • EEPROM位置32~95區域寫入chosemaker
  • EEPROM位置96~159區域寫入iot-chosemaker-best
  • 讀取EEPROM位置0~31並合成String
  • 讀取EEPROM位置32~95並合成String
  • 讀取EEPROM位置96~159並合成String

設備:
安信可NodeMCU-32S #露天拍賣 #蝦皮購物

Arduino 範例程式碼如下

//醬是創客 開發實作的好夥伴
#include "WiFi.h"
#include <EEPROM.h>

String write_ssid = "iot";
String write_password = "chosemaker";
String write_uid = "iot-chosemaker-best";
String read_ssid = "";
String read_password = "";
String read_uid = "";

void setup() {
  Serial.begin(115200);
  
  //宣告使用EEPROM 160個位置
  EEPROM.begin(160);

  //清空EEPROM 0~160的位置
  Serial.println("clearing eeprom");
  for (int i = 0; i < 160; ++i) { EEPROM.write(i, 0); }

  //寫入EEPROM 0~31的位置
  Serial.println("writing eeprom ssid:");
  for (int i = 0; i < write_ssid.length(); ++i)
    {
      EEPROM.write(i, write_ssid[i]);
      Serial.print("Wrote: ");
      Serial.println(write_ssid[i]);
    }

  //寫入EEPROM 32~95的位置
  Serial.println("writing eeprom pass:");
  for (int i = 0; i < write_password.length(); ++i)
    {
      EEPROM.write(32+i, write_password[i]);
      Serial.print("Wrote: ");
      Serial.println(write_password[i]);
    }  
    
  //寫入EEPROM 96~159的位置
  Serial.println("writing eeprom uid:");
  for (int i = 0; i < write_uid.length(); ++i)
    {
      EEPROM.write(96+i, write_uid[i]);
      Serial.print("Wrote: ");
      Serial.println(write_uid[i]);
    }  
  //一次寫入  
  EEPROM.commit();

  Serial.println("Reading EEPROM");
  //讀取EEPROM 0~32的位置
  for (int i = 0; i < 32; ++i)
    {
      read_ssid += char(EEPROM.read(i));
    }
  Serial.print("read_ssid: ");
  Serial.println(read_ssid);

  //讀取EEPROM 32~95的位置
  for (int i = 32; i < 96; ++i)
    {
      read_password += char(EEPROM.read(i));
    }
  Serial.print("read_password: ");
  Serial.println(read_password);

  //讀取EEPROM 96~159的位置
  for (int i = 96; i < 160; ++i)
    {
      read_uid += char(EEPROM.read(i));
    }
  Serial.print("read_uid: ");
  Serial.println(read_uid);
  
}

void loop() {
  
}

Arduino 序列埠監控視窗 輸出如下

clearing eeprom
writing eeprom ssid:
Wrote: i
Wrote: o
Wrote: t
writing eeprom pass:
Wrote: c
Wrote: h
Wrote: o
Wrote: s
Wrote: e
Wrote: m
Wrote: a
Wrote: k
Wrote: e
Wrote: r
writing eeprom uid:
Wrote: i
Wrote: o
Wrote: t
Wrote: -
Wrote: c
Wrote: h
Wrote: o
Wrote: s
Wrote: e
Wrote: m
Wrote: a
Wrote: k
Wrote: e
Wrote: r
Wrote: -
Wrote: b
Wrote: e
Wrote: s
Wrote: t
Reading EEPROM
read_ssid: iot
read_password: chosemaker
read_uid: iot-chosemaker-best