ESP12: Поиск доступных сетей

Описание

В данном мини-проекте рассматривается подключение модуля к контроллеру с помощью Sensor shield, и поиск доступных для подключения сетей Wi-Fi.

Модуль общается с контроллером посредством интерфейса UART. Так как на контроллерах UNO (Arduino Uno, Genuino Uno, Smart Uno) всего один аппаратный интерфейс UART, мы будем общаться с контроллером с помощью программного UART интерфейса. Это даёт нам возможность не занимать аппаратный интерфейс, таким образом мы сможем, как минимум, наблюдать за происходящим на Wi-Fi модуле, через монитор Serial-порта контроллера.

Изначально модуль настроен на работу с помощью AT-команд. Но вручную писать AT-команды очень неудобно, по нескольким причинам:

  • Очень велика вероятность ошибиться и ввести неверную AT-команду;
  • Разбор ответа от контроллера будет довольно ёмким
  • Скетч будет трудно-читаемым из-за огромного количества кода
  • Сложно выявить ошибки

Поэтому, чтобы общение с модулем было наиболее эффективным, простым и быстрым, мы воспользуемся библиотекой WiFiEsp

Скачайте и установите данную библиотеку в среду разработки Arduino IDE.

Перед началом работы настройте модуль на скорость обмена в 9600 бод. О том как это сделать, рассказано на этой странице.

Шаг 1. Вам потребуется

Возьмите необходимые для проекта элементы, представленные в таблице ниже.

Шаг 2. Подключите Wifi модуль к шилду

Выполните подключение модуля в соответствии со схемой ниже.

Шаг 3. Загрузите скетч на контроллер

Загрузите скетч, представленный ниже, на контроллер. Предварительно измените значения переменных:

  • char ssid[] - здесь должно быть Ваше имя WiFi сети
  • char pass[] - здесь должен быть пароль от Вашей WiFi сети
#include "WiFiEsp.h" //подключение библиотеки WiFiEsp
 
// Эмуляция Serial соединения
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial wifiSerial(6, 7); // TX - модуля , RX - модуля
 
#endif
 
char ssid[] = "SmartElements"; //имя сети wifi
char pass[] = "1234567890"; //пароль от сети wifi
int status = WL_IDLE_STATUS; // статус сети wifi
 
void setup()
{
  //инициализация Serial-соединения для отладки
  Serial.begin(9600);
  //инициализация Serial-соединения для ESP-модуля
  wifiSerial.begin(9600);
  //инициализация ESP модуля
  WiFi.init(&wifiSerial);
 
  //проверка существования модуля
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi module not present");
    //если модуля нет, то не продолжать работу далее
    while (true);
  }
 
  //вывод MAC-адреса
  printMacAddress();
}
 
void loop()
{
  //сканирование существующих сетей
  Serial.println();
  Serial.println("Scanning available networks...");
  listNetworks();
  delay(10000);
}
 
/* Процедура выводит  MAC-адрес
 *  в монитор Serial-порта.
 */
void printMacAddress()
{
  //получение MAC-адреса
  byte mac[6];
  WiFi.macAddress(mac);
 
  //вывод MAC-адреса
  char buf[20];
  sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
  Serial.print("MAC address: ");
  Serial.println(buf);
}
 
/* Процедура получает список беспроводных сетей
 *  и выводит его в монитор Serial-порта. 
 */
void listNetworks()
{
  //поиск беспроводных сетей в зоне видимости
  int numSsid = WiFi.scanNetworks();
  if (numSsid == -1) { //не найдено ни одной сети
    Serial.println("Couldn't get a wifi connection");
    while (true);
  }
 
  //вывод найденных сетей
  Serial.print("Number of available networks:");
  Serial.println(numSsid);
 
  //вывод номера и имени найденных сетей
  for (int thisNet = 0; thisNet < numSsid; thisNet++) {
    Serial.print(thisNet);
    Serial.print(") ");
    Serial.print(WiFi.SSID(thisNet));
    Serial.print("\tSignal: ");
    Serial.print(WiFi.RSSI(thisNet));
    Serial.print(" dBm");
    Serial.print("\tEncryption: ");
    printEncryptionType(WiFi.encryptionType(thisNet));
  }
}
 
/* Вывод информации о типе шифрования 
 *  в обнаруженной сети. 
 */
void printEncryptionType(int thisType) {
  //вывод типа шифрования
  switch (thisType) {
    case ENC_TYPE_WEP:
      Serial.print("WEP");
      break;
    case ENC_TYPE_WPA_PSK:
      Serial.print("WPA_PSK");
      break;
    case ENC_TYPE_WPA2_PSK:
      Serial.print("WPA2_PSK");
      break;
    case ENC_TYPE_WPA_WPA2_PSK:
      Serial.print("WPA_WPA2_PSK");
      break;
    case ENC_TYPE_NONE:
      Serial.print("None");
      break;
  }
  Serial.println();
}

Шаг 4. Результат соединения

Далее, откройте монитор Serial-порта в Arduino IDE, и посмотрите параметры подключения. Вы увидите информацию вида:

[WiFiEsp] Initializing ESP module
[WiFiEsp] Initilization successful - 1.5.4
MAC address: 19:FE:56:F1:29:EF

Scanning available networks...
Number of available networks:9
0) wifi-tat-mm	Signal: -76 dBm	Encryption: WPA2_PSK
1) NivaForge-WiFi	Signal: -88 dBm	Encryption: WPA2_PSK
2) MicroTicket-SpB-1	Signal: -87 dBm	Encryption: WPA_WPA2_PSK
3) Yana Signal: -94 dBm	Encryption: WPA2_PSK
4) 221_470	Signal: -92 dBm	Encryption: WPA_WPA2_PSK
5) beeline2102	Signal: -91 dBm	Encryption: WPA_WPA2_PSK
6) gansnroses	Signal: -75 dBm	Encryption: WPA_WPA2_PSK
7) verdict	Signal: -84 dBm	Encryption: WPA2_PSK
8) TP-LINK_GG113	Signal: -73 dBm	Encryption: WPA2_PSK

Где выводится список доступных сетей, с данными :

  • имя сети, которую нашёл модуль
  • Signal: уровень сигнала сети
  • Encryption: тип защиты (шифрования) сети