WiFi модуль ESP8266


03.04.2015

ESP8266 - недороге рішення для підключення різних пристроїв, розроблених переважно на базі мікроконтролерів, до мережі WiFi. ESP8266 працює з інтерфейсом UART, що спрощує процес підключення до мікроконтролера і є найбільш простим і зрозумілим рішенням. Модуль керується AT командами і не потребує жодних спеціалізованих бібліотек.

ESP8266 ESP8266 ESP8266 ESP8266

Параметри модуля 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 В.

ESP8266 Pins

Приколи з терміналом (#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.

ESP8266 circuit

Спробуємо зробити простенький 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 або аналогічну програму, зависань не відбувалося.

Загнати модуль у ступор також можна наступним чином:

  1. модуль піднімає порт
  2. до нього підключаємось за допомогою telnet, тощо, відправляємо дані
  3. мікроконтролер починає відповідати і у той момент, коли мікроконтролер отримав символ ">" і надсилає дані у модуль, ми рвемо зв`язок. Мається на увазі закриваємо Telnet, тощо. FiWi продовжує працювати як треба, модуль ESP8266 у мережі видно (тобто він пінгується), але...
  4. модуль ESP8266 у ступорі і на запити більше не відповідає.

Виходить, що WiFi модуль ESP8266 може не коректно працювати якщо під час передачі даних рветься TCP-з`єднання. Можливо Ви ніколи і не зіштовхнетесь з цією проблемою, може вона буде вирішена у наступних версіях прошивки, проте вона існує і трохи мене розчарувала. Вцілому можу сказати, що я не в захваті від модуля, але, якщо пристосуватися до його особливостей, - цілком можна використовувати. До того ж, це саме просте рішення для підключення мікроконтролерів до комп’ютерної мережі. З цим модулем навіть самі слабенькі мікроконтролери, які мають UART, можуть працювати у локальній мережі чи у Інтернеті.

Успіхів.

Дивись також:

Корисно знати Початківцям Схеми і прошивки
Коментарі:
Дмитрий говорить:
07.04.2015 23:07
Интересный обзор. Мне кажется, что модель "прожорливый". Может вопрос и не совсем по теме статьи, но вам встречались wifi модули, которые можно использовать в устройствах, питающихся от батареек, с меньшим потреблением?

andre говорить:
08.04.2015 08:47
Да, ESP8266 прожорливый. К сожалению, Wi-Fi модулей с низким потреблением пока не встречал.

Додати коментар
Code
* - обов'язкові поля

Архіви