• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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>. Посмотрите.
 
Сверху Снизу