• Система автоматизации с открытым исходным кодом на базе 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 хорошее питание и танталовый конденсатор на ногах питания часто помогает от глюков и зависания.
 
Сверху Снизу