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
Команда форума
Правильно ли я понял, если я буду постоянно производить сканирование и ждать пока появится искомая сеть, в это время первая сеть будет недоступна?
Так я и писал об этом.
проще второй модуль вкорячить на сеть телефона.
Проще, но стоит поэкспериментировать, так как даже это, может слабо работать.
 
Последнее редактирование:
Сверху Снизу