반응형
동작 순서
WIFI STA 모드로 접속할 때 접속하려는 AP 인증이 달라질 때마다 펌웨어를 업데이트 해야 하는 귀차니즘을 다음과 같이 해결하였다.
- BT(BLE), Serial 연결은 확실하므로 PC나 스마트 폰으로 ESP32에 연결을 하고
- WiFi 접속 정보를 블루투스 또는 시리얼 통신으로 보낸다.
- ESP32는 수신된 데이터를 별도의 공간에 저장한다.
- 재부팅을 하거나 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 Client-Server Wi-Fi Communication Between Two Boards | Random Nerd Tutorials
반응형