(практику проведём на занятие)
В этом эксперименте мы познакомимся с модулем 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
Создадим скрипт отправки данных на сайт Народный мониторинг (https://narodmon.ru). Подключим к плате Arduino датчик температуры LM335 и каждые 10 минут будем отправлять данные. Схема соединений показана на рис. 30.4. Для отправки данных необходимо выполнить следующую последовательность действий:
1. Сброс ESP-01 и проверка готовности модуля (AT+RST).
2. Подключение к сети по Wi-Fi (AT+CWJAP="","").
3. Выбор режима одиночного соединения (AT+CIPMUX=0).
4. Создание TCP-соединения (AT_CIPSTART="TCP","92.39.235.156", 8283).
5. Отправка данных (AT+CIPSEND= и сами данные #\ n#\n#\n##).
6. Закрыть TCP-соединение (AT+CIPCLOSE).
7. Пауза 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;
}
}