ATOM-S3  Wi-Fiの SSID、パスワードをEEPROMから取得

# 概要
ATOM-S3 でWiFiを利用する際、これまでSSID、パスワードをソースコードに
直接記入していました。そのため変更があった際には都度ソースコードを
書き換えていました。
最近になってATOM-S3でEEPROMが利用できることを知りました。
そこで、EEPROMにID、パスワードを保存しておき必要に応じてシリアル
通信で書き換えできるようにしてみました。

# 環境など
　エディタ：VisualStudioCode（PlatformIO IDE）
　マイコン：ATOM-S3

 # 動作確認
 ①EEPROMへSSIDとパスワード保存
　PCとATOM-S3をUSBケーブルで接続、シリアルコンソールから
 　「set,SSID,PASSWORD\n」を入力。文字間はカンマ区切りで。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/9f1b1d2d-d29e-d63d-f088-7b06ba9f4ac1.png)

  　ディスプレイのにsavedと表示されます。
  　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/45c479b4-c8c6-5d6e-bf54-db5ea03ce66b.png)
   
②保存データ確認
　シリアルコンソールで「read」と入力。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/3bc79df6-2cd6-c787-ec4b-48837b08692c.png)

保存されたSSID、パスワードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/9d10804f-98cc-d59d-e74d-f960298963ec.png)

③Wi-Fi接続
　ATOM-S3 を再起動後、シリアルコンソールで「wifi」と入力。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/ed5992b1-a4a4-c578-2f46-2f5c6f4c1d76.png)

wifi接続が成功すると、SSIDとパスワードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/0b546bd7-a647-c545-0efb-66ef621532b2.png)

 # AtomS3 コード
``` cpp
#include <Arduino.h>
#include <M5AtomDisplay.h>
#include <M5Unified.h>
#include <EEPROM.h>
#include <WiFi.h>

//EEPROMデータ保存アドレス
#define EEPROM_ADDRESS 0

// EEPROMに保存するデータ
struct EepromData {
  String SSID;
  String PASS;
};
EepromData eeprom;

// シリアル受信データ保持用
String serial_data;

// カンマ区切りで配列取得
int split(String data, char delimiter, String *dst){
  int index = 0; 
  int datalength = data.length();  
  for (int i = 0; i < datalength; i++) {
    char tmp = data.charAt(i);
    if ( tmp == delimiter ) {
        index++;
    }
    else dst[index] += tmp;
  }  
  return (index + 1);
}

// EEPROMデータ保存
void eepromSave(String id,String pas) {
  eeprom.SSID = id;
  eeprom.PASS = pas;
  EEPROM.put(EEPROM_ADDRESS, eeprom);
  EEPROM.commit();
}

// EEPROMデータ読出
void eepromLoad() {
  EEPROM.get(EEPROM_ADDRESS, eeprom);
}

// Wi-Fiスタート
void start_wifi(){
  // EEPROMからSSID,PASS読込
  eepromLoad();
  WiFi.begin(eeprom.SSID, eeprom.PASS);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500); 
    M5.Lcd.print("."); 
  }
  M5.Lcd.println("WiFi Connected"); 
  M5.Lcd.println(eeprom.SSID); 
  M5.Lcd.println(eeprom.PASS); 
}

void setup() {
  // Setup USBSerial for debbuging.
  USBSerial.begin(115200);

  // Display設定
  M5.Display.init();
  M5.Display.setRotation(3);
  M5.Display.setFont(&fonts::lgfxJapanGothicP_12);
  M5.Display.setTextColor(WHITE, BLACK);

  // Title表示
  M5.Display.setCursor(0,0);
  M5.Display.println("EEPROM Test");

  //　EEPROM設定
  if (!EEPROM.begin(sizeof(eeprom))) {
    M5.Display.println(
      "\nFailed to initialise EEPROM!");
    while(1);
  }
}

void loop() {

  // USBシリアルデータ受信   
  if(USBSerial.available() > 0) {  
    serial_data = USBSerial.readStringUntil('\n'); //デリミタを検出したら終了
    if(serial_data.indexOf("read") >=0){
      eepromLoad();
      M5.Display.println(eeprom.SSID);
      M5.Display.println(eeprom.PASS);
    }

    if(serial_data.indexOf("set") >=0){
      String tmp[3];
      int index = split(serial_data, ',', tmp);
      eepromSave(tmp[1],tmp[2]);
      M5.Display.println("EEPROM saved");
    }

    if(serial_data.indexOf("wifi") >=0){
      start_wifi();
    }
  }
  
}

```

 # 参考サイト
 https://qiita.com/Kaz_Macintosh/items/a9cf03da549f24da0a5f

https://github.com/m5stack/M5AtomS3/blob/main/examples/Advanced/Storage/EEPROM/EEPROM.ino