сайт для палких паяльників

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 к Wi Fi выполняем следующие команды:

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).

Настройка доступа к Wi Fi точки. Как “не светить” пароль.

Модуль может быть как точкой доступа, так и подключаться к указанной точке доступа. Я использовал модуль для подключения к существующей 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, могут работать в локальной сети или в Интернете.

Успехов.

Смотри также:

Translate
Архіви

© 2011-2019 Андрій Корягін, Кременчук - Київ, Україна