作为连接手机APP与的节点的中枢我把它称为控制中心,对于它的功能,一是接收APP的命令识别后再翻译命令发送到节点,控制节点上的传感器等;二是语音提示。
它的通信示意图如下:
我的设计思路:
一、STM32自动配置ESP8266
用STM32的串口发送AT指令配置WIFI模块,要注意的是发送一条指令后要等待模块返回OK才能发送下一条指令,否则模块会不能识别命令,导致配置失败。完成ESP8266的配置只需要STM32能识别到模块返回的信息或者使用延时等待指令配置完成,在这里可以两者结合使用,保证配置的可靠性。我的配置命令如下:
1、AT+CWMODE=3 AP兼STA模式 串口识别OK
2、AT+RST 复位 返回一堆乱码,不用识别,做延时处理
3、AT+CWJAP="这里填入你要链接的室内路由器的名称","要连接的路由器的密码" 串口识别OK
4、AT+CIPMUX=1 启动多连接 串口识别OK
5、AT+CIPSERVER=1,8080 开启服务器 端口:8080 串口识别OK
注意:OK后面其实还有一个“\r\n”
到这里模块就配置完成了,当然发送接收数据还要做一下处理。下面分享一下我识别命令的方法。
void USART1_IRQHandler(void) //esp8266接收中断
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Uart1_buffer[uart1_cnt] = USART_ReceiveData(USART1);
if(ESP8266_Config_Done==0)
{
if(Uart1_buffer[0]=='O')
{
uart1_cnt++;
}
}
}
if(ESP8266_Config_Done==0&&uart1_cnt==4) //check OK
{
if(Uart1_buffer[0]=='O'&&Uart1_buffer[1]=='K'&&Uart1_buffer[2]=='\r'&&Uart1_buffer[3]=='\n')
{
AT_OK_Flag = 1;
uart1_cnt = 0;
for(i=0;i<4;i++) Uart1_buffer[i] = 0;
}
else
{
uart1_cnt = 0;
}
}
else if(uart1_cnt>4)
{
uart1_cnt = 0;
}
}
上面的代码仅仅是识别模块返回的OK,收数据可以使用同样的方法。
命令字符串:
u8 CWMODE3[]="AT+CWMODE=3\r\n"; //设置模块的工作的模式为ap+station模式
u8 CWJAP[]="AT+CWJAP=\"max\",\"123456789a\"\r\n";//设置连接的路由器
u8 RST[]="AT+RST\r\n"; //重启模块使AT+CWMODE模式生效
u8 CIPMUX[]="AT+CIPMUX=1\r\n"; //启动多连接
u8 CIPSERVER[]="AT+CIPSERVER=1,8080\r\n";//开启服务器模式,端口号8000
u8 CIFSR[]="AT+CIFSR\r\n";
//ESP8266设置函数
void ESP8266_Set(u8 *puf)
{
while(*puf!='\0')
{
UART1SendByte(*puf);
puf++;
}
}
ESP8266初始化为AP+STA模式,开启服务器的初始化函数如下:
void ESP8266_Init(void)
{
//模式:ap + sta
while(1)
{
ESP8266_Set(CWMODE3);//返回ok
delay_ms(1000);
if(AT_OK_Flag ==1)
{
AT_OK_Flag = 0;
break;
}
}
//复位
ESP8266_Set(RST);//返回一大溜,不用判断返回
delay_ms(3000);
delay_ms(3000);
delay_ms(3000);
delay_ms(3000);
delay_ms(3000);
delay_ms(3000);
delay_ms(3000);
delay_ms(3000);
//多连接
while(1)
{
ESP8266_Set(CIPMUX);//返回ok
delay_ms(1000);
if(AT_OK_Flag ==1)
{
AT_OK_Flag = 0;
break;
}
}
//连接路由器
ESP8266_Set(CWJAP);//返回ok
while(AT_OK_Flag !=1);
AT_OK_Flag = 0;
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
printf("\r\n OK\r\n");
//创建服务器
ESP8266_Set(CIPSERVER);//返回ok
while(AT_OK_Flag !=1);
AT_OK_Flag = 0;
ESP8266_Set(CIFSR);
delay_ms(3000);
ESP8266_Config_Done = 1;
printf("\r\n esp8266 init ok!\r\n");
}
感觉延时有点多哈,这个根据自己的硬件环境调试,没毛病。配置完成后怎么发送接收数据呢?其实就是多串口的操作,只要熟悉串口,老铁没毛病,接收数据可以像识别OK那样。可以使用网络调试助手看看esp8266接收到的数据到底是什么格式,在这之前当让先要连接到模块的服务器上,是同AT指令(AT+CIFSR)查看IP地址,假如用网络调试助手发送一个“1110”,esp8266收到数据格式: +IPD,0,4:1110,它的数据格式:+IPD,连接设备ID,数据长度:数据。
那么发送数据就更简单了,首先发送一个AT指令,AT+CIPSEND=0,5 ,0:0号客户端,5:字节长度。使用函数封装一下方便使用:
u8 SEND5[]="AT+CIPSEND=0,5\r\n";
u8 SEND6[]="AT+CIPSEND=0,6\r\n";
void ESP8266_Send(char *buf,u16 len)
{
int i=0;
if(len==5)
{
ESP8266_Set(SEND5);
delay_ms(50);
}
else
{
ESP8266_Set(SEND6);
delay_ms(50);
}
for(i=0;i<len;i++)
{
UART1SendByte(*buf);
buf++;
}
}
这里的长度我使用了两种,方便系统应用。
语音提示其实就是加上了一个语音播报模块,可以使用TTS语音合成工具制作想要的提示音,比如:“欢迎光临”之类的。
下章预告:节点之万能遥控器