WiFi модуль ESP8266
ESP8266 - недороге рішення для підключення різних пристроїв, розроблених переважно на базі мікроконтролерів, до мережі WiFi. ESP8266 працює з інтерфейсом UART, що спрощує процес підключення до мікроконтролера і є найбільш простим і зрозумілим рішенням. Модуль керується AT командами і не потребує жодних спеціалізованих бібліотек.
Параметри модуля ESP8266
- напруга живлення 3.3 В
- струм 215 mA у режимі передачі даних, до 62 mA під час прийому даних
- 802.11 b/g/n протокол
- керування модулем за допомогою AT-команд
- робоча температура від -40 до +125 градусів за шкалою Цельсія
- максимальна дистанція зв`язку - 100 метрів
Живлення ESP8266
Живлення ESP8266 - 3.3 В. Виводи толерантні до 5 В, але модуль не працює, якщо його живити напругою +5 В. Модуль споживає досить багато - 215 мА у режимі передачі даних та 62 мА у режимі прийому. Зверніть увагу на потужність Вашого блоку живлення. Він має видавати як мінімум 300 mA, інакше можуть виникнути проблеми.
Розпіновка та підключення ESP8266
Підключимо WiFi модуль ESP8266 до комп’ютера за допомогою UART-USB перехідника та спробуємо попрацювати з модулем у ручному режимі. Не забуваємо, що TX модуля підключаємо до RX UART-USB перехідника, а RX модуля підключаємо до TX UART-USB перехідника. Вхід CH_PD (chip enable) підключаємо до +3.3 В.
Приколи з терміналом (#13#10)
Можна використовувати будь-яку термінальну програму. У мене встановлений PuTTY. Це SSH клієнт, але він може працювати і з COM портом. Після підключення пробуємо вводити команду AT. Натискаємо ENTER і... нічого не відбувається. Модуль не сприймає команду. З`ясувалося, що модуль ESP8266 вимагає закінчення вводу команди двома символами с кодами 13 і 10 (без додаткових налаштувань в PuTTY по натисканню клавіші ENTER відправляється тільки #13). Я, не довго думаючи, використав старий прийом: натискав на клаві лівий Alt та набирав "10" на цифровій клавіатурі. Потім знайшлась спеціальна опція у налаштуваннях (розділ "Terminal"), яка вирішує цю проблему автоматично: "Implicit LF in every CR".
AT Команди ESP8266
- AT - Тестова команда повертає OK
- AT+RST - Перезавантаження модуля. По завершенню перезавантаження повинні побачити "ready"
- AT+GMR-Перевірка версії прошивки модуля
- AT+CWMODE=<режим> - Задає режим роботи модуля mode: 1 - клієнт, 2 - точка доступу, 3 - змішаний режим
- AT+CWLAP - Повертає список WiFi точок доступу, до яких можливо підключитися
- AT+CWJAP=<ім’я>,<пароль> - Підключитися до точки доступу задавши ім`я точки та пароль. Якщо підключення пройшло успішно - команда видасть OK. А модуль збереже у пам`яті дані про точку і надалі самостійно буде до неї підключатися
- AT+CWQAP - Відключитися від точки доступу
- AT+CWSAP=<ім`я>,<пароль>,<канал>,<шифрування> - Створити свою точку доступу самого модуля
- AT+CWLIF - отримати список підключених пристроїв (якщо модуль працює, як точка доступу)
- AT+CIPSTATUS - Отримати поточний статус TCP-з’єднання
- AT+CIPSTART - Для одного з`єднання (+CIPMUX=0): AT+CIPSTART=<тип>,<адрес>,<порт> Для багатопоточного режиму (+CIPMUX=1): AT+CIPSTART=<ID>,<тип>,<адреса>,<порт> <ID>— ідентифікатор з`єднання <тип>— тип з`єднання: TCP або UDP <адреса>— адреса IP або URL <порт>— порт
- AT+CIPMODE= <режим> - Встановити режим передачі даних: <режим>= 0 — not data mode (сервер може відправляти данні клієнту і може приймати дані від клієнта) <режим>= 1 — data mode (сервер може відправляти данні клієнту, але не може приймати дані від клієнта)
- AT+CIPSEND - Відправити данні Для одного з`єднання (+CIPMUX=0): AT+CIPSEND=<кількість символів> Для багатопоточного режиму (+CIPMUX=1): AT+CIPSTART=<ID>,<кількість символів> <ID>— ідентифікатор з`єднання <кількість символів>— кількість даних (байт) що відправляються. Самі данні передаються після відповіді модуля на команду після символу ">"
- AT+CIPCLOSE - Закрити з`єднання. Параметр для багатопоточного режиму <ID>— ідентифікатор з`єднання. Для одного з`єднання (+CIPMUX=0): AT+CIPCLOSE Для багатопоточного режиму (+CIPMUX=1): AT+CIPCLOSE=<ID>
- AT+CIFSR - Отримати IP модуля. Це можливо після підключення до WiFi точки.
- AT+CIPMUX= <режим> - Задає кількість з’єднань. <режим>=0 для одного з`єднання, <режим>=1 для багатопоточного режиму (до п`яти підключень)
- AT+CIPSERVER= <режим>, <порт> - Відкрити порт. <режим>- режим прихованості (0 - прихований, 1 - відкритий), <порт> - порт
- AT+CIPSTO=<час> - Встановити час одного з`єднання у секундах (timeout)
- AT+CIOBAUD=<швидкість> - Встановити швидкість UART порту. Працює для версій прошивки від 0.92.
- Прийом інформації - дані приходять з позначкою +IPD, після якої йде інформація про кількість прийнятих даних, а потім - сама інформація. Для одного з`єднання (+CIPMUX=0): +IPD,<кількість символів>:<інформація> Для багатопоточного режиму (+CIPMUX=1): +IPD,<ID з`єднання>,<кількість символів>:<інформація> Приклад: +IPD,0,6:ptnpnh - прийнято 6 байт інформації.
Дуже прикро, але я не знайшов команди, за допомогою якої можна дізнатися MAC-адресу модуля. Довелося дізнаватися MAC-адресу модуля після підключення модуля до WiFi мережі. Не дуже зручно, якщо для доступу до WiFi застосовується фільтрація по MAC-адресам, як у мене.
Скачати повний список AT команд у форматі PDF
Скачати приклади використання AT команд у форматі PDF
Оновлення прошивки ESP8266
Я рекомендую оновити прошивку модуля, якщо вона застаріла. Перевірити версію прошивки можна командою AT+GMR. Качаємо програму для прошивки, та саму прошивку. Потім треба перевести модуль у режим програмування. Для цього треба підключити GPIO0 до GND. І тільки після цього подавати живлення на модуль. Якщо GPIO0 переключати під час роботи модуля, це не спрацює. Далі, за допомогою програми заливаємо прошивку. Як оновити прошивку, де і які програми качати - детально написано тут: http://esp8266.ru/esp8266-podkluchenie-obnovlenie-proshivki/#esp8266-update-firmware Доречі, оновлення прошивки також можливе через Інтернет, але тільки якщо поточна версія прошивки старша за 0.92. Я скористався цим один раз і більше не хочу. Після такого оновлення модуль моргав світлодіодами, як скажений і зовсім не хотів працювати. Прошивка вручну допомогла повернути його до життя.
Тестуємо ESP8266 вручну
Щоб підключити модуль ESP8266 до WiFi виконуємо наступні команди:
AT+RST
AT+CWMODE=1
AT+CWJAP="SID","password"
Де:
SID - SID Вашої WiFi мережі;
password - пароль для доступу до WiFi.
Після підключення можемо переглянути IP-адресу модуля. Я сподіваюся, Ви розумієте, що Ваша WiFi точка доступу повинна мати DHCP сервера і автоматично видавати IP-адреси.
AT+CIFSR
На своєму маршрутизаторі я прописав статичну адресу для мого модуля - 192.168.1.100.
Відкриємо порт (88):
AT+CIPMODE=0
AT+CIPMUX=1
AT+CIPSERVER=1,88
Тепер, коли підключитесь до модуля на вказаний порт, зможете передавати дані. Спробуємо зробити це за допомогою telnet:
telnet 192.168.1.100 88
Якщо у Вас Windows 7, чи щось новіше від Білла, тоді Ви не знайдете telnet у системі. Доведеться щось вигадувати. Але, якщо у Вас є PuTTY скористайтеся наступною командою:
plink.exe -telnet 192.168.1.100 -P 88
Тепер, якщо Ви все зробили правильно, можна ввести дані руками і на терміналі, підключеному до модуля ESP8266, побачимо як вони прилітають. Можна спробувати підключитися до модуля звичайним браузером: http://192.168.1.100:88
Дані схожі на щось таке:
+IPD,0,303:GET / HTTP/1.1 Host: 192.168.1.100 User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive
Де:
+IPD - префікс
0 - ID сесії
303 - довжина прийнятих даних
після символу ":" йдуть дані.
Якщо треба відповісти, відправляємо модулю команду:
AT+CIPSEND=0,3
Де:
0 - ID сесії;
3 - довжина даних які ми будемо передавати чикаємо символ ">" Та вводимо данні.
>www
Повинні побачити відповідь модуля:
SEND OK
А у консолі telnet набрані дані - "www" . Якщо Ви підключилися браузером, відповідь "www" браузер, скоріш за все, не зрозуміє. Йому потрібна коректна відповідь. Щось схоже на таке:
HTTP/1.1 200 OK
Date: Sun, 12 Feb 2015 03:51:41 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=5
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8? />
<title>Документ без назви</title>
</head>
<body>
Текст
</body>
</html>
Цим ми і займемося трохи далі.
Модуль може робити в режимі одиночного підключення і у режимі декількох підключень (до 5) (дивись команду: AT+CIPSTART). Та, коли модуль працював у однопоточному режимі, мені не вдалося відкрити порт. Тому далі я працював лише з багатопоточним режимом (AT+CIPMUX=1).
Налаштування доступу до WiFi точки. Як "не світити" пароль.
Модуль може бути як точкою доступу, так і підключатися до вказаної точки доступу. Я використовував модуль для підключення до існуючої WiFi мережі. Дуже приємна особливість - після підключення модуль зберігає ім`я WiFi точки та пароль. Якщо модуль вимкнути і знову включити, він самостійно буде підключатися до раніше вказаної точки доступу. Після підключення модуль отримає IP, і готовий для роботи. Лишається тільки налаштувати порт. Таким чином, якщо у Вас змінився пароль до WiFi, або взагалі змінилися налаштування, достатньо витягти модуль з Вашого пристрою, підключити до комп’ютера за допомогою UART-USB перехідника і вручну підключитися до WiFi. Модуль запам`ятає параметри підключення, після чого його можна повернути у пристрій. Тобто, Вам не прийдеться вигадувати яким чином вбивати новий пароль до WiFi точки у Вашому пристрої. Це особливо важливо для мініатюрних задач, де взагалі можуть бути відсутні дисплей, кнопки, тощо.
Підключаємо модуль ESP8266 до мікроконтролера Atmega
Підключимо модуль до мікроконтролера і спробуємо написати приклад для обробки запитів через звичайний браузер. У прикладі я використав звичайнісіньку Atmega8.
Спробуємо зробити простенький Web-інтерфейс, за допомогою якого можна буде вмикати і вимикати світлодіод.
#include <stdio.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "delay.h"
#include "uart.h"
#define RXUBRR (F_CPU/16/9600)-1 //9600
//#define RXUBRR (F_CPU/16/115202)-1 //115200
uint8_t FLAG_REPLY;
uint8_t RXi;
char RXc;
#define RX_BUF_SIZE 64
static char RXBuffer[RX_BUF_SIZE];
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB0
#define LED_OFF LED_PORT |= (1<<LED_PIN)
#define LED_ON LED_PORT &= ~(1<<LED_PIN)
void clear_RXBuffer()
{
for (RXi=0;RXi<RX_BUF_SIZE;RXi++)
RXBuffer[RXi] = 0;
RXi = 0;
FLAG_REPLY = 0;
}
// This function called from uart.c file (* - Make better if you wish)
void RX_getc(unsigned char RXc) {
if ((RXc != 255) && (RXc != 0) && (RXc != 10)) {
if (RXc != 13) {
RXBuffer[RXi] = RXc;
RXi++;
if (RXi > RX_BUF_SIZE-1) {
clear_RXBuffer();
}
}
else {
FLAG_REPLY = 1;
}
}
}
void uart_wite_char(char str) {
while (RXc != str)
RXc = uart_getc();
}
void uart_wite_for(const char * str) {
char result = 0;
while (result == 0) {
FLAG_REPLY = 0;
clear_RXBuffer();
while (FLAG_REPLY == 0) {
}
result = strstr(RXBuffer, str);
}
}
int main(void){
uint8_t id;
// Init LED Port
LED_DDR |= (1<<LED_PIN);
LED_OFF;
sei();
uart_init(RXUBRR);
delay_ms(500);
uart_puts("AT+RST\r\n");
uart_wite_for("Ready");
uart_puts("AT+CIPMODE=0\r\n");
uart_wite_for("OK");
uart_puts("AT+CIPMUX=1\r\n");
uart_wite_for("OK");
uart_puts("AT+CIPSERVER=1,88\r\n"); // Port 88
uart_wite_for("OK");
uart_puts("AT+CIPSTO=5\r\n"); // Timeout
uart_wite_for("OK");
LED_ON;
while(1) {
// Wait for Data
uart_wite_for("+IPD");
id = RXBuffer[5];
if (strstr(RXBuffer, "/info") > 0) {
}
if (strstr(RXBuffer, "/on") > 0) {
LED_ON;
}
if (strstr(RXBuffer, "/off") > 0) {
LED_OFF;
}
uart_wite_for("OK");
uart_puts("AT+CIPSEND=");
uart_putc(id);
uart_puts(",176\r\n"); //176 - length of returned data (HTML reply size)
uart_wite_char('>');
uart_puts("HTTP/1.1 200 OK\r\n"); //length: 17
uart_puts("Content-Type: text/html; charset=UTF-8\r\n\r\n"); //length: 42
uart_puts("<html><head><title>Wi-Fi ESP8266 DEMO</title></head><body><a href=\"/on\">on</a> <a href=\"/off\">off</a></body></html>\r\n"); //length: 117
uart_putc(id);
//uart_wite_for("OK");
//uart_puts("AT+CIPCLOSE=");
//uart_putc(id);
//uart_puts("\r\n");
}
}
Заходимо будь-яким браузером: http://192.168.1.100:88
Програма формує просту HTML-сторінку з двома посиланнями для вмикання і вимикання світлодіода.
Скачати файли прикладу для Atmega
Проблеми модуля ESP8266
Під час створення цього прикладу виникла проблема. Справа у тому, що браузер, окрім основного запиту, відправляє запит на отримання файла favicon.ico. Інколи він приходить досить невчасно, коли програма закриває з`єднання. Це інколи призводило зо зависання модуля. Тому у прикладі стоїть досить великий тайм-аут (AT+CIPSTO=5) і сесія закривається не програмно, а автоматично (команда AT+CIPCLOSE=id не використовується). Якщо використовувати telnet або аналогічну програму, зависань не відбувалося.
Загнати модуль у ступор також можна наступним чином:
- модуль піднімає порт
- до нього підключаємось за допомогою telnet, тощо, відправляємо дані
- мікроконтролер починає відповідати і у той момент, коли мікроконтролер отримав символ ">" і надсилає дані у модуль, ми рвемо зв`язок. Мається на увазі закриваємо Telnet, тощо. FiWi продовжує працювати як треба, модуль ESP8266 у мережі видно (тобто він пінгується), але...
- модуль ESP8266 у ступорі і на запити більше не відповідає.
Виходить, що WiFi модуль ESP8266 може не коректно працювати якщо під час передачі даних рветься TCP-з`єднання. Можливо Ви ніколи і не зіштовхнетесь з цією проблемою, може вона буде вирішена у наступних версіях прошивки, проте вона існує і трохи мене розчарувала. Вцілому можу сказати, що я не в захваті від модуля, але, якщо пристосуватися до його особливостей, - цілком можна використовувати. До того ж, це саме просте рішення для підключення мікроконтролерів до комп’ютерної мережі. З цим модулем навіть самі слабенькі мікроконтролери, які мають UART, можуть працювати у локальній мережі чи у Інтернеті.
Успіхів.
Дивись також:
- ESP8266 NodeMCU Перше знайомство. Робимо WiFi розетку
- ESP8266 NodeMCU. PWM
- ESP8266 NodeMCU. ADC
- ESP8266 NodeMCU. timer, rtc, SNTP, cron
- ESP8266 NodeMCU. файлова система, SD Card
- ESP8266 NodeMCU. UART
- GPS-трекер на базі ESP8266
- GPS-трекер + Дисплей SSD1306
- ESP8266 NodeMCU. SSD1306. U8G
- ESP-01 (ESP8266) upgrade flash memory to 4MB
- ESP8266 NodeMCU. I2C. BME280/
- Метеостанція на ESP8266
Интересный обзор. Мне кажется, что модель "прожорливый". Может вопрос и не совсем по теме статьи, но вам встречались wifi модули, которые можно использовать в устройствах, питающихся от батареек, с меньшим потреблением?
Да, ESP8266 прожорливый. К сожалению, Wi-Fi модулей с низким потреблением пока не встречал.
Недавні записи
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
Tags
battery soldering java-script ngnix adc rs-232 flask esp8266 watchdog web exti solar mongodb rtc sms pwm usart books ethernet smd git websocket meteo css python dc-dc displays led ssd1306 eeprom gpio barometer max1674 mpx4115a brushless motor mpu-6050 timer sensors remap servo bldc atmega pmsm 3d-printer flash encoder examples dma raspberry-pi tim ssd1331 piezo mpu-9250 rfid eb-500 foc bme280 gps nvic dht11 bluetooth hih-4000 stm32 st-link docker uart avr html wifi bmp280 bkp nodemcu options usb lcd programmator i2c capture
Архіви