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

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

Потому что ты сравниваешь мягкое с теплым.
Так оно работает. Спасибо.
Но я не понял, почему сравниваю мягкое с теплым? Я пробовал вывести в монитор порта пары ссид/пароль. Они совпадают с найденной сетью. У меня были мысли, что нужно сделать какие-то преобразования, пробовал в строку загнать, пробовал через return как-то вернуть.
Можете пояснить, что именно меняется, когда мы вот так объявляем переменные?
 
Почитай какой тип у WiFi.SSID() и у char* array_ssid[]
Хорошо, до вечера попробую прочитать. Можете глянуть ещё один пример подключения, который я выше приводил? Там вроде бы как только выбросил лишний для меня коннект к Блинку, и перестало работать.
 
Почитай какой тип у WiFi.SSID() и у char* array_ssid[]
Успел прочитать. Если я правильно понимаю, то вы говорите, что в WiFi.SSID() тип Стринг. В общем то, что я уже интересовался. Пробовал сделать Стрингом так сказать на лету, типа:
Код:
      if (WiFi.SSID(i)==array_ssid[j]) {
        Serial.println("\nOne of our ssid was found = " +WiFi.SSID(i));       
        String ssid = array_ssid[j];
        String pass = array_pass[j];
        WiFi.begin(ssid, pass);                             // Инициализируем подключение к указанной вайфай сети
        WiFi.setHostname("Host_MDNS");                                        // Устанавливаем новое имя нашего клиента
        Serial.println(WiFi.hostname());                                      // Распечатываем имя клиента
        while (WiFi.status() != WL_CONNECTED) {                               // Зупускаем ожидание поднятия вайфай сервера
        Serial.println("waiting..."); 
        delay(1000);

        Serial.println(WiFi.localIP());                                        // Выводим в монитор порта айпишник нашей платы
        }           
      }
И вот так:
Код:
      if (WiFi.SSID(i)==array_ssid[j]) {
        Serial.println("\nOne of our ssid was found = " +WiFi.SSID(i));       
        WiFi.begin(String(array_ssid[j]), String(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());                                        // Выводим в монитор порта айпишник нашей платы
        }           
      }
Все равно не получалось подключиться.
Ещё смущало, что пробуем сравнить разные типы на идентичность вот тут:
Код:
      if (WiFi.SSID(i)==array_ssid[j])
И раз находило идентичность (равенство), то не понятно, почему же тогда не срабатывает подстановка в WiFi.begin()?
 
Есть штатное решение: #include <ESP8266WiFiMulti.h>
Кстати, если это было ко мне, а не к ТС, то тут не понятна ситуация с этим мультивайфаем. Даже в вашем примере переменные добавляются в самой функции сетап, хотя по идее они должны объявляться вне функции. Не принципиально, но и не очень такой подход устраивает.
 

ghost21

Member
Ещё смущало, что пробуем сравнить разные типы на идентичность вот тут:
уже теплее ...
И раз находило идентичность (равенство),
уверены? Сделайте обычный serial.print("ok") если равно без остальной части кодда и посмотрите что будет
 

ghost21

Member
Приведите полный код о котором сейчас идет речь, а то тут уже столько вариантов что не понятно какой смотреть
 
char* ssid = ""; char* pass = ""; bool flag = 0;
Кстати, чуток переделал, поскольку не вижу смысла эти переменные помещать в глобальную зону видимости.
Код:
#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 = 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));
        char* ssid = array_ssid[j];                                     //  поместил тут объявление переменных для подключения
        char* pass = array_pass[j];
        WiFi.begin(ssid, pass);
        while (WiFi.status() != WL_CONNECTED) {                               // Зупускаем ожидание поднятия вайфай сервера
        delay(1000); Serial.println("waiting...");
        }
        Serial.println(WiFi.localIP());
      }
    }
  }
}


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

  conekt_to_wifi(WiFi.scanNetworks());
}

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 = 0; i < networksFound; i++) {
    for (int j = 0; j < count_ssid; j++) {
      if (WiFi.SSID(i) == (String)array_ssid[j]) {  // Это единственное сравнение в функции
        Serial.println("\nOk");
      }
    }
  }
}


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

  conekt_to_wifi(WiFi.scanNetworks());
}

void loop() {}
 
Только у меня тут опечатка закралась после экспериментов (добавил Стринг), но она не меняет суть дела. Сравнение проходит, равенство работает
Код:
      if (WiFi.SSID(i) == array_ssid[j]) {  // Это единственное сравнение в функции
 
Пока что получилось вот так:
Код:
#include <ESP8266WiFi.h>                                                    // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>

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

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

// Функция скарирования и подключения к найденной известной сети из нашего списка, другие будут игнорится
void conekt_to_wifi(int networksFound) {                                    //
  if (WiFi.status() != WL_CONNECTED) {                                      // Проверяем, есть ли вообще подключение, если нет, то в следующей строке запускаем сканирование
  for (int i = 0; i < networksFound; i++) {                                 // Перебираем полученные точки доступа
    for (int j = 0; j < count_ssid; j++) {                                  // Перебираем в нашем списке точек доступа и проверяем условия
        if (WiFi.status() == WL_CONNECTED) {                                // Сперва проверяем, если все же есть подключение, то выходим из цикла. Нужно для проверки при разрывах
        break;
        }
        else if (WiFi.SSID(i) == array_ssid[j]) {                           // Если нет подключения, то сравниваем с нашим списком
        Serial.println("\nOne of our ssid was found = " + WiFi.SSID(i));
        char* ssid = array_ssid[j];                                         //  поместил тут объявление переменных для подключения, потому что в глобальных не вижу смысла
        char* pass = array_pass[j];
        WiFi.begin(ssid, pass);                                             // Стартуем подключение к точке доступа
        while (WiFi.status() != WL_CONNECTED) {                             // Зупускаем ожидание поднятия вайфай сервера
        delay(1000); Serial.println("waiting...");
        }
        Serial.println(WiFi.localIP());                                      // Распечатываем полученный айпишник
      }
    }
  }
    if (WiFi.status() != WL_CONNECTED) {                                      // Доп. роверка и отчет, если нет точек из нашего списка
      Serial.println("\nNo famouse wifi");
    }
  }
}

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

void loop() {
   conekt_to_wifi(WiFi.scanNetworks());                                       // Стартуем в цикле функцию сканирования сети и поиска нужной сети
}
Сканирует, если есть точка из нашего списка, то подключается. Если в списке просканированных несколько нужных нам точек, подключиться по алфавиту, потому что будет отталкиваться от списка отсканированных. Если разорвет соединение, то попробует найти ещё одну известную/нужную точку либо будет ждать, пока не появиться погасшая точка.
 

ghost21

Member
Код:
char* ssid = array_ssid[j]; // поместил тут объявление переменных для подключения, потому что в глобальных не вижу смысла
char* pass = array_pass[j];
В данном случае не вижу смысла в этих переменных вообще. В моем примере я их ввел и сделал глобальными т.к. прерывал перебор точек при первом же совпадении и попытка подключения осуществлялась уже вне этой ф-ции.
 
Код:
char* ssid = array_ssid[j]; // поместил тут объявление переменных для подключения, потому что в глобальных не вижу смысла
char* pass = array_pass[j];
В данном случае не вижу смысла в этих переменных вообще. В моем примере я их ввел и сделал глобальными т.к. прерывал перебор точек при первом же совпадении и попытка подключения осуществлялась уже вне этой ф-ции.
Что-то я запутался. Думал, что без объявления не будет работать. Закоментил и оно подключилось. Хотя теперь оно пришло к тому же виду, что было у меня изначально, когда не подключалось. Либо я спросонья не вижу разницу. Проснусь, посмотрю внимательней.
 
В данном случае не вижу смысла в этих переменных вообще.
Да, без низ фактически вернулось к тому же виду, что и было у меня в самом начале. Только несколько проверок добавилось для проверки подключено или нет. Получается, что типы данных в этой ситуации тут ни причем?
 
Вроде как и сделал. Ещё заменил delay на milis, но не уверен, что сделал это правильно. И в том числе из-за этого остались непонятные моменты. Делаю так:
Код:
#include <ESP8266WiFi.h>                                                    // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>

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

int count_ssid = sizeof(array_ssid) / sizeof(array_ssid[0]);                // Размер массива ссидов
String LocalIP = "";                                                        // Пока что использую глобальную переменную для айпишника
unsigned long timing;                                                       // Переменная для хранения точки отсчета

// Функция скарирования и подключения к найденной известной сети из нашего списка, другие будут игнорится
void connect_to_wifi(int networksFound) {                                    //
  Serial.println("run connekt");                                            // Проверка запустилась ли функция
  if (WiFi.status() != WL_CONNECTED) {                                      // Проверяем, есть ли вообще подключение, если нет, то в следующей строке запускаем сканирование
  for (int i = 0; i < networksFound; i++) {                                 // Перебираем полученные точки доступа
    for (int j = 0; j < count_ssid; j++) {                                  // Перебираем в нашем списке точек доступа и проверяем условия
        if (WiFi.status() == WL_CONNECTED) {                                // Сперва проверяем, если все же есть подключение, то выходим из цикла. Нужно для проверки при разрывах
        break;
        }
        else if (WiFi.SSID(i) == array_ssid[j]) {                           // Если нет подключения, то сравниваем с нашим списком
        Serial.println("\nOne of our ssid was detected = " + WiFi.SSID(i));
//        char* ssid = array_ssid[j];                                         //  поместил тут объявление переменных для подключения, потому что в глобальных не вижу смысла
//        char* pass = array_pass[j];                                       // И вообще, они оказались не нужны
        WiFi.begin(array_ssid[j], array_pass[j]);                           // Стартуем подключение к точке доступа
        while (WiFi.status() != WL_CONNECTED) {                             // Зупускаем ожидание поднятия вайфай сервера
        arrest_time(1000);
        Serial.println("waiting...");
        }
        LocalIP = WiFi.localIP().toString();
        Serial.println(WiFi.localIP());                                      // Распечатываем полученный айпишник
      }
    }
  }
    if (WiFi.status() != WL_CONNECTED) {                                      // Доп. роверка и отчет, если нет точек из нашего списка
      Serial.println("\nNo famous among the detected wifi");
    }
  }
//  return LocalIP;
}

void setup() {
  WiFi.persistent(false);
  Serial.begin(9600);
  WiFi.mode(WIFI_OFF);                                                        // Останавливаем вайфай
  arrest_time(1000);
  WiFi.mode(WIFI_STA);                                                        // Запускаем вайфай в режиме клиента
  Serial.println("\nOur mac = " + WiFi.macAddress());                         // Выводим мак адрес
 
  connect_to_wifi(WiFi.scanNetworks());                                       // Стартуем в цикле функцию сканирования сети и поиска нужной сети
 
  Serial.println("IP = "+LocalIP);                                           // Распечатываем полученный айпишник
}

void loop() {
  connect_to_wifi(WiFi.scanNetworks());                                       // Стартуем в цикле функцию сканирования сети и поиска нужной сети
  arrest_time(5000);
  Serial.println("new");                                                     // Типа контроль
}

void arrest_time(int t) {                                                   // Вместо t подставьте нужное вам значение паузы
 if (millis() - timing > t){
  timing = millis();
  Serial.println (String(t)+" miliseconds");
 }
}
Пока остались проблемы:
1. Слишком много и часто пишет в порт при попытке подключения, типа ждет ("waiting..."). Когда использовал delay, писало реже. А теперь по времени занимает столько же, но отчет гораздо больше.
2. Пока не сделал передачу ссида и пароля парой. Не могу придумать, как использовать многоуровневый массив.
3. Пока не придумал, как сохранить не используя глобальные переменные или позже, так сказать динамично, получить айпишник платы
 
1)В чем смысл? Пока нет Wifi, как правило, все равно остальной код не выполняется.
2)Опять те же грабли с типом переменных. millis(),timing и int t
3)while() по сути это тот же delay, поэтому - см. п. 1
1. Ищу "универсальное" решение. Возможно будет какой-то датчик и реле. Пар, повысилась влажность, сработала релешка даже без вайфая и отчета на сервер. А появилась связь, так и передались данные и проверилось заново состояние, а при необходимости послалась какая-то команда
2. У меня есть подозрения, что что-то не так сделал, но пока не уверен и не знаю как надо.
3. А while() не совсем уже и делей. While работает по событию, а делей по времени, и к тому же во время делея плата вообще ничего не делает, в то время как while можно пробовать настроить на всякие проверки состояния, тоесть какая-то активность платы предполагается.
 

CodeNameHawk

Moderator
Команда форума
1. Слишком много и часто пишет в порт при попытке подключения, типа ждет ("waiting..."). Когда использовал delay, писало реже. А теперь по времени занимает столько же, но отчет гораздо больше.
Разве не вы программу пишете?
Установите нравящиеся вам интервалы.
Кстати, хотите сказать, что тут нужно по другому milis() оформить?
Что значит оформить? Оформление на код не влияет, а вот алгоритм стоит придумать заранее.
Просто найдите, какого типа она выдаёт данные.
Подумайте, как поведет ваша программа, если при сканировании сеть видна, а подключиться к ней не получилось.
Эта ситуация довольно реальна.
 
Сверху Снизу