🙌Домашняя страница программиста Акинаямы 😂oi Игрок на пенсии, увлекается Java, большими данными, микроконтроллерами и Интернетом вещей, любит технологии, технологии не виноваты. 🎉Добро пожаловать, подписывайтесь🔎Мне нравится👍Собрать⭐️Оставить сообщение📝
В процессе изучения Интернета вещей первое, что приходит на ум, это Bluetooth и Wi-Fi. Среди Wi-Fi относительно известен быстрый рост esp32, который также неотделим от его встроенного модуля Bluetooth. сам может быть подключен. Маршрутизатор также можно использовать в качестве точки доступа для подключения к нему вашего мобильного телефона. В этой статье в основном объясняются следующие аспекты:
ESP8266этоЧип контроллера Ethernet,От Эспрессиф Системс(Espressif Systems)посадочная дистанция。этоНедорогой и высокопроизводительный модуль Wi-Fi.,Широко используется в Интернете вещи и область встраиваемых систем.
Конкретные параметры:
Введение в аппаратный интерфейс:
Согласно Espressif Systems существуют сотни официальных инструкций для esp8266, но наиболее часто используемых инструкций я перечислю лишь около 10. Другие читатели могут при необходимости загрузить руководство пользователя Espressif Systems.
Не забудьте открыть порт:Windows открывает определенные порты
В качестве помощника по отладке используется многофункциональный помощник по отладке Wildfire.
MQTT (Message Queuing Telemetry Transport) — это облегченный протокол передачи сообщений, основанный на модели публикации/подписки. Он подходит для таких сценариев, как Интернет вещей и мобильные приложения. Взаимосвязь между ними примерно такая же, как на следующем рисунке.
Конкретный протокол будет представлен в отдельной статье, когда появится такая возможность.
Код взят с Wildfire, полный код есть на форуме Wildfire, публичная информация
Общий код:
void ESP8266_Init ( void )
{
ESP8266_GPIO_Config ();
ESP8266_USART_Config ();
macESP8266_RST_HIGH_LEVEL();
macESP8266_CH_ENABLE();
}
static void ESP8266_GPIO_Config ( void )
{
/*Определяем структуру типа GPIO_InitTypeDef*/
GPIO_InitTypeDef GPIO_InitStructure;
/* Конфигурация CH_PD приколоть*/
macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure );
/* Конфигурация RST приколоть*/
macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN;
GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure );
}
static void ESP8266_USART_Config ( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART clock */
macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );
macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );
/* USART GPIO config */
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure);
/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);
/* USART1 mode config */
USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(macESP8266_USARTx, &USART_InitStructure);
/* прерывать Конфигурация */
USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //Включаем прерывание приема последовательного порта
USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //Включаем прерывание простоя последовательной шины
ESP8266_USART_NVIC_Configuration ();
USART_Cmd(macESP8266_USARTx, ENABLE);
}
static void ESP8266_USART_NVIC_Configuration ( void )
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x );
/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
Рутина окончена, следующий шаг — пересадка кода ESP8266, получение и отправка модульного кода.
/*
* функцияимя:ESP8266_Rst * описывать :Перезапустите модуль WF-ESP8266.
* входить :никто
* возвращаться : никто
* вызов :одеяло ESP8266_AT_Test вызов
*/
void ESP8266_Rst ( void )
{
#if 0
ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );
#else
macESP8266_RST_LOW_LEVEL();
Delay_ms ( 500 );
macESP8266_RST_HIGH_LEVEL();
#endif
}
/*
* функцияимя:ESP8266_Cmd * описывать : Отправьте AT-команду на модуль WF-ESP8266.
* входить : cmd, команда для отправки
* ответ1, ответ2, ожидаемый ответ, имеет значение NULL и не требует ответа. Эти два параметра находятся в логической связи ИЛИ.
* время ожидания, время ожидания ответа
* возвращаться : 1. Команда отправлена успешно.
* 0, отправка команды не удалась
* вызов :одеяловнешнийвызов
*/
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{
strEsp8266_Fram_Record .InfBit .FramLength = 0; //Получаем новые пакеты данных с нуля
macESP8266_Usart ( "%s\r\n", cmd );
if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //Нет необходимости получать данные
return true;
Delay_ms ( waittime ); //Задерживать
strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ||
( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
else if ( reply1 != 0 )
return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );
else
return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
}
/*
* функцияимя:ESP8266_AT_Test * описывать : Запустить AT-тест на модуле WF-ESP8266.
* входить :никто
* возвращаться : никто
* вызов :одеяловнешнийвызов
*/
//void ESP8266_AT_Test ( void )
//{
// macESP8266_RST_HIGH_LEVEL();
//
// Delay_ms ( 1000 );
//
// while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) ESP8266_Rst ();
//}
void ESP8266_AT_Test ( void )
{
char count=0;
macESP8266_RST_HIGH_LEVEL();
Delay_ms ( 1000 );
while ( count < 10 )
{
if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return;
ESP8266_Rst();
++ count;
}
}
/*
* функцияимя:ESP8266_Net_Mode_Choose * описывать :Выберите режим работы модуля WF-ESP8266.
* входить : enumMode, рабочий режим
* возвращаться : 1. Выбирайте успех
* 0, выбор не удался
* вызов :одеяловнешнийвызов
*/
bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{
switch ( enumMode )
{
case STA:
return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 );
case AP:
return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 );
case STA_AP:
return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 );
default:
return false;
}
}
/*
* функцияимя:ESP8266_JoinAP * описывать : Модуль WF-ESP8266 для подключения внешнего Wi-Fi
* входить : pSSID, строка имени Wi-Fi.
* :passWord,строка пароля WiFi
* возвращаться : 1,соединятьуспех * 0,соединятьнеудача * вызов :одеяловнешнийвызов
*/
bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
char cCmd [120];
sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );
}
/*
* функцияимя:ESP8266_BuildAP * описывать : Модуль WF-ESP8266 создает точку доступа Wi-Fi.
* входить : pSSID, строка имени Wi-Fi.
* :passWord,строка пароля WiFi
* : enunPsdMode, строка кода режима шифрования Wi-Fi.
* возвращаться : 1. Создано успешно
* 0, создание не удалось
* вызов :одеяловнешнийвызов
*/
bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode )
{
char cCmd [120];
sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode );
return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );
}
/*
* функцияимя:ESP8266_Enable_MultipleId * описывать : Модуль WF-ESP8266 запускается мультисоединять
* входить :enumEnUnvarnishTx,Конфигурация是否многосоединять
* возвращаться : 1,Конфигурацияуспех
* 0,Конфигурациянеудача
* вызов :одеяловнешнийвызов
*/
bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{
char cStr [20];
sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
return ESP8266_Cmd ( cStr, "OK", 0, 500 );
}
/*
* функцияимя:ESP8266_Link_Server * описывать : Модуль WF-ESP8266 для подключения внешнего сервера
* входить : enumE, сетевой протокол
* :ip, IP-строка сервера
* :ComNum, строка порта сервера
* :id, идентификатор модуля подключения сервера
* возвращаться : 1,соединятьуспех * 0,соединятьнеудача * вызов :одеяловнешнийвызов
*/
bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
{
char cStr [100] = { 0 }, cCmd [120];
switch ( enumE )
{
case enumTCP:
sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );
break;
case enumUDP:
sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );
break;
default:
break;
}
if ( id < 5 )
sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);
else
sprintf ( cCmd, "AT+CIPSTART=%s", cStr );
return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );
}
/*
* функцияимя:ESP8266_StartOrShutServer * описывать : Модуль WF-ESP8266 включает или выключает режим сервера.
* входить : enumMode, включить/выключить
* :pPortNum, строка номера порта сервера
* :pTimeOver, строка времени ожидания сервера, единица измерения: секунды.
* возвращаться : 1. Операция прошла успешно
* 0, операция не удалась
* вызов :одеяловнешнийвызов
*/
bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver )
{
char cCmd1 [120], cCmd2 [120];
if ( enumMode )
{
sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );
sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );
return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&
ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );
}
else
{
sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum );
return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );
}
}
/*
* функцияимя:ESP8266_Get_LinkStatus * описывать : получать WF-ESP8266 Статус совместного использования, больше подходит для использования с одним портом
* входить :никто
* возвращаться : 2. Получить IP
* 3,Учреждатьсоединять * 3,терятьсоединять * 0, не удалось получить статус
* вызов :одеяловнешнийвызов
*/
uint8_t ESP8266_Get_LinkStatus ( void )
{
if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) )
{
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) )
return 2;
else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) )
return 3;
else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) )
return 4;
}
return 0;
}
/*
* функцияимя:ESP8266_Get_IdLinkStatus * описывать : получать WF-ESP8266 Статус подключения порта (Id), более подходит для использования с несколькими портами.
* входить :никто
* возвращаться : Состояние порта (Id), младшие 5 бит являются действительными и соответствуют Id5~0 соответственно. Если определенный бит установлен в 1, это означает, что идентификатор установлен. Если он сброшен в 0, это означает, что идентификатор не установлен.
* вызов :одеяловнешнийвызов
*/
uint8_t ESP8266_Get_IdLinkStatus ( void )
{
uint8_t ucIdLinkStatus = 0x00;
if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) )
{
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) )
ucIdLinkStatus |= 0x01;
else
ucIdLinkStatus &= ~ 0x01;
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )
ucIdLinkStatus |= 0x02;
else
ucIdLinkStatus &= ~ 0x02;
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )
ucIdLinkStatus |= 0x04;
else
ucIdLinkStatus &= ~ 0x04;
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )
ucIdLinkStatus |= 0x08;
else
ucIdLinkStatus &= ~ 0x08;
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )
ucIdLinkStatus |= 0x10;
else
ucIdLinkStatus &= ~ 0x10;
}
return ucIdLinkStatus;
}
/*
* функцияимя:ESP8266_Inquire_ApIp * описывать : получать F-ESP8266 из AP IP
* входить : PAPIP, хранилище AP IP измассивизпервого адреса
* ucArrayLength, хранилище AP IP измассивиздлина
* возвращаться : 0, получение не удалось
* 1. Добейтесь успеха
* вызов :одеяловнешнийвызов
*/
uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength )
{
char uc;
char * pCh;
ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 );
pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" );
if ( pCh )
pCh += 6;
else
return 0;
for ( uc = 0; uc < ucArrayLength; uc ++ )
{
pApIp [ uc ] = * ( pCh + uc);
if ( pApIp [ uc ] == '\"' )
{
pApIp [ uc ] = '\0';
break;
}
}
return 1;
}
/*
* функцияимя:ESP8266_UnvarnishSend * описывать :Конфигурация Модуль WF-ESP8266 переходит в режим прозрачной передачи
* входить :никто
* возвращаться : 1,Конфигурацияуспех
* 0,Конфигурациянеудача
* вызов :одеяловнешнийвызов
*/
bool ESP8266_UnvarnishSend ( void )
{
if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) )
return false;
return
ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 );
}
/*
* функцияимя:ESP8266_ExitUnvarnishSend * описывать :КонфигурацияWF-ESP8266模块退出透传модель
* входить :никто
* возвращаться : никто
* вызов :одеяловнешнийвызов
*/
void ESP8266_ExitUnvarnishSend ( void )
{
Delay_ms ( 1000 );
macESP8266_Usart ( "+++" );
Delay_ms ( 500 );
}
/*
* функцияимя:ESP8266_SendString * описывать : Модуль WF-ESP8266 отправляет строку
* входить : enumEnUnvarnishTx, объявляет, включен ли прозрачный режим передачи.
* :pStr,Отправить из строки
* :ulStrLength,Отправить из строкииз字节数
* :ucId,КоторыйIDотправлятьизнить
* возвращаться : 1.Отправлено успешно
* 0, отправка не удалась
* вызов :одеяловнешнийвызов
*/
bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
{
char cStr [20];
bool bRet = false;
if ( enumEnUnvarnishTx )
{
macESP8266_Usart ( "%s", pStr );
bRet = true;
}
else
{
if ( ucId < 5 )
sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );
else
sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );
ESP8266_Cmd ( cStr, "> ", 0, 1000 );
bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );
}
return bRet;
}
/*
* функцияимя:ESP8266_ReceiveString * описывать : Модуль WF-ESP8266 получает строку
* входить : enumEnUnvarnishTx, объявляет, включен ли прозрачный режим передачи.
* возвращаться : 接收приезжатьизнить首地址
* вызов :одеяловнешнийвызов
*/
char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
{
char * pRecStr = 0;
strEsp8266_Fram_Record .InfBit .FramLength = 0;
strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
if ( enumEnUnvarnishTx )
pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
else
{
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
}
return pRecStr;
}