• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 подключение к нескольким сетям Wi-Fi

fiji

New member
Добрый день!
Подскажите как прописать в скетче несколько сетей Wi-Fi чтобы устройство на esp8266 автоматически подключалось к одной из них.
Если конкретно - есть "метеостанция", пока пробный вариант, которая передает значение температуры с датчика ds18b20 через Blynk. Вот код
Код:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS D1

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

char auth[] = "*****************";
char ssid[] = "*****************";
char pass[] = "*****************";


void setup()
{
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
sensors.begin();
}

void sendTemps()
{
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
Serial.println(temp);
Blynk.virtualWrite(V1, temp);
}

void loop()
{
Blynk.run();
sendTemps();
delay(5000);
}
Подскажите что нужно добавить в имеющийся код, чтобы при переносе устройства в другое место ESP8266 автоматически подключалась к имеющейся в этом месте Wi-Fi-сети и продолжала работать? Естественно все это при условии что SSID и пароли сетей заранее известны.
 

CodeNameHawk

Moderator
Команда форума
Логика такая, проверяете есть ли подключение к сети, если нет, закрываете соединение с сетью, сканируете доступные сети и если есть известная вам сеть, подключаетесь к ней.
Учтите, что обычно есп записывает данные о сети в память, а она имеет тенденцию протираться.
 

tretyakov_sa

Moderator
Команда форума
Логика такая, проверяете есть ли подключение к сети, если нет, закрываете соединение с сетью, сканируете доступные сети и если есть известная вам сеть, подключаетесь к ней.
Учтите, что обычно есп записывает данные о сети в память, а она имеет тенденцию протираться.
Тогда уж, сканируем сети и проверяем соответствие списка сетей, если есть подключаемся, если нет включаем точку доступа для настроек.
 

fiji

New member
сканируете доступные сети и если есть известная вам сеть, подключаетесь к ней.
Вот именно это меня и интересует, как мне перебрать имена известных сетей и пароли к ним. Если можно дайте ссылку где почитать или пример кода.

@tretyakov_sa, посмотрел на вашем канале видео Шаг №1. Там показан пример сканирования одной сети WiFi.begin(_ssid.c_str(), _password.c_str()); А как сделать если сетей, например, две WiFi1 и WiFi2 с паролями допустим passwifi1 и passwifi2?
 

fiji

New member
Я так понимаю что нужно организовать цикл в котором перебирать известные сети и проверять наличие подключения. Но как это правильно сделать? Как-то так ?
Код:
for (int i=0; i <= 2; i++){
      WiFi.begin(_ssid.c_str(i), _password.c_str(i));
      delay(1000);
if (WiFi.status() != WL_CONNECTED)
....
}
 

tretyakov_sa

Moderator
Команда форума
Я так понимаю что нужно организовать цикл в котором перебирать известные сети и проверять наличие подключения. Но как это правильно сделать?
Код:
boolean scanWIFI(String found){
   uint8_t n = WiFi.scanNetworks();
    for (uint8_t i = 0; i < n; i++) {
      String ssidMy = WiFi.SSID(i);
      if (ssidMy == found) return true; 
    }
    return false;
  }
Надеюсь для списка сетей сможете сделать самостоятельно.
 

Tigranik90

New member
Код для проверки и подключению к нескольким wi-fi сетям. Я использую этот код, если устройство к примеру уношу из дома на работу где разные wi-fi сети, или если хочу подключиться на улице просто раздаю wi-fi с мобильной точки доступа на своем телефоне.
Обратите внимание, что если ни одна из перечисленных сетей все таки не будет подключена, программа все равно будет работать в офлайн, в отличии от стандартного Blynk.begin(auth, ssid, pass);

Код:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "your_token";
char* ssid[] = {"ssid_1","ssid_2","ssid_Mobil"}; //list a necessary wifi networks
char* pass[] = {"pass_1","pass_2","pass_Mobil"}; //list a passwords

void setup()
{
  Serial.begin(9600);
  MultyWiFiBlynkBegin(); //instead Blynk.begin(auth, ssid, pass);
}

void MultyWiFiBlynkBegin() {
  int ssid_count=0;
  int ssid_mas_size = sizeof(ssid) / sizeof(ssid[0]);
  do {
    Serial.println("Trying to connect to wi-fi " + String(ssid[ssid_count]));
    WiFi.begin(ssid[ssid_count], pass[ssid_count]);   
    int WiFi_timeout_count=0;
    while (WiFi.status() != WL_CONNECTED && WiFi_timeout_count<50) { //waiting 10 sec
      delay(200);
      Serial.print(".");
      ++WiFi_timeout_count;
    }
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println("Connected to WiFi! Now I will check the connection to the Blynk server");
      Blynk.config(auth);
      Blynk.connect(5000); //waiting 5 sec
    }
    ++ssid_count;
  }
  while (!Blynk.connected() && ssid_count<ssid_mas_size);
  if (!Blynk.connected() && ssid_count==ssid_mas_size) {
    Serial.println("I could not connect to blynk =( Ignore and move on. but still I will try to connect to wi-fi " + String(ssid[ssid_count-1]));
  }
}

void loop()
{
  Blynk.run();
}
 

lavroff84

New member
Здравствуйте, прошу помощи примером кода, есть программа на нодемцу в3, охранная система авто с автозапуском и кнопкой старт стоп, привязанная к блинку(в авто есть сеть), все работает, хотелось бы добавить безключевой доступ, т.е. при приближении к авто с включенной точкой доступа мобильного, еспишка бы переключалась на сеть мобильника и снимала с охраны, соответственно при выходе из радиуса действия сети становилась на охрану и переходила на сеть авто. Т.е. основной сетью должна быть сеть мобильника а при удалении еспишка переходит на сеть авто. Код прилагаю, сразу оговорюсь не программист синтаксиса языков не знаю(не много в плане микроконтроллеров си#) писал на FLprog и нельзя использовать "serial" ноги ком порта заняты как входы/выходы.
Безымянный.jpg Безымянный2.jpg Безымянный1.jpg
 

lavroff84

New member
Не могу код прикрепить, больше 10000 символов
C:
#define BLYNK_PRINT Serial
#include <SPI.h>
#include "user_interface.h"
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "d2oF0PtqaqnOYfu";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "";
char pass[] = "";

int ESP8266_AnalogInputValue;
unsigned long ESP8266_AnalogInputValue_StR;
bool _gtv1 = 0;
bool _gtv2 = 0;
unsigned long _gtv3 = 138;
bool _gtv4 = 0;
bool _gtv6 = 0;
bool _gtv5 = 0;
bool _gtv7 = 0;
bool _gtv8 = 0;
bool _gtv9 = 0;
float _gtv10 = 0;
bool _gtv11 = 0;
bool _count4I = 0;
int _count4_Value = 0;
bool _count4MaxLO = 0;
bool _bounseInputD13S = 0;
bool _bounseInputD13O = 0;
unsigned long _bounseInputD13P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool FTrig_1_Out = 0;
bool FTrig_1_OldStat = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _trgs6 = 0;
bool _gen3I = 0;
bool _gen3O = 0;
unsigned long _gen3P = 0UL;
bool _count1I = 0;
int _count1_Value = 0;
bool _count1MaxLO = 0;
bool _bounseInputD14S = 0;
bool _bounseInputD14O = 0;
unsigned long _bounseInputD14P = 0UL;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _tim4I = 0;
bool _tim4O = 0;
unsigned long _tim4P = 0UL;
bool _count5I = 0;
int _count5_Value = 0;
bool _count5MaxLO = 0;
bool _Terminal_29530263;
bool _bounseInputD12S = 0;
bool _bounseInputD12O = 0;
unsigned long _bounseInputD12P = 0UL;
bool _trgs2 = 0;
bool _trgs5 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _tim5I = 0;
bool _tim5O = 0;
unsigned long _tim5P = 0UL;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
bool _trgs3 = 0;
bool _bounseInputD5S = 0;
bool _bounseInputD5O = 0;
unsigned long _bounseInputD5P = 0UL;
bool _trgs1 = 0;
bool _gen2I = 0;
bool _gen2O = 0;
unsigned long _gen2P = 0UL;
bool _bounseInputD1S = 0;
bool _bounseInputD1O = 0;
unsigned long _bounseInputD1P = 0UL;
char i=0;
// Каждый раз, когда мы подключаемся к облаку...
BLYNK_CONNECTED() {
  // Запросите последнее состояние с сервера
  Blynk.syncVirtual(V0);
Blynk.syncVirtual(V1);
Blynk.syncVirtual(V2);

  //Кроме того, вы можете переопределить состояние сервера с помощью:
//Blynk.virtualWrite(V2, ledState);
}
BLYNK_WRITE(V0)
{
  //меняем состояние булевых переменных
   _gtv9 = (bool) param.asInt();
}



BLYNK_WRITE(V1)
{
  //меняем состояние булевых переменных
   _gtv2 = (bool) param.asInt();
}

BLYNK_WRITE(V2)
{
  //меняем состояние булевых переменных
   _gtv4 = (bool) param.asInt();
}
BLYNK_WRITE(V3)
{
  //меняем состояние булевых переменных
   _gtv11 = (bool) param.asInt();
}
BLYNK_READ(V5)
{Blynk.virtualWrite(V5,_gtv10);}
WidgetLED led1(V4);
WidgetLED led2(V6);
WidgetLED led3(V7);
void setup()

   {pinMode(1, FUNCTION_3);
   pinMode(3, FUNCTION_3);
      pinMode(1, INPUT_PULLUP);
    pinMode(14, INPUT_PULLUP);
    pinMode(12, INPUT_PULLUP);
    pinMode(13, INPUT_PULLUP);
    pinMode(5, INPUT);
    pinMode(16, OUTPUT);
    digitalWrite(16, 1);
    pinMode(15, OUTPUT);
    digitalWrite(15, 1);
    pinMode(4, OUTPUT);
    digitalWrite(4, 1);
    pinMode(0, OUTPUT);
    digitalWrite(0, 1);
    pinMode(2, OUTPUT);
    digitalWrite(2, 1);
    pinMode(3, OUTPUT);
    digitalWrite(3, 1);
    ESP8266_AnalogInputValue_StR = millis() + 500 ;
    _bounseInputD14O =  digitalRead(14);
    _bounseInputD13O =  digitalRead(13);
    _bounseInputD1O =  digitalRead(1);
    _bounseInputD5O =  digitalRead(5);
    _bounseInputD12O =  digitalRead(12);

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);


}




void loop()
{Blynk.run();
    //здесь мой код
}
 

lavroff84

New member
В принципе даже не нужно что бы переподключалась к другой, просто при обнаружении сети мобильника снимала с охраны, а при потери сети ставила на охрану.
 

CodeNameHawk

Moderator
Команда форума
Сканируйте эфир и делайте, то что задумали.
Но скорее всего есп не сможет, одновременно с этим, работать по wifi.
 

lavroff84

New member
Сканируйте эфир и делайте, то что задумали.
Но скорее всего есп не сможет, одновременно с этим, работать по wifi.
Т.е можно при условии нахождения заведомо известной сети выполнить какое-то действие, даже не подключаясь к ней, если это так, подскажите как будет выглядеть код, по поводу работы вайфай, он мне не нужен при снятии с охраны(нужно только гонять код опроса входов и передача сигналов на выходы), связь с блинком нужна только при постановке на охрану(когда вторая сеть будет недоступна).
 

lavroff84

New member
Смотрите примеры Wifi.scanNetworks в документации.
Правильно ли я понял, если я буду постоянно производить сканирование и ждать пока появится искомая сеть, в это время первая сеть будет недоступна? Если это так то весь смысл затеи теряется, либо придется попеременно отключать первую и сканировать вторую, потом опять включать и так по кругу, что есть не очень хорошо, проще второй модуль вкорячить на сеть телефона.
 

CodeNameHawk

Moderator
Команда форума
Правильно ли я понял, если я буду постоянно производить сканирование и ждать пока появится искомая сеть, в это время первая сеть будет недоступна?
Так я и писал об этом.
проще второй модуль вкорячить на сеть телефона.
Проще, но стоит поэкспериментировать, так как даже это, может слабо работать.
 
Последнее редактирование:
Код для проверки и подключению к нескольким wi-fi сетям. Я использую этот код, если устройство к примеру уношу из дома на работу где разные wi-fi сети, или если хочу подключиться на улице просто раздаю wi-fi с мобильной точки доступа на своем телефоне.
Совсем недавно занимаюсь арудино и в частности ESP8266 и пока с Блинк не сталкивался, хоть и приблизительно понимаю, что это какой-то облачный сервис.
Но мне он не нужен. Нужно только подключение к сети. Если только подключиться к одной заранее известной сети, то все получается. Попробовал скопипастить ваш пример. Он работает, делает попытки подключиться к тем сетям, что прописаны у него в массивах. Выбросил все, что касается Блинка и пример перестал работать. Показывает процесс попыток подключения к сетям из массива и все. Получилось что-то типа этого:
Код:
#include <ESP8266WiFi.h>                                                // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>

char* array_ssid[] = {"ssid1", "ssid2"};                        // Массив необходимых ссидов
char* array_pass[] = {"pass1", "pass2"};              // Массив необходимых паролей к этим ссидам

int count_ssid = sizeof(array_ssid) / sizeof(array_ssid[0]);            // Размер массива ссидов

// Функция сканирования и подключения к найденной известной сети из нашего списка, другие будут игнорится
void conekt_to_wifi(int networksFound) {                                //
  Serial.print("Найдено сетей = ");
  Serial.println(networksFound);    // Показывает сколько сетей найдено. Пока только для теста, потом можно настроить подключение к сети из массива, если она найдена при сканировании
      
  do {
  for (int i = 0; i < count_ssid; i++) {

    Serial.println("\nTrying to connect to wi-fi " + String(array_ssid[i]));
Serial.println(String(array_ssid[i]) + ":" + String(array_pass[i]));
    WiFi.begin(array_ssid[i], array_pass[i]);   
    int WiFi_timeout_count=0;
    while (WiFi.status() != WL_CONNECTED && WiFi_timeout_count<50) { //waiting 10 sec
      delay(200);
      Serial.print(".");
      ++WiFi_timeout_count;
    }
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println("Connected to WiFi! Now I will check the connection to the Blynk server");
    }
  }
  }
while (WiFi.status() == WL_CONNECTED); 
}

void setup() {
  Serial.begin(9600);
  while (!Serial) {
                                                                        // ждём, пока не откроется монитор последовательного порта
                                                                        // для того, чтобы отследить все события в программе
  }
  WiFi.mode(WIFI_OFF);                                                  // Останавливаем вайфай
  delay(1000);
  WiFi.mode(WIFI_STA);                                                  // Запускаем вайфай

  Serial.println("\nOur mac = " +WiFi.macAddress());                     // Выводим мак адрес
  WiFi.setHostname("Host_MDNS");                                        // Устанавливаем новое имя нашего клиента
  Serial.println(WiFi.hostname());                                      // Распечатываем имя клиента
        
  WiFi.scanNetworksAsync(conekt_to_wifi);                                // Сканируем вайфай сети и подклоючаемся, если есть из нашего списка
}

void loop() {}
 
Сделал я и функцию, которая вроде как сканирует, выбирает нужную точку, но не может приконектится. Может кто сможет в ней найти ошибку и сказать, почему плата не может подключиться?
Код:
#include <ESP8266WiFi.h>                                                // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>

char* array_ssid[] = {"ssid1", "ssid2"};                        // Массив необходимых ссидов
char* array_pass[] = {"pass1", "pass2"};                    // Массив необходимых паролей к этим ссидам

int count_ssid = sizeof(array_ssid) / sizeof(array_ssid[0]);            // Размер массива ссидов

// Функция скарирования и подключения к найденной известной сети из нашего списка, другие будут игнорится
void conekt_to_wifi(int networksFound) {                                //
  for (int i = 1; i <= networksFound; i++) {
    for (int j = 0; j < count_ssid; j++) {
      if (WiFi.SSID(i)==array_ssid[j]) {
        Serial.println("One of ouer ssid was found = " +WiFi.SSID(i));      
        WiFi.begin(array_ssid[j], array_pass[j]);                             // Инициализируем подключение к указанной вайфай сети
        WiFi.setHostname("Host_MDNS");                                        // Устанавливаем новое имя нашего клиента
        Serial.println(WiFi.hostname());                                      // Распечатываем имя клиента
        while (WiFi.status() != WL_CONNECTED) {                               // Зупускаем ожидание поднятия вайфай сервера
        Serial.println("waiting...");
        delay(1000);

        Serial.println(WiFi.localIP());                                        // Выводим в монитор порта айпишник нашей платы
        }          
      }
    }

  }
}

void setup() {
  Serial.begin(9600);
  while (!Serial) {
                                                                        // ждём, пока не откроется монитор последовательного порта
                                                                        // для того, чтобы отследить все события в программе
  }
  WiFi.mode(WIFI_OFF);                                                  // Останавливаем вайфай
  delay(1000);
  WiFi.mode(WIFI_STA);                                                  // Запускаем вайфай
  Serial.println("Our mac = " +WiFi.macAddress());                     // Выводим мак адрес

  WiFi.scanNetworksAsync(conekt_to_wifi);                                // Сканируем вайфай сети и подключаемся, если есть из нашего списка
}

void loop() {}
 

ghost21

Member
Может кто сможет в ней найти ошибку и сказать, почему плата не может подключиться?
Потому что ты сравниваешь мягкое с теплым.
C++:
#include <ESP8266WiFi.h>                                                // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>

char* array_ssid[] = {"ssid1", "ssid2"};                        // Массив необходимых ссидов
char* array_pass[] = {"pass1", "pass2"};                    // Массив необходимых паролей к этим ссидам

int count_ssid = sizeof(array_ssid) / sizeof(array_ssid[0]);            // Размер массива ссидов

char* ssid = "";
char* pass = "";
bool flag = 0;

// Функция скарирования и подключения к найденной известной сети из нашего списка, другие будут игнорится
void conekt_to_wifi(int networksFound) {                                //
  for (int i = 0; i < networksFound; i++) {

    for (int j = 0; j < count_ssid; j++) {
      if (WiFi.SSID(i) == (String)array_ssid[j]) {
        Serial.println("One of ouer ssid was found = " + WiFi.SSID(i));
        ssid = array_ssid[j];
        pass = array_pass[j];
        flag = true;
      }
    }
    if (flag) break;
  }
}


void setup() {
  WiFi.persistent(false);
  Serial.begin(9600);
  WiFi.mode(WIFI_OFF);                                                  // Останавливаем вайфай
  delay(1000);
  WiFi.mode(WIFI_STA);                                                  // Запускаем вайфай
  Serial.println("Ouer mac = " + WiFi.macAddress());                    // Выводим мак адрес

  conekt_to_wifi(WiFi.scanNetworks());

  if (flag) {
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) {                               // Зупускаем ожидание поднятия вайфай сервера
      delay(1000); Serial.println("waiting...");
    }
    Serial.println(WiFi.localIP());
  }
}

void loop() {}
 

Сергей Ш

New member
Добрый день!
Подскажите как прописать в скетче несколько сетей Wi-Fi чтобы устройство на esp8266 автоматически подключалось к одной из них.
Если конкретно - есть "метеостанция", пока пробный вариант, которая передает значение температуры с датчика ds18b20 через Blynk. Вот код
Код:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS D1

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

char auth[] = "*****************";
char ssid[] = "*****************";
char pass[] = "*****************";


void setup()
{
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
sensors.begin();
}

void sendTemps()
{
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
Serial.println(temp);
Blynk.virtualWrite(V1, temp);
}

void loop()
{
Blynk.run();
sendTemps();
delay(5000);
}
Подскажите что нужно добавить в имеющийся код, чтобы при переносе устройства в другое место ESP8266 автоматически подключалась к имеющейся в этом месте Wi-Fi-сети и продолжала работать? Естественно все это при условии что SSID и пароли сетей заранее известны.
Есть штатное решение: #include <ESP8266WiFiMulti.h>

#include <ESP8266WiFi.h> //Подключить библиотеки для работы с устройством ESP8266 по WiFi
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
const int connectTimeoutMs = 5000; //Тайм-аут подключения к Wi-Fi для каждой точки доступа

void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true); //Включить WiFi-диагностику
...................................

wifiMulti.addAP("SSID1", "Pass1"); //SSID и pass WiFi-сети №1
wifiMulti.addAP("SSID2", "Pass2"); //SSID и pass WiFi-сети №2
wifiMulti.addAP("SSID3", "Pass3"); //SSID и pass WiFi-сети №3
wifiMulti.addAP("SSID4", "Pass4"); //SSID и pass WiFi-сети №4
wifiMulti.addAP("FREE", ""); //SSID и pass WiFi-сети №5
}

Пример я вырвал из действующего скетча, может чего упустил. Но в сети есть описание <ESP8266WiFiMulti.h>. Посмотрите.
 
Сверху Снизу