Проект 30: Бездротовий зв'язок. Модуль Wi-Fi ESP8266
В цьому експерименті ми познайомимося з модулем ESP8266, за допомогою якого можна підключити плату Arduino до мереж Wi-Fi, і напишемо скетч для передачі даних датчика температури на веб-сервіс Народний моніторинг.
Необхідні компоненти:
- контролер Arduino UNO R3;
- плата для прототипування;
- модуль ESP8266 ESP-01;
- датчик температури LM335;
- резистор 2,2 кОм;
- дроти тато-тато.
- блок живлення +5 в 1 А;
- перетворювач напруги 3-30 В.
Після своєї появи плати на базі Wifi чіпа ESP8266 стали по-справжньому народними. Величезні можливості і мінімальна ціна зробили свою справу. Плати на ESP8266 - це не просто модулі для зв'язку по Wi-Fi. Чіп, по суті, є мікро контролером зі своїми інтерфейсами SPI, UART, а також портами GPIO, а це значить, що модуль можна використовувати автономно без Arduino і інших плат з мікроконтролерами. Існує близько 11 офіційних модифікацій плати. У нашому розпорядженні найпростіша плата - ESP01. Терморегулятори плати показана на рис. 30.1. Покажемо, як використовувати її в якості Wi-Fi модуля для Arduino.

Рис. 30.1. Терморегулятори модуля ESP-01
Модуль ESP8266 розрахований тільки на 3,3 В. Тому нам необхідне джерело живлення 3,3 В. Схема підключення модуля ESP-01 до плати Arduino показана на рис. 30.2. Спілкування з модулем за допомогою AT-команд. Список основних AT-команд показаний в табл. 30.1. Завантажимо на плату Arduino скетч, показаний в лістингу 30.1, і будемо відправляти в модуль ESP-01 AT-команди. Результат виконання команд показаний на рис. 30.3.

Рис. 30.2. Схема підключення модуля ESP-01 до Arduino
лістинг 30.1
#include <SoftwareSerial.h>
SoftwareSerial mySerial (2, 3); // вказуємо Піни rx і tx
void setup ()
{
pinMode (2, INPUT);
pinMode (3, OUTPUT);
Serial.begin (9600);
mySerial.begin (9600);
}
void loop ()
{
if (mySerial.available ())
{
int c = mySerial.read (); // читаємо з software-порту
Serial.write (c); // пишемо в hardware-порт
if (Serial.available ())
{
int c = Serial.read (); // читаємо з hardware-порту
mySerial.write (c); // пишемо в software-порт
}
}
Порядок підключення:

Рис. 30.3. Відправка AT-команд з Arduino IDE
Створимо скрипт відправки даних на сайт Народний моніторинг. Підключимо до плати Arduino датчик температури LM335 і кожні 10 хвилин будемо відправляти дані. Схема з'єднань показана на рис. 30.4. Для відправки даних необхідно виконати наступну послідовність дій:
- Скидання ESP-01 і перевірка готовності модуля (AT + RST).
- Підключення до мережі по Wi-Fi (AT + CWJAP = "", "").
- Вибір режиму одиночного з'єднання (AT + CIPMUX = 0).
- Створення TCP-з'єднання (AT_CIPSTART = "TCP", "92.39.235.156", 8283).
- Відправка даних (AT + CIPSEND = і самі дані # \ n # \ n # \ n ##).
- Закрити TCP-з'єднання (AT + CIPCLOSE).
- Пауза 10 хвилин і перехід до кроку 4.

Рис. 30.4. Схема підключення модуля ESP-01 до Arduino

Таблиця 30.1
Вміст скетчу показано в лістингу 30.2.
#include <SoftwareSerial.h>
SoftwareSerial mySerial (2, 3); // RX, TX
const int LM335 = A0; // контакт підключення датчика LM335
#define SSID "MacBook Pro - Petin" // введіть ваш SSID
#define PASS "19101966" // введіть ваш пароль
#define DST_IP "92.39.235.156" // naronmon.ru
void setup ()
{
Serial.begin (9600); // для налагодження
mySerial.begin (9600);
delay (2000);
Serial.println ( "Init");
mySerial.println ( "AT + RST"); // скидання і перевірка, якщо модуль готовий
delay (1000);
if (mySerial.find ( "ready"))
{Serial.println ( "WiFi - Module is ready");}
else
{Serial.println ( "Module dosn't respond.");
while (1);
}
delay (1000);
// з'єднання по wifi
boolean connected = false;
for (int i = 0; i <5; i ++)
{
if (connectWiFi ())
{Connected = true;
mySerial.println ( "Connected to Wi-Fi ...");
break;
}
}
if (! connected)
{
mySerial.println ( "Coudn't connect to Wi-Fi.");
while (1);
}
delay (5000);
mySerial.println ( "AT + CIPMUX = 0"); // режим одиночного з'єднання
}
void loop ()
{
String cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = DST_IP;
cmd + = "\", 8283 ";
Serial.println (cmd);
mySerial.println (cmd);
if (mySerial.find ( "Error"))
return;
double val = analogRead (LM335); // читання показань LM335
double voltage = val * 5.0 / 1024; // переклад в вольти
double temp = voltage * 100 - 273.15; // в градуси Цельсія
cmd = "# A0: F3: C1: 70: AA: 94 \ n # 2881C4BA0200003B1 #" + String (temp) + "\ n ##";
delay (3000);
mySerial.print ( "AT + CIPSEND =");
mySerial.println (cmd.length ());
delay (1000);
Serial.println ( ">");
mySerial.print (cmd);
Serial.println (cmd);
delay (3000);
mySerial.println ( "AT + CIPCLOSE");
delay (600000);
}
// процедура установки Wi-Fi-з'єднання
boolean connectWiFi ()
{
String cmd = "AT + CWJAP = \" ";
cmd + = SSID;
cmd + = "\", \ "";
cmd + = PASS;
cmd + = "\" ";
mySerial.println (cmd);
Serial.println (cmd);
delay (2000);
if (mySerial.find ( "OK"))
{
Serial.println ( "OK, Connected to Wi-Fi.");
return true;
}
else
{
Serial.println ( "Can not connect to the Wi-Fi.");
return false;
}
}