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

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

Изначально модуль настроен на работу с помощью AT-команд. Но вручную писать AT-команды очень неудобно, по нескольким причинам:
  * Очень велика вероятность ошибиться и ввести неверную AT-команду;
  * Разбор ответа от контроллера будет довольно ёмким
  * Скетч будет трудно-читаемым из-за огромного количества кода
  * Сложно выявить ошибки

Поэтому, чтобы общение с модулем было наиболее эффективным, простым и быстрым, мы воспользуемся библиотекой WiFiEsp
  * [[http://files.smartelements.ru/know_libs/WiFiEsp.zip|Скачать библиотеку WiFiEsp]]

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

<WRAP center round tip 80%>
Перед началом работы настройте модуль на скорость обмена в 9600 бод. О том как это сделать, рассказано [[main:comm:esp12#Установка скорости обмена данными|на этой странице]].
</WRAP>

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

^ Что нужно                                                                                                               ^  Кол-во, шт  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart Uno]]                   |  1           |
| [[https://smartelements.ru/collection/svyaz/product/wifi-modul-esp-12|Wi-Fi модуль ESP-12]]                      |  1           |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-mama-mama|Провода мама-мама]]  |  4           |

==== Шаг 2. Подключите Wifi модуль к шилду ====
Выполните подключение модуля в соответствии со схемой ниже.

{{ :главная:связь:wifi_sensor_shield_2.png?nolink |}}

==== Шаг 3. Загрузите скетч на контроллер ====
Загрузите скетч, представленный ниже, на контроллер. Предварительно измените значения переменных:
  * char ssid[] - здесь должно быть Ваше имя WiFi сети
  * char pass[] - здесь должен быть пароль от Вашей WiFi сети

<file Arduino>
#include "WiFiEsp.h" //подключение библиотеки WiFiEsp

// Эмуляция Serial соединения
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial wifiSerial(6, 7); // RX, TX
#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();
}
</file>

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

<file>
[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

</file>

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