概要
ATOM-S3 でWiFiを利用する際、これまでSSID、パスワードをソースコードに
直接記入していました。そのため変更があった際には都度ソースコードを
書き換えていました。
最近になってATOM-S3でEEPROMが利用できることを知りました。
そこで、EEPROMにID、パスワードを保存しておき必要に応じてシリアル
通信で書き換えできるようにしてみました。
環境など
エディタ:VisualStudioCode(PlatformIO IDE)
マイコン:ATOM-S3
動作確認
①EEPROMへSSIDとパスワード保存
PCとATOM-S3をUSBケーブルで接続、シリアルコンソールから
「set,SSID,PASSWORD\n」を入力。文字間はカンマ区切りで。
③Wi-Fi接続
ATOM-S3 を再起動後、シリアルコンソールで「wifi」と入力。
wifi接続が成功すると、SSIDとパスワードが表示されます。
AtomS3 コード
#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();
}
}
}
参考サイト