Scanning Networks with Arduino UNO WiFi Rev2
Learn how to setup your board to scan nearby Wi-Fi networks, and print them out in the Serial Monitor.
Introduction
One great feature with the Arduino UNO WiFi Rev2 is the possibility to scan nearby Wi-Fi networks. This is done using the NINA-W102 radio module, and in this tutorial, we will go through some simple steps to get this working!
Goals
The goals of this project are:
- Scan surrounding networks.
- Print available networks in the Serial Monitor.
- Print additional information about these networks.
Hardware & Software Needed
Scanning Networks
Scanning for Wi-Fi networks is a quite straightforward process. A device with a Wi-Fi module such as smart-phones, computers or development boards such as the Arduino UNO WiFi Rev2, search their surroundings, and get a response from nearby networks.
The device looking for a network or the client, sends a probe request, while nearby networks send probe responses. These responses contains information such as name of the network, signal strength in dBm (decibel milli-watts) and encryption type.
Circuit
This tutorial requires no additional circuit.
Programming the Board
- First we need to make sure we have the dependencies installed. For this tutorial, we will need to install the WiFiNINA library. If we are using the offline editor, we can locate this library in Tools > Manage Libraries. . If we are using the Web Editor, it is already installed.
- If we are using the offline editor, we need to make sure we have the drivers installed for the Arduino UNO WiFi Rev2 board. In the editor, navigate to Tools > Board > Board Manager. , and install the Arduino avrMEGA Boards core.
- Now let’s take a look at some of the core functionalities of the sketch that we will use.
- We can now upload the code that can be found in the snippet below to our Arduino UNO WiFi Rev2 board.
1#include 2 #include 3 4 void setup() 5 //Initialize serial and wait for port to open: 6 Serial.begin(9600); 7 while (!Serial) 8 ; // wait for serial port to connect. Needed for native USB port only 9 > 10 11 // check for the WiFi module: 12 if (WiFi.status() == WL_NO_MODULE) 13 Serial.println("Communication with WiFi module failed!"); 14 // don't continue 15 while (true); 16 > 17 18 String fv = WiFi.firmwareVersion(); 19 if (fv WIFI_FIRMWARE_LATEST_VERSION) 20 Serial.println("Please upgrade the firmware"); 21 > 22 23 // print your MAC address: 24 byte mac[6]; 25 WiFi.macAddress(mac); 26 Serial.print("MAC: "); 27 printMacAddress(mac); 28 > 29 30 void loop() 31 // scan for existing networks: 32 Serial.println("Scanning available networks. "); 33 listNetworks(); 34 delay(10000); 35 > 36 37 void listNetworks() 38 // scan for nearby networks: 39 Serial.println("** Scan Networks **"); 40 int numSsid = WiFi.scanNetworks(); 41 if (numSsid == -1) 42 Serial.println("Couldn't get a wifi connection"); 43 while (true); 44 > 45 46 // print the list of networks seen: 47 Serial.print("number of available networks:"); 48 Serial.println(numSsid); 49 50 // print the network number and name for each network found: 51 for (int thisNet = 0; thisNet numSsid; thisNet++) 52 Serial.print(thisNet); 53 Serial.print(") "); 54 Serial.print(WiFi.SSID(thisNet)); 55 Serial.print("\tSignal: "); 56 Serial.print(WiFi.RSSI(thisNet)); 57 Serial.print(" dBm"); 58 Serial.print("\tEncryption: "); 59 printEncryptionType(WiFi.encryptionType(thisNet)); 60 > 61 > 62 63 void printEncryptionType(int thisType) 64 // read the encryption type and print out the title: 65 switch (thisType) 66 case ENC_TYPE_WEP: 67 Serial.println("WEP"); 68 break; 69 case ENC_TYPE_TKIP: 70 Serial.println("WPA"); 71 break; 72 case ENC_TYPE_CCMP: 73 Serial.println("WPA2"); 74 break; 75 case ENC_TYPE_NONE: 76 Serial.println("None"); 77 break; 78 case ENC_TYPE_AUTO: 79 Serial.println("Auto"); 80 break; 81 case ENC_TYPE_UNKNOWN: 82 default: 83 Serial.println("Unknown"); 84 break; 85 > 86 > 87 88 void printMacAddress(byte mac[]) 89 for (int i = 5; i >= 0; i--) 90 if (mac[i] 16) 91 Serial.print("0"); 92 > 93 Serial.print(mac[i], HEX); 94 if (i > 0) 95 Serial.print(":"); 96 > 97 > 98 Serial.println(); 99 >
Testing It Out
After we have uploaded the code to the board, we will need to open the Serial Monitor. When we open it, we will first see the MAC address of our board printed, followed by the text
"Scanning available networks"
After 10 seconds of scanning, the available networks will be listed, along with information about the network.
If we look closer at #1 in the list, we can see that the signal is -38 dBm. When this test was done, the board was only a meter away from the router, so the signal strength is great.
But if we look at the other networks, we can see that the signal goes all the way down to -94 dBm, which is very weak. If we tried to connect a computer to this network, it would most likely fail.
Troubleshoot
If the code is not working, there are some common issues we can troubleshoot:
- We have not installed the WiFiNINA library.
- We have not installed the drivers for the Arduino UNO WiFi Rev2.
- We have not selected the right port.
Conclusion
In this tutorial we have created a simple Wi-Fi scanner, that has printed all available networks within range of our Arduino UNO WiFi Rev2. This feature exists virtually in any device that can connect to the Internet, and can be quite a good tool to experiment with, for example how far our devices can be from a gateway (router) to work.
Arduino + ESP8266 с нуля на примере Wi-Fi термометра, часть первая
Зачем эта статья? На хабре уже есть ряд статей про использование ESP в разных конфигурациях, но почему-то без подробностей о том, как именно все подключается, прошивается и программируется. Типа «я взял ESP, две пальчиковые батарейки, DHT22, закинул в коробку, потряс часик и термометр готов!». В итоге, получается странно: те, кто уже работают с ESP не видят в сделанном ничего необычного, а те, кто хочет научиться — не понимают с чего начать. Поэтому, я решил написать подробную статью о том, как подключается и прошивается ESP, как его связать с Arduino и внешним миром и какие проблемы мне попадались на этом пути. Ссылки на Aliexpress привожу лишь для представления порядка цен и внешнего вида компонентов.
Итак, у меня было два микроконтроллера, семь разных сенсоров, пять источников питания, температурный датчик DHT22 и целое множество проводков всех сортов и расцветок, а так же бессчетное количество сопротивлений, конденсаторов и диодов. Не то, чтобы все это было необходимо для термометра, но если уж начал заниматься микроэлектроникой, то становится трудно остановиться.
Питание
Для работы ESP8266 нужно напряжение 3.3В и ток не ниже 300мА. К сожалению, Arduino Uno не в состоянии обеспечить такой ток, как не в состоянии обеспечить его и переходники USB-UART (программаторы) типа FT232RL — их предел около 50мА. А значит придется организовать отдельное питание. И лучше бы, чтобы Arduino тоже работал от 3.3В, чтобы избежать проблем типа «я подал пятивольтовый сигнал на вывод RX модуля ESP, почему пахнет паленой пластмассой?».
2. Купить готовый модуль с регулятором напряжения, понижающий 5В до 3.3В. Пожалуй, это самый удобный вариант.
3. Собрать модуль самому из регулятора AMS1117 и одного танталового конденсатора на 22мкФ.
Я выбрал третий пункт, поскольку мне часто нужно 3.3В, я жадный и я люблю встраивать регуляторы прямо в блоки питания.
С AMS1117 все просто: если положить его текстом вверх, то напряжение на ногах растет слева направо: 0(Gnd), 3.3В (Vout), 5В (Vin).
Между нулем и выходом нужен танталовый конденсатор на 22мкФ (так по инструкции, что будет если поставить электролитический — я не проверял). У танталового SMD-конденсатора плюс там, где полоска. Немного чудовищной пайки совершенно не предназначенных для такого варварства SMD-компонентов и:
Обязательно проверяйте выходное напряжение. Если оно значительно меньше 3.3В (например, 1.17В) — дайте регулятору остыть после пайки и проверьте контакты. Если поставите конденсатор больше, чем на 22мкФ, то мультиметр может показать более высокое напряжение.
Почему именно AMS1117? Он широко используется. Его вы можете найти почти везде, даже в Arduino Uno, как правило, стоит AMS1117-5.0.
Если вы знаете что-то схожих габаритов и цены, еще более простое в использовании — напишите, пожалуйста.
Важный момент. Не знаю уж почему, но AMS1117 крайне капризно относится к качеству соединений. Контакты должны быть надежны. Лучше — пропаяны. Иначе он на тестах выдает 3.3В, но под нагрузкой не выдает ничего.
Я выбрал модель 07, поскольку у нее отличный металлический экран, который работает как защита от наводок, механических воздействий и как радиатор. Последнее обеспечивает разницу между сгоревшим модулем и просто нагревшимся. Кроме того, есть гнездо под внешнюю антенну.
Чтобы чип запустился нужно соединить VCC и CH_P через резистор 10кОм. Если такого нет, то сгодится любой из диапазона 1-20кОм. Кроме того, конкретно модель 07 еще требует, чтобы GPIO15 (самый ближний к GND) был «на земле» (этого на картинке не видно, потому что соединение с другой стороны).
Теперь берем переходник USB-UART, переключаем его на 3.3В и подключаем RX к TX, TX к RX и GND к «земле» (у меня без этого передача нестабильна). Если вы не можете переключить на 3.3В, то можно использовать простейший резисторный делитель напряжения: соедините ESP RX с TX переходника через сопротивление в 1кОм, а ESP RX с «землей» через 2кОм. Существует масса более сложных и более надежных способов связать 3.3В и 5В, но в данном случае и так сойдет.
И соединяемся на скорости 9600 по нужному COM-порту (можно посмотреть в диспетчере устройств).
Я использую SecureCRT, Putty тоже подойдет, а ценители Линукса и так знают, что делать и где смотреть.
Если ничего не происходит — выключите — включите питание, если все равно ничего не происходит — проверьте соответствие TX/RX, попробуйте переставить их местами или припаять к чипу.
Иногда чип в ходе издевательств экспериментов зависает и тогда его надо обесточить, в том числе отключив и переходник (например, вытащив его из USB), поскольку чипу хватает даже поступающих крох питания, чтобы упорно тупить и не работать.
Иногда фокусы с переходником вешают USB-порт. Можно в качестве временного решения использовать другой USB-порт, но вообще лучше перезагрузить компьютер.
Иногда при этом меняется номер COM-порта. Под Linux это можно решить с помощью udev.
Если вместо текста приходит мусор, то проверьте настройки скорости. Некоторые старые чипы работают на 115200.
На старте чип нагревается, но если он реально горячий и продолжает греться — отключайте и проверяйте все соединения. Чтобы на корпус не попадало +3.3В, чтобы 5В к нему вообще никуда не приходили, чтобы «земля» переходника была соединена с «землей» чипа. Модели с металлическим экраном очень трудно сжечь (но нет ничего невозможного), а на модели без экранов жалуются, мол даже небольшая ошибка может стать последней в жизни чипа. Но это я не проверял.
Мой выбор — NodeMCU. У нее проблемы с памятью и поддержкой железа, но это многократно окупается простотой кода и легкостью отладки.
Так же потребуются NodeMCU flasher и LuaLoader (последнее — опционально, есть и другие клиенты для работы с этой прошивкой).
Выключаем чип. Подсоединяем GPIO0 к земле и включаем чип:
Если ничего не происходит и поля AP MAC/STA MAC пустые — проверьте еще раз, чтобы GPIO0 был на «земле».
Если прошивка началась, но зависла — посмотрите в закладке Log, у меня почему-то конкретно этот чип отказался прошиваться на FT232RL, но зато без проблем прошился на PL2303HX на скорости 576000. PL2303HX в указанном варианте не имеет переключения на 3.3В, чтобы им воспользоваться нужно открыть пластиковый корпус и перепаять провод с 5V на 3.3V, есть варианты с пятью выходами: 3.3, 5, TX, RX, Gnd.
Обратите внимание: STA MAC поменялся. Подозреваю, что flasher его неправильно показывал, но требуется проверка.
Для экономии сил и нервов можно взять готовый или полуготовый вариант.
Есть одноразовые адаптеры с удобной разводкой.
Есть готовые к прошивке.
Есть варианты с простенькие кит-комплекты и посложнее — ESP8266-EVB
Есть с готовым USB-адаптером — NodeMCU Development Board. Под нее даже какие-то шилды делают.
Если же вы, как и я, не слишком любите готовые решения, то рекомендую всего брать с запасом, потому что опыт, как говорят, прямо пропорционален количеству сожженных компонентов.
Update: заменил в тексте «программатор» на «переходник USB-UART» или просто «переходник». По моему опыту термин «программатор» используется чаще, но, пожалуй, «переходник USB-UART» будет точнее.