#include <Arduino.h>
#include <ESP8266WiFi.h>
class customInterval {
private:
uint32_t timeout = 0;
public:
void Run(void(*fn)(),const uint32_t interval){
if( millis()>timeout){
timeout = millis()+interval;
fn();
}
yield();
}
};
struct {
const char* ssid;
const char* pass;
} wifiData[] = {"ssid1", "pass1", "ssid2", "pass2","ssid3", "pass3","ssid4", "pass4"};
constexpr uint8_t count_ssid = sizeof(wifiData) / sizeof(wifiData[0]); // вычисляем размер массива на этапе компиляции
int8_t netIndex = -1; // индекс найденной сети к которой можно подключиться. Если -1 сеть не найдена, либо сканирование не требуется т.к. уже есть подкючение.
customInterval chConn;
void searchTargetNet(uint8_t networksFound);
bool tryToConnect();
void checkConnect();
// Проверка подключения и запуск сканирования
void checkConnect(){
if(WiFi.status() != WL_CONNECTED){
Serial.printf("Status - disconnected\n");
WiFi.scanNetworksAsync(searchTargetNet);
}
}
// Поиск сети к которой нужно подключиться
void searchTargetNet(uint8_t networksFound){
Serial.printf("Networks found: %u\n", networksFound);
for(uint8_t i = 0; i < networksFound; i++){
for(uint8_t j = 0; j< count_ssid; j++){
if(strcmp(WiFi.SSID(i).c_str(), wifiData[j].ssid) == 0){
Serial.printf("Found target SSID! Index: %u , Name: %s\n",j,wifiData[j].ssid);
netIndex = j;
return;
}
}
}
Serial.printf("Not found target net\n");
};
// Попытка подключения
bool tryToConnect(){
WiFi.begin(wifiData[netIndex].ssid, wifiData[netIndex].pass);
Serial.printf("Waiting...");
if(WiFi.waitForConnectResult(10000) == WL_CONNECTED){
IPAddress ip = WiFi.localIP();
Serial.printf(" Status - connected, ip adress: %u.%u.%u.%u , RSSI: %i\n", ip[0],ip[1],ip[2],ip[3],WiFi.RSSI());
WiFi.scanDelete();
return true;
}
Serial.printf("Status - not connected\n");
netIndex = -1;
return false;
}
void setup(void) {
WiFi.persistent(false);
Serial.begin(115200);
Serial.printf("\nOur mac = %s\n",WiFi.macAddress().c_str());
Serial.printf("Target ssids:");
for(uint8_t i=0;i<count_ssid;i++){
Serial.printf(" \"%s\" ", wifiData[I].ssid);
}
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.scanNetworksAsync(searchTargetNet);
}
void loop(void) {
static const uint32_t connInterval = 12000; // Интервал выполнения ф-ции checkConnect (мс.)
chConn.Run(checkConnect,connInterval); // Запускаем функцию checkConnect с заданным интервалом
if(netIndex >= 0 && tryToConnect()) netIndex = -1;
}[/I]