stm32f103c8t6+esp8266在WiFi下通过手机控制外设
前言
通过上一篇,介绍了esp8266的基本功能,这篇将用stm32c8t6配合esp8266进行数据交互,实现用手机通过无线的方式去控制外设、开关等;这里相当于把stm32作为上一篇的串口助手和esp8266进行通信;说着挺容易,但实际做起来还是挺困难的,特别是对初学者来说,我也是废了很大劲,走了不少的弯路才把这个给做出来,这里也是希望给像我一样的初学者提供一点便捷吧!
准备材料
- STM32STM32F103C8T6
- 面包板
- LED灯5个,杜邦线若干根
- 蜂鸣器
- ST-LINK下载器
- esp8266-01
- 5.网络调试助手手机端
实验目的
用手机通过WiFi去控制外设,esp8266作为一个中介与手机和stm32进行通信,stm32负责初始化esp8266及接受来自esp8266的数据,并将这些数据转化成命令去控制相应的外设。 手机相当于终端去发送指令。
实验效果
[video(video-mCiUsmr8-1625823320926)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=931527839)(image-https://ss.csdn.net/p?http://i2.hdslb.com/bfs/archive/7c615df3fd52a632f99866b8441de7aa6af9a515.jpg)(title-esp8266?stm32c8t6在wifi下通过手机控制外设)]
代码
主函数
主函数用到的代码,ESP8266的连接:USART3(PB10、PB11) 这个是我从网上找的一个工程改的,针对stm32f103c8t6这块板子,以前的代码用的定时器7,现在换成了定时器3,还有对esp8366的初始化,以及控制的外设做了一些修改,大家也可以根据自己的需求进行修改,这代码我测试了几次,除了有延时其他没有问题,但我觉得延时应该硬件上的问题。如果代码有问题欢迎大家指出来。代码解析,大家看注释吧!
int main(void)
{
char a[2];
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
usart3_init(115200);
while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.2\",8080","OK",200));
USART3_RX_STA=0;
led();
while(1)
{
if(USART3_RX_STA&0x8000){
printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);
sprintf(a,"%s",USART3_RX_BUF);
printf("a=%s",a);
if(strstr((const char*)a,"off")) {
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
else if(strstr((const char*)a,"on")) {
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
else if(strstr((const char*)a,"led")) {
led1();
}
else if(strstr((const char*)a,"sound")){
GPIO_SetBits(GPIOC,GPIO_Pin_14);
delay_ms(1000);
GPIO_ResetBits(GPIOC,GPIO_Pin_14);
}
USART3_RX_STA=0;
}
}
}
我说一下,我在这里碰到的问题,其实esp8266与stm32的数据交互,我们是看不到的,stm32给esp8266给stm发了什么,是我们所想要发的命令吗?我们不知道,数据中又没有前缀什么的我们也不清楚,怎么对他进行一个数据追踪就是个问题,我上网搜有用两个对串口进行数据追踪,一对用来和esp8266的正常通信,另外一对将数据打印到串口助手上进行数据追踪,但这种我感觉麻烦,我是采用debug的watch去追踪接受缓存区数组,直接看它的变量的变化。然后while(esp8266_send_cmd(“AT+CIPSTART=“TCP”,“192.168.4.2”,8080”,“OK”,200));这里得注意一下,这里要打开手机与esp8266进行tcp连接,不然一直卡在这死循环,/最后就是对数据处理,这就看C语言的基本功了,用strstr函数去匹配比较好,如果朋友有更好的方法也欢迎分享。
对esp8266初始化
#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
void esp8266_start_trans(void)
{
esp8266_send_cmd("AT","OK",200);
esp8266_send_cmd("AT+CWMODE=3","OK",200);
esp8266_send_cmd("AT+RST","OK",200);
delay_ms(1000);
delay_ms(1000);
esp8266_send_cmd("AT+CWSAP=\"ESP\",\"12345678\",11,3","OK",200);
esp8266_send_cmd("AT+CIPMODE=1","OK",20);
esp8266_send_cmd("AT+CIPMUX=1","OK",20);
}
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd);
if(ack&&waittime)
{
while(--waittime)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)
{
if(esp8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
u8* esp8266_check_cmd(u8 *str)
{
char *strx=0;
if(USART3_RX_STA&0X8000)
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
这里就是对esp8266的初始化,相关的AT指令我上一篇都相关的介绍,值得注意是这条指令while(fanesp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.2\",8080","OK",200)); 我放到主函数里并加了一个while循环,这条指令很关键,如果发完后,没有打开手机与他建立tcp连接,返回错误后等待时间结束它就不发了,而等待时间也不好判断,这还取决于每个人的手速,所以加个while放主函数里,其他指令都是自动完成的这个不是。
总结
到这里就结束了,给我的感觉esp8266并没有预想的的那么好,主要是它这个网络不太稳定,有延时,是硬件问题还是程序问题不太清楚,第一次弄,没有经验。以后可能还会结合一下云平台,连一下小爱同学等等。
|