ESP8266 первая прошивка HELLO WORLD и управляем светодиодом через ANDROID устройство.
Ссылка на видео в YouTube Как обычно светодиод, отправляем Helo Word и принимаем ответ. Ниже написанная мною прошивка для ESP8266 которая управляет светодиодом, принимает текстовые сообщения, команды, выводит их через UART на экран а также отсылает на наш ANDROID ответы, качаем здесь
Download for ESP8266, файл eagle.flash.bin шьем по 0x00000 адресу и eagle.irom0text.bin по 0x10000.
Давайте разберемся с прошивкой для ESP8266, сразу обращаю ваше внимание на две обязательные функции они должны быть без них работать не будет, в коде прошивки я их а также другие функции отметил комментариями я думаю так будет понятней.
Заострять внимание на подключение ESP8266 к компьютеру через UART с помощью переходника USB-UART и светодиода я не буду так как полно в интернете информации.
Теперь как осуществляется настройка нашего Esp8266(у меня ESP-07) первым делом переводим наш модуль в режим SOFTAP регистрируем функцию которая сработает после стабилизации для настройки DHCP(программа которая автоматически будет назначать IP адрес для ANDROID устройства), настраиваем SOFTAP(название точки, IP адрес и так далее) конфигурацию, следом производим настройку TCP который будет принимать и отправлять данные с помощью зарегистрированных функций.
Подробней о TCP(по интернету сервис по моему программа), в при ведущей статье говорилось что в точке доступа находится программа которая должна обрабатывать все запросы, принимать и отправлять данные, к которой будем обращаться по её порту(просто номер) в нашем случае 80, TCP она и есть и в её функциях будет происходить все таинство.
Как все это происходит? Когда мы подключились к нашей точке доступа(ESP8266) ваше ANDROID устройство получило IP адрес выделенный DHCP, далее запускаем мою программу, жмем CON, программа отправляет запрос на подключение к модулю порту 80(TCP).
После удачного соединения в TCP срабатывает функция connectCB, которой передаётся все сведения отправителя, для обмена информацией, так же в этой функции регистрируем еще четыре функции, они обязательны для корректной работы.
Нас интересует recvCB(void *arg, char *pData, unsigned short len), именно она и получает все данные, в виде сведения отправителя(*arg), байтовый массив(*pData) данных и длина массива(len).
Отправить данные ещё проще, выполняется функцией espconn_sent, передаём в неё сведения получателя(полученные в функции recvCB), байтовый массив наших данных уже для ANDROID программы и длину массива. После удачной отправки срабатывает функция sentCB.
Вы наверное поняли что с начало наш ESP8266 должен получить данные, что бы знать кто хочет с ним общаться только потом сможет ответить, аналогично вашему компьютеру и серверу в интернете.
Ну в принципе все да кстати о настройках SOFTAP, DHCP, TCP если будет интересно ищите в интернете их описание, все это аналогично с передачей информации через всемирную паутину.
#include "user_interface.h"
#include "osapi.h"
#include "gpio.h"
#include "driver/uart.h"
#include "espconn.h"
LOCAL struct espconn esp_con_mu;
LOCAL esp_tcp esp_tcp_mu;
LOCAL void set_con_ip();
LOCAL void connectCB(void *arg);
LOCAL void disconectCB(void *arg);
LOCAL void reconCB(void *arg, sint8 err);
LOCAL void recvCB(void *arg, char *pData, unsigned short len);
LOCAL void sentCB();
char byte_sent[100]="ESP8266 sent ";
//Обработчик событий подключений и отключений Android устройств.
void ICACHE_FLASH_ATTR wifi_event_cb(System_Event_t *evt){
switch (evt->event) {
case EVENT_SOFTAPMODE_STACONNECTED:
ets_uart_printf("connect ANDROID WiFi");
ets_uart_printf("\n");
break;
case EVENT_SOFTAPMODE_STADISCONNECTED:
ets_uart_printf("disconnect ANDROID WiFi");
ets_uart_printf("\n");
break;
default:
break;
}
}
//Обязательная функция!
uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void){
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map)
{
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 8;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
//Обязательная функция!
void ICACHE_FLASH_ATTR user_rf_pre_init(void){}
//Вход в нашу программу, главная функция.
void ICACHE_FLASH_ATTR user_init(void){
//Запрещаем выводить ненужную информацию в UART.
system_set_os_print (0);
//Настраиваем UART.
uart_init(BIT_RATE_115200, BIT_RATE_115200);
os_delay_us(100);
//Настраиваем GPIO13 для светодиода.
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
gpio_output_set(0, 0, 0, BIT13);
GPIO_OUTPUT_SET(13, 0);
//Настраиваем наш модуль как SOFTAP(Точка доступа).
wifi_set_opmode(SOFTAP_MODE);
//Устанавливаем функцию для настройки DHCP, после стабилизации SOFTAP.
system_init_done_cb(set_con_ip);
//Структура для настройки SOFTAP.
struct softap_config softap_con;
os_memset(softap_con.ssid, 0, 32);
os_memset(softap_con.password, 0, 64);
os_memcpy(softap_con.ssid, "ESP8266", 7);
os_memcpy(softap_con.password, "12345678", 8);
softap_con.ssid_len = 7;
softap_con.authmode = AUTH_OPEN;
//softap_con.authmode = AUTH_WPA_WPA2_PSK;
//softap_con.channel = 7;
softap_con.ssid_hidden = 0;
softap_con.max_connection = 4;
wifi_softap_set_config(&softap_con);
//Настраиваем TCP, именно то что будет получать и отправлять информацию.
esp_tcp_mu.local_port = 80;
esp_con_mu.type = ESPCONN_TCP;
esp_con_mu.state = ESPCONN_NONE;
esp_con_mu.proto.tcp = &esp_tcp_mu;
//Регистрируем функцию которая, будет срабатывать при соединение с нашей программой на ANDROID.
espconn_regist_connectcb(&esp_con_mu, connectCB);
espconn_accept(&esp_con_mu);
//Регистрируем обработчик изменения соединения ANDROID устройств с нашим модулем ESP8266.
wifi_set_event_handler_cb(wifi_event_cb);
}
//Настройка DHCP, отключаем, настраиваем и включаем.
LOCAL void set_con_ip() {
wifi_softap_dhcps_stop();
struct ip_info ip_inf;
IP4_ADDR(&ip_inf.ip, 192, 168, 5, 1);
IP4_ADDR(&ip_inf.gw, 192, 168, 5, 1);
IP4_ADDR(&ip_inf.netmask, 255, 255, 255, 0);
wifi_set_ip_info(SOFTAP_IF, &ip_inf);
struct dhcps_lease dhcp_lease;
IP4_ADDR(&dhcp_lease.start_ip, 192, 168, 5, 2);
IP4_ADDR(&dhcp_lease.end_ip, 192, 168, 5, 5);
wifi_softap_set_dhcps_lease(&dhcp_lease);
wifi_softap_dhcps_start();
}
//Регистрируем четыре функции для работы с программой на Android.
LOCAL void connectCB(void *arg) {
struct espconn *pesp_conn = (struct espconn *)arg;
ets_uart_printf("connect PROGRAMM");
ets_uart_printf("\n");
//Наши четыре функции: принимаем данные, удачная отправка, разрыв соединения и переподключение.
espconn_regist_recvcb(pesp_conn, recvCB);
espconn_regist_sentcb(pesp_conn, sentCB);
espconn_regist_disconcb(pesp_conn, disconectCB);
espconn_regist_reconcb(pesp_conn, reconCB);
}
//Вот тут все и происходит!
LOCAL void recvCB(void *arg, char *pData, unsigned short len) {
struct espconn *pesp_sent = (struct espconn *)arg;
/*Если в принятом массиве pData[0] больше 9 значит пришло текстовое сообщение, выводим в UART и отсылаем по обратно по WiFi, ESP8266 sent плюс принятое сообщение.*/
if(pData[0]>9){
int i=0;
for (i=0; i<len; i++) {
ets_uart_printf("%c", pData[i]);
byte_sent[13+i]=pData[i];
}
ets_uart_printf("\n");
espconn_sent(pesp_sent, byte_sent, 13+len);
}else{
//Иначе пришла команда, если pData[0]=1 включаем светодиод, pData[0]=2 выключаем и отсылаем в UART.
ets_uart_printf("COMMAND=");
ets_uart_printf("%d", pData[0]);
ets_uart_printf("\n");
if(pData[0]==1){GPIO_OUTPUT_SET(13, 1);}
if(pData[0]==2){GPIO_OUTPUT_SET(13, 0);}
}
}
LOCAL void disconectCB(void *arg) {
ets_uart_printf("disconnect PROGRAMM");
ets_uart_printf("\n");
}
LOCAL void reconCB(void *arg, sint8 err) {}
LOCAL void sentCB(){}
Ну и о программе для вашего ANDROID устройства через которую мы будем все это осуществлять, особенности ANDROID 4 и выше, разрешение экрана 1280*720 и конечно наличие WiFi, вот ссылка.
Теперь как всем этим пользоваться!
Допустим подключили, прошили наш ESP8266, появилась наша точка доступа как ESP8266, подключаемся к ней, пароль не нужен. Если есть соединение с компьютером через терминал, то будут приходить соответствующие сообщения, далее запускаем нашу программу и жмем CON, если все правильно то мы можем управлять нашим модулем, например включить светодиод нажав кнопку COM 1 и погасить COM 2(надеюсь догадались подключить к GPIO13). Для отправки текстового сообщения нажмите SEND, в поле под RECEIVE мы должны получить ответ от ESP8266, поля NAME, IP, PORT, команд и сообщения можно менять.
Ну и немножко о особенности программы, вы увидите что в терминал постоянно приходит пустой массив COMMAND=0, это программа каждую примерно секунду отправляет, что бы удержать связь с модулем. Если этого не делать то примерно 5-7 секунд бездействия ваш ANDROID или другая программа попытается сделать запрос в интернет и модуль не понимая разорвет связь, имейте ввиду, на будущее.