반응형

동작 순서

WIFI STA 모드로 접속할 때 접속하려는 AP 인증이 달라질 때마다 펌웨어를 업데이트 해야 하는 귀차니즘을 다음과 같이 해결하였다.

  1. BT(BLE), Serial 연결은 확실하므로 PC나 스마트 폰으로 ESP32에 연결을 하고
  2. WiFi 접속 정보를 블루투스 또는 시리얼 통신으로 보낸다.
  3. ESP32는 수신된 데이터를 별도의 공간에 저장한다.
  4. 재부팅을 하거나 WiFi 재접속을 한다.

 

시리얼 통신 화면

Serial Terminal
*help?$

Serial Monitor
==== HELP ====
---- SET Commands ----
*SETDATE:yyyymmdd$
*SETDATETIME:yyyymmddhhiiss$
*RESTART:1$
*SETWIFISSID:your ssid$
*SETWIFIPASS:your password$

---- GET Commands ----
*HELP?$
*GETWIFI?$
==== ==== ====
Serial Terminal
*SETWIFISSID:myap;SETWIFIPASS:password$

Serial Monitor
OK

시리얼 통신 코드를 만들어 놓고, WiFi 설정 명령을 수신하면 값을 환경설정 영역에 저장한다.
(Preferences.h 라이브러리를 사용한다)

환경설정 저장

#include <Preferences.h>
Preferences preferences;

void userFunction1(String strVAL)
{
    // SSID 처리 코드
    preferences.begin("wifi", false);
    preferences.putString("ssid", strVAL);
    preferences.end();
}

void userFunction2(String strVAL)
{
    // PASS 처리 코드
    preferences.begin("wifi", false);
    preferences.putString("pass", strVAL);
    preferences.end();
}

 

환경설정 읽기

void setup() 함수 내에서 WIFI를 설정할 때, 아래와 같이 변수에 저장하고 WiFi 접속을 하면 된다.

struct {
    String SSID;
    String Pass;
}WIFI;

void setup()
{
    preferences.begin("wifi", false);
    WIFI.SSID = preferences.getString("ssid", "");
    WIFI.Pass = preferences.getString("pass", "");
    preferences.end();
    
    ...생략
    WiFi.begin(WIFI.SSID.c_str(), WIFI.Pass.c_str());
    ...생략
}

 

나중에 시리얼이나 OTA로 펌웨어 업데이트를 해도 환경설정 값이 남아있다. 전원을 끄거나 리셋해도 당연히 값이 남아있다. 😮😮😮
(파티션 유형이 다른 펌웨어를 업데이트하면 메모리 어드레스가 바뀌므로 Preferences 값이 사라진다)

 

WiFi가 한 번에 접속 되지 않는 경우가 있으므로, WiFi 이벤트 핸들러를 사용하고, setup()에서 몇 번 재시도 후에 loop()로 빠져 나가는 것이 좋다.
(loop() 문이 실행 중에도 수시로 WiFi 접속을 시도하게 된다.)


참고 문서

ESP32 Save Data Permanently using Preferences Library | Random Nerd Tutorials

 

ESP32 Save Data Permanently using Preferences Library | Random Nerd Tutorials

Save data permanently on the ESP32 flash memory using Preferences.h library. The data held in the flash memory persists across resets or power failures. Save credentials, API keys, threshold values

randomnerdtutorials.com

ESP32 Client-Server Wi-Fi Communication Between Two Boards | Random Nerd Tutorials

 

ESP32 Client-Server Wi-Fi Communication Between Two Boards | Random Nerd Tutorials

Create an HTTP communication between two ESP32 boards to exchange data via Wi-Fi without an internet connection. You'll program your ESP32 boards with Arduino IDE.

randomnerdtutorials.com

 

반응형

관련글