智能家具--第三章 控制中心

      作为连接手机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语音合成工具制作想要的提示音,比如:“欢迎光临”之类的。

       下章预告:节点之万能遥控器

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

soen_lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值