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