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

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

А что мешает объявить глобальную переменную типа IPAddress а потом в любом месте кода в нее записать WiFi.localIP() ?
И тут ещё проблема для меня в другом. Даже если я объявляю глобальную переменную стринг, то получить в вашем варианте у меня получается только в loop, а хотелось бы в сетапе.
И ещё:
Что за синтаксис такой? Где почитать?
 

EvgeniyS

Member
Что за синтаксис такой? Где почитать?
Судя по вашим вопросам, я бы советовал почитать что-нибудь по программированию на С++, чтобы понимать синтаксис и возможности языка хотя бы на базовом уровне.
while (--tries){какой-то код} это простая конструкция "--" оператор декремента, в данном случае префиксный, tries - обычная переменная целочисленного типа. Перед каждым циклом tries уменьшается на 1 по достижении 0 циклы завершаются.
 
это простая конструкция "--" оператор декремента
Кстати, сперва не внимательно прочитал справочник по языку Ардуино. Оказывается там такое есть. Но вот такого типа данных как IPAddress пока не нашел.
И относительно вашей рекомендации и рекомендации CodeNameHawk почитать по С++. Так понимаю, что нужно начинать с С? Вот только не могу найти на мой взгляд нормально построенные онлайн справочники. По Ардуино ещё более менее, но там примеров мало. Напр, по PHP есть такой ресурс: https://www.php.net/manual/ru/langref.php Очень хорошо структурированный, много пояснений, примеров, в том числе и от пользователей. Есть аналогичные по пайтону, автоиту, джаваскрипту. Даже для Ардуино есть хороший, хоть и не большой справочник. Да ещё на вики статьи. К сожалению по Си подобного найти не могу. А как я понял, он должен быть шире, чем ардуиновский.
Напр, https://docs.microsoft.com/ru-ru/cpp/c-language/?view=msvc-170 написана очень отрывисто, напоминает скорее напоминалку/шпаргалку для профи, который некторое время не занимался программированием, а сейчас нужно быстро вспомнить язык. Тоетсь многие вещи не объясняются.
http://cppstudio.com/cat/274/ более подробная, но не многим ушла. Начал читать и там есть такие места, которые "отсылают" друг на друга, типа замкнутого круга. И не только такие парадоксы.
И так ещё несколкьо ресурсов. При этом, как я понимаю, официальный справочник именно от майкрософта, тоесть мой первый пример.
 
это простая конструкция "--" оператор декремента
Кстати, оказалось, что это только непривычный способ записи. Обычно ведь пишут x++ или x--, а не --x. Потому и "напугался", не узнал )))
Но все же никак не могу получить вашу переменную IPAddress в вашем варианте в сетапе. Подскажите вариант?
 

CodeNameHawk

Moderator
Команда форума
стати, оказалось, что это только непривычный способ записи. Обычно ведь пишут x++ или x--, а не --x. Потому и "напугался", не узнал )))
Похоже, что опять пытаетесь понять суть по заголовкам.
x-- это не тоже самое, что --x, только в некоторых случаях, результат получите одинаковый.
Ищите пре и постинкремент.
 
Последнее редактирование:

EvgeniyS

Member
Но все же никак не могу получить вашу переменную IPAddress в вашем варианте в сетапе. Подскажите вариант?
Если вы внимательно посмотрите мой код в setup, то увидите что там нет подключения оно происходит в loop, пока ESP не подключилась к роутеру какой может быть ip adress?
 
Если вы внимательно посмотрите мой код в setup, то увидите что там нет подключения оно происходит в loop, пока ESP не подключилась к роутеру какой может быть ip adress?
Так я о том же и говорю. Если в loop, то все получиться. Но если мне нужно именно в сетапе?
 
Похоже, что опять пытаетесь понять суть по заголовкам.
x-- это не тоже самое, что --x, только в некоторых случаях, результат получите одинаковый.
Ищите пре и постинкремент.
Ну да, пока только предварительно посмотрел. На более внимательное прочтение пока что времени нет. Потому и задавал вопрос из двух частей: где почитать и что такое.
 

EvgeniyS

Member
Так я о том же и говорю. Если в loop, то все получиться. Но если мне нужно именно в сетапе?
Ума не приложу, зачем вам это надо, но можно как-то так:
C++:
void setup(void) {
  WiFi.persistent(false);
  Serial.begin(115200);
  Serial.printf("\nOur mac = %s\n",WiFi.macAddress().c_str());
  WiFi.mode(WIFI_STA);
  WiFi.scanNetworksAsync(searchTargetNet);
for (;;){
  if(netIndex >= 0) {
    if(tryToConnect()){
      netIndex = -1;
      break;
    }
  }
  delay(50);
}
 Serial.println(WiFi.localIP());
}
 
А как можно заменить два массива (ссиды и пароли) на один, где эти данные парами?
 
Ума не приложу, зачем вам это надо, но можно как-то так:
C++:
void setup(void) {
  WiFi.persistent(false);
  Serial.begin(115200);
  Serial.printf("\nOur mac = %s\n",WiFi.macAddress().c_str());
  WiFi.mode(WIFI_STA);
  WiFi.scanNetworksAsync(searchTargetNet);
for (;;){
  if(netIndex >= 0) {
    if(tryToConnect()){
      netIndex = -1;
      break;
    }
  }
  delay(50);
}
Serial.println(WiFi.localIP());
}
Кстати, в таком виде перестало искать точки доступа, если изначально нужные нам, тоесть те что в списке, не были включены. Останавливается на отчете типа:
Код:
Networks found: 5
Not found target net
 

EvgeniyS

Member
Имелась ввиду моя функция arrest_time(). Но я уже понял, что она работает не так, как мне надо. Сделал пока без функции
А как можно заменить два массива (ссиды и пароли) на один, где эти данные парами?
C++:
#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]
Немного переписал код :)
 
wifiData[] = {"ssid1", "pass1", "ssid2", "pass2","ssid3", "pass3","ssid4", "pass4"};
Ого, вы тут на классы (в смысле ООП) перешли...
Вот эту строчку не понял. Не силен в классах, тем более в Си многие вещи выглядят непривычно. Вообще похоже на одномерный массив. Так понимаю, что нужно почитать про структуры? (
struct { const char* ssid; const char* pass; }
)
Или как это правильно читается? И это стандартная конструкция? В смысле название (struct) не из головы?
 
Сверху Снизу