PROGCONT.RU

Вход Регистрация
О САЙТЕ ГЛАВНАЯ
 

ESP8266 первая прошивка HELLO WORLD и управляем светодиодом через ANDROID устройство.

 Как обычно светодиод, отправляем 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, вот ссылка.

Download TestSoftAP.apk

 Теперь как всем этим пользоваться!
 Допустим подключили, прошили наш ESP8266, появилась наша точка доступа как ESP8266, подключаемся к ней, пароль не нужен. Если есть соединение с компьютером через терминал, то будут приходить соответствующие сообщения, далее запускаем нашу программу и жмем CON, если все правильно то мы можем управлять нашим модулем, например включить светодиод нажав кнопку COM 1 и погасить COM 2(надеюсь догадались подключить к GPIO13). Для отправки текстового сообщения нажмите SEND, в поле под RECEIVE мы должны получить ответ от ESP8266, поля NAME, IP, PORT, команд и сообщения можно менять.
 Ну и немножко о особенности программы, вы увидите что в терминал постоянно приходит пустой массив COMMAND=0, это программа каждую примерно секунду отправляет, что бы удержать связь с модулем. Если этого не делать то примерно 5-7 секунд бездействия ваш ANDROID или другая программа попытается сделать запрос в интернет и модуль не понимая разорвет связь, имейте ввиду, на будущее.

Статья №38 Дата:09/04/2017

Комментарии.