• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP8266-01 не подключается к точкам доступа

Pineleman

New member
Добрый день) Написал код, который должен подключать esp-шку к 3-ем точкам доступа (AP1, AP2, AP3) и выводить их RSSI (уровень мощности сигнала). Принцип действия таков, что при успешном подключении к 1-ой точке, она выводит ее название и RSSI на "монитор порта". Если же она не смогла подключиться к ней, то она пробует сделать это со 2-ой точкой и вывести на экран тоже самое, и т.д. Ну, а если ни к одной не смогла подключиться, то выводит сообщение "no AP". Сам код:
Код:
#include "ESP8266WiFi.h"

const char* ssid1 = "AP1";
const char* ssid2 = "AP2";
const char* ssid3 = "AP3";

const char* pass1 = "qwerty1234567890";
const char* pass2 = "qwerty1234567890";
const char* pass3 = "qwerty1234567890";

long rssi = WiFi.RSSI();

void setup()
{
Serial.begin(9600);
WiFi.mode(WIFI_STA);
}

void loop()
{
WiFi.begin(ssid1,pass1);
if (WiFi.status() == WL_CONNECTED)
{
Serial.print(" AP1 ");
  Serial.print("RSSI:");
  Serial.println(rssi);
//WiFi.disconnect();
      delay(1000);
}
else if (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(ssid2, pass2);
Serial.print(" AP2 ");
  Serial.print("RSSI:");
  Serial.println(rssi);
   //WiFi.disconnect();
      delay(1000);
}
else if (WiFi.status() != WL_CONNECTED)
{
    WiFi.begin(ssid3, pass3);
    Serial.print(" AP3 ");
  Serial.print("RSSI:");
  Serial.println(rssi);
  //WiFi.disconnect();
delay(1000);
}
else
{
  Serial.println(" no AP");
    delay(1000);
}
}
Но почему-то, она пишет, что подключилась к AP2 и что RSSI = 31, хотя на телефоне создана AP1. Если моих работающих точек нет совсем, то он все равно продолжает писать тоже самое. Пример:
Код:
AP2 RSSI:31
AP2 RSSI:31
AP2 RSSI:31
AP2 RSSI:31
AP2 RSSI:31
AP2 RSSI:31
AP2 RSSI:31
В чем может быть проблема?
 

Scorpio

New member
rssi = WiFi.RSSI(); в вашем случае надо обновлять после каждого подключения к АР. У вас это глобальная переменная, инициализированная один раз, поэтому естественно не меняется. Но для замера уровня сигнала, не обязательно подключаться к АР можно просканировать сеть
Код:
int n = WiFi.scanNetworks();
if(n>0)
{
    for (int i = 0; i < n; i++)
    {
        Serial.print("AP ");
        Serial.print(WiFi.SSID(i));
        Serial.print(" - ");
        Serial.print(WiFi.RSSI(i));
        Serial.println("dB");
    }
}
как то так
 

CodeNameHawk

Moderator
Команда форума
Дайте времени, чтобы соединение произошло, хотя бы так:
Код:
WiFi.begin(ssid1,pass1);
delay(5000);
if (WiFi.status() == WL_CONNECTED)
 

Pineleman

New member
rssi = WiFi.RSSI(); в вашем случае надо обновлять после каждого подключения к АР. У вас это глобальная переменная, инициализированная один раз, поэтому естественно не меняется. Но для замера уровня сигнала, не обязательно подключаться к АР можно просканировать сеть
Код:
int n = WiFi.scanNetworks();
if(n>0)
{
    for (int i = 0; i < n; i++)
    {
        Serial.print("AP ");
        Serial.print(WiFi.SSID(i));
        Serial.print(" - ");
        Serial.print(WiFi.RSSI(i));
        Serial.println("dB");
    }
}
как то так
Так-с, я по началу так и делал, и все прекрасно работало)
Я пытаюсь понять, в чем проблема в моем коде)
 
Последнее редактирование:

Scorpio

New member
Первую проблему указал я, а вторую CodeName... К первой АР, подключиться просто не успевает. Хотя использовать delay(5000) не совсем правильно. Дело в том, что во время длинной delay(), ESP делает свои дела. В частности пробует в фоновом режиме подключиться к АР, к которой удалось подключиться в последний раз. Параметры этой АР автоматически сохраняются в EEPROM. Классическое ожидание подключение организуется как-то так:
Код:
bool WiFiConnect()
{

  if (WiFi.status() != WL_CONNECTED)
  {
    WiFi.mode(WIFI_STA);
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, pass);
    int count=100;
    while (WiFi.status() != WL_CONNECTED)
    {
      count--;
      if(!count)
      {
        Serial.println("WiFi connection problem!");
        return false;
      }
      Serial.print(".");
      delay(500);
      }
  Serial.println();
  Serial.print("Connected: ");
  Serial.println(WiFi.localIP());
   }
   return true;
}
 
надо обновлять после каждого подключения к АР
Хочу вывести значение rssi на экранчик олед вместе с часами, которые обновляются каждую секунду
void vremya(void) {
long rssi = WiFi.RSSI();
RTC.readTime();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("WiFi ");
display.print(rssi);
display.print(" dB ");
display.print(RTC.h);
display.print(":");
display.print(RTC.m);
display.print(":");
display.println(RTC.s);
display.display();
delay(1000);
}
насколько сильно такой опрос значения rssi каждую секунду будет загружать есп32 и вообще всю сеть wifi?
 

CodeNameHawk

Moderator
Команда форума
Хочу вывести значение rssi
RSSI (Received Signal Strength Indication) это показатель силы принимаемого сигнала.
Scan Class — ESP8266 Arduino Core 2.4.0 documentation
Его получают сканируя эфир вокруг, а не так, как вы думаете, что сама точка знает силу своего сигнала.

насколько сильно такой опрос значения rssi каждую секунду
Сканирование занимает больше секунды...
 
Еспшка будет стоять через пару кирпичных стен и бетонное перекрытие, замерял телефоном сигнал от роутера - от -77 до -81 там куда хочу поставить, вот и хотел выбрать место получше именно ей, плюс видно сразу есть коннект или нет. Но что то вчера глюки какие то пошли, виснет через минуту две. Вернул код назад, бестолку.
 

Сергей_Ф

Moderator
Команда форума
@kochetovvin хорошее питание и танталовый конденсатор на ногах питания часто помогает от глюков и зависания.
 
Сверху Снизу