Esp8266 уровень сигнала wifi

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question: Is there a way to get the Wifi signal strength ? #132

Question: Is there a way to get the Wifi signal strength ? #132

Comments

In order to be able to diagnose connection problem I was wondering if it was possible to get the signal strength via the WiFi API.
I realise this is not available as part of the standard arduino lib, but GSM has something equivalent

The text was updated successfully, but these errors were encountered:

Does anyone know the method for this?

I’m intending to have a ‘connected’ LED and it would be very useful to have
an indication of signal strength to accompany that.

On 29 April 2015 at 16:15, linagee notifications@github.com wrote:

Yes you can. You can do almost anything with this chip if you dive into
their closed source libs. 🙂 (Its doing almost everything entirely in
software.) I don’t think you’d even need to go that far though. There
appears to be some way that passive mode and the wifi scan are able to grab
the RSSI. (You could probably even just use passive mode and only look at
AP packets.)


Reply to this email directly or view it on GitHub
#132 (comment).

As far as I know, there is currently no way in the Espressif SDK to retrieve the RSSI to the current connected AP. But as @linagee pointed out, it is possible looking at the sources to get the RSSI after a wifi scan, here is a working example:

#include Arduino.h> #include ESP8266WiFi.h> const char* SSID = "YOUR_SSID"; // Return RSSI or 0 if target SSID not found int32_t getRSSI(const char* target_ssid) < byte available_networks = WiFi.scanNetworks(); for (int network = 0; network < available_networks; network++) < if (strcmp(WiFi.SSID(network), target_ssid) == 0) < return WiFi.RSSI(network); > > return 0; > void setup() < Serial.begin(115200); > void loop() < unsigned long before = millis(); int32_t rssi = getRSSI(SSID); unsigned long after = millis(); Serial.print("Signal strength: "); Serial.print(rssi); Serial.println("dBm"); Serial.print("Took "); Serial.print(after - before); Serial.println("ms"); delay(1000); >
Signal strength: -60dBm Took 2133ms Signal strength: -57dBm Took 2133ms Signal strength: -57dBm Took 2128ms Signal strength: -58dBm Took 2132ms Signal strength: -62dBm Took 2132ms Signal strength: -57dBm Took 2132ms 

This is far from clean and ideal, as:

  • It is not very bulletproof as it filters the networks by SSID, impossible to do now by mac address
  • It is blocking for around 2 sec, the time to do a wifi scan, which is a huge caveat for a single threaded system

Источник

Получаем уровень связи WiFi модуля ESP8266

Использовать плату, на которой совмещены UNO R3 + WiFi Esp8266, показалось очень удобным способом.

В предыдущей статье добились, чтобы совмещенная плата Arduino UNO с WiFi посылала POST при помощи AT-команд, без использования библиотеки WiFiEsp.

Теперь найдем способ получать уровень сигнала RSSI WiFi точки доступа, к которой подсоединен модуль ESP8266 платы.

Стоимость будет аналогичная.

Но, если стоимость отдельных устройств 214+100=314р, то стоимость совмещенной платы будет 460р.

Считаю, что разницу в 132р можно и доплатить за удобство.

Для работы WiFi модуля с Arduino предлагается использовать библиотеку WiFiESP, для чего необходимо было бы обновить прошивку.

Но зачем это делать и зачем использовать лишний код библиотеки, если имеется совсем тривиальная задача просто отсылать значения датчиков на сервер?

Но иногда может быть необходимо изучить результат работы

Как обработать результат выполнения AT команды ESP8266.

Все в той же предыдущей статье было необходимо убедиться, что POST запрос к серверу с показаниями датчиков отправлен.

Для этого искали в ответе признак успешности передачи при помощи функции Serial.find():

readReplay = «OK»; if (Serial.find(readReplay))

Для получения из ESP8266 сведений о доступных ей WiFi сетях служит команда AT+CWLAP, которая возвращает перечень сетей с дополнительной информацией о них:

Отсюда и можно получить RSSI.

В списке доступных сетей может быть несколько сетей и нам нужно осуществить селекцию по нужному имени WiFi сети текущего соединения.

В библиотеке WiFiESP для получения RSSI сети, к которой подключен ESP8266, использовалась функция WiFi.RSSI().

Как это реализовано для парсинга Serial с целью получения RSSI текущего соединения можно посмотреть в процедуре EspDrv::getCurrentRSSI() файла EspDrv.cpp:

int32_t EspDrv::getCurrentRSSI() < int ret=0; char buf[10]; sendCmdGet(F("AT+CWJAP?"), F(",-"), F("\r\n"), buf, sizeof(buf)); if (isDigit(buf[0])) < ret = -atoi(buf); >return ret; >

Парсинг Serial осуществляет функция sendCmdGet(), реализованная в том же файле.

Это универсальная функция, основанная на библиотеке RingBuffer.h, и можно было бы вычленить из файла EspDrv.cpp нужный функционал.

Но в моем случае задача значительно упрощается.

Ответ ESP8266 на команду AT+CWLAP вот такой:

Поэтому, достаточно найти в Serial последовательность «38», пропустить два символа, и взять три символа в которых будет содержаться RSSI.

Вот какой кусок кода это делает:

// получим и отобразим уровень сигнала // код рабочий для очень частного случая // String curRSSI; объявлено ранее // на Serial в совмещенной плате UNO + ESP8266 сидит ESP8266. void getRSSI() < char c1; char c2; curRSSI = ""; Serial.println("AT+CWLAP"); if (Serial.available()) < delay(100); while (Serial.available() >0) < c1 = (char)Serial.read(); c2 = (char)Serial.read(); if ((c1=='3') and (c2=='8')) < c1 = (char)Serial.read(); // пропускаем два значения c2 = (char)Serial.read(); for(int i=0; ilcd.setCursor(5, 0); lcd.print(curRSSI); break; > > > >

Код работает не всегда и не на всех платах.

Проблемы в строке if ((c1==’3′) and (c2==’8′))

Вместо 8 у нас что-то непонятное.

Поэтому придумаем другой код для чтения RSSI:

// глобальные переменные объявлены ранее: // String curRSSI="0"; // int crssi=0; // String ssid ="Keenetic-0138"; void getRSSI() < char c1; String val; int i; curRSSI = ""; Serial.println("AT+CWLAP=\"" + ssid + "\""); delay(1500); if (Serial.available()) < delay(500); while (Serial.available() >0) < for (i=0; (i<27); i++) < c1 = (char)Serial.read(); delay(2); >for (i=0; (i <2); i++) < c1 = (char)Serial.read(); val += c1; delay(2); >> crssi = val.toInt(); if (crssi) < curRSSI = val; lcd.setCursor(5, 0); lcd.print(-crssi); >> >

С эти кодом тоже не всегда все гладко.

Через раз вместо ожидаемого

в Serial находится еще и сама команда.

Придется все таки поместить весь ответ в переменную String и затем взять подстроку после имени сети.

void getRSSI() < char c1; String val = ""; int i; curRSSI = ""; Serial.print("AT+CWLAP=\"" + ssid + "\"\r\n"); delay(500); if (Serial.available()) < while (Serial.available() >0) < c1 = (char)Serial.read(); val = val + c1; delay(2); >int pos = val.indexOf(ssid); pos = pos+ssid.length()+3; curRSSI = val.substring(pos, pos+2); // Serial.println(curRSSI); crssi = curRSSI.toInt(); if (crssi) < lcd.setCursor(5, 0); lcd.print(-crssi); >> >

Этот код уже работает без проблем.

Источник

ESP-8266 и уровень сигнала: выбор типа антенны

За прошедший с момента своего появления год ESP-8266 мутировал из аскетичной ревизии 01 в многоногих монстров вроде ESP-201 или NodeMCU board, способных существенно подвинуть младшие Ардуины из сегмента “меряю температуру, мигаю светодиодом”, выдавая бесплатным бонусом полноценный WI-FI. Собственно, в качестве этого самого Wi-Fi у разных ревизий платы я и предлагаю разобраться.

Идея этого теста появилась как следствие ошибки проектировщика: тщательно продуманный, собранный и отлаженный блок управления насосной станцией, будучи установленным на свое место работы — в ванную комнату, банально не видел сигнала домашнего роутера.

Вволю поупражнявшись в жонглировании слаболитературными оборотами сел гуглить, у кого из плат семейства ESP-8266 сигнал получше, но, вопреки ожиданиям, среди тонн статей и рулонов форумов этой информации найти не удалось. Посему решил восполнить этот пробел: стараниями дядюшки Ляо разжился четырьмя разными ревизиями платы с разными типами антенн, которые и будут участвовать в тестах уровня сигнала.

Давайте для начала разберемся, какие типы антенн ставят на платы с чипом 8266. Их всего три варианта:

  1. PCB (Printed Circuit Board) — антенна, “распечатанная” на самой плате. Присутствует в моделях ESP-01, ESP-12, ESP-13(и ее клоне wroom 2), ESP-201, а также на плате NodeMCU.
  2. Керамическая. По сути — проводник, запеченный внутри керамического корпуса. За счет большей диэлектрической проницаемости керамики удается сделать такие антенны более компактными. Такие антенны присутствуют на платах ESP-03, ESP-07 и ESP-11.
  3. Антенна отсутствует. В лучшем случае стоит разъем IPX. Если нет — придется подпаиваться к выводам.

ESP-01 — печатная антенна.
ESP-201 — печатная, плюс IPX-разъем под внешнюю.
ESP-07 — керамическая, плюс IPX-разъем под внешнюю.
ESP-12 — печатная

Эта плата вообще кладезь “нетрадиционно-ориентированных” инженерных и дизайнерских решений. Вот и выбор антенны реализован весьма необычно: для переключения между встроенной и внешней антеннами необходимо всего лишь перепаять SMD-резистор, выполняющий роль перемычки. По умолчанию “включена” внешняя антенна.

Еще один момент, на который стоит обратить внимание: на ESP-201 некоторых серий IPX-разъем был припаян в обратной полярности — центральным контактом на землю. Если внешняя антенна работает совсем уж плохо — стоит проверить.

Дополнительно был проведен тест внешних антенн (ссылки далее я даю только для идентификации антенн, а не в качестве рекомендации магазина или торговой площадки):

— Проводок, что идет в комплекте с ESP-201. Вид не предвещает ничего хорошего. Хочу понять, даст ли он хоть какой-то выигрыш в сравнении с встроенными антеннами.
— Китайская антенна за $1. Обычная антенна, скорее всего стоящая в большинстве дешевых роутеров.
— Антенна Banana Pi. Шла в комплекте с компьютером, но и отдельно продается.

Интересно, стоит ли ее использовать по назначению или лучше сразу заменить.

Upd: Чуть позже провел экспресс-тест с антенной от роутера Asus rt-n13, результаты вышли немного хуже, чем с антенной №2. В таблице тест не отражен, т.к. было невозможно точно воспроизвести условия.

Тест проводился на улице, в сельской местности, иных Wi-Fi сетей в радиусе обнаружения небыло. Для измерения уровня сигнала был использован смартфон с программой WIFI Analyzer, поэтому результаты относительны.

Вот что показали замеры (dBm):

Плата 25м 50м
Встроеные антенны
ESP-01 (печатная) -51 -67 -84
ESP-07 (керамическая) -55 -75 -82
ESP-12 (печатная) -63 -84 -85
ESP-201 (печатная) -66 -93
Внешние антенны
ESP-07(Антенна №1) -62 -74 -81
ESP-07(Антенна №2) -52 -66 -74
ESP-07(Антенна №3) -49 -58 -67
ESP-201 (Антенна №1) -69 -76 -88
ESP-201 (Антенна №2) -59 -71 -88
ESP-201 (Антенна №3) -44 -67 -80

Выводы:

  • Антенны типа “мышиный хвост” в данном случае не имеют существенных преимуществ перед встроенными. Единственное, когда их применение оправдано — экранирующий корпус устройства и требования к минимизации веса/размера.
  • Керамическая антенна при своей компактности обладает несколько лучшими характеристиками, нежели протестированные печатные.
  • Печатная антенна вполне годна к применению в рабочих устройствах на базе 8266, при условии, что она нормально согласована с платой ( мой положительный опыт: ESP-01, ESP-12; отрицательный — ESP-201), однако немного уступает керамической. В силу специфики PCB допускаю, что в одной серии могут найтись платы, существенно отличающиеся по чувствительности антенны. Также данный вид антенны не рекомендован в условиях повышенной влажности (текстолит гигроскопичен, характеристики антенны могут поплыть)
  • ESP-201 со всеми видами антенн проигрывает остальным платам, что, вкупе с остальными ее недостатками, позволяет рекомендовать ее исключительно для экспериментов/прототипирования.

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

A WiFi signal strength tracker sketch for ESP8266 based devices

License

qubitstream/ESP8266_WiFi_Signal_Strength

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

ESP8266 WiFi Signal Strength

This is a sketch for checking the signal strength of a WiFi network. Both the current signal and the average strength for an adjustable timespan are displayed.

Breadboard description

  • an ESP8266 based microcontroller (it has been tested on a WeMos D1 Mini, but a NodeMCU or similar devices should work fine as well)
  • an SSD1306 based, 128×32 pixel I2C OLED display (it should be easy to adjust for a SPI based displays or other resolutions)
  • a simple potentiometer

Change the WiFi credentials in wifi_credentials.h to the appropriate values.

GNU General Public License, Version 2

Источник

Читайте также:  Wifi люди от ростелеком
Оцените статью
Adblock
detector