stm32f103c8t6+esp8266在WiFi下通过手机控制外设

2 篇文章 0 订阅
1 篇文章 0 订阅

stm32f103c8t6+esp8266在WiFi下通过手机控制外设

前言

通过上一篇,介绍了esp8266的基本功能,这篇将用stm32c8t6配合esp8266进行数据交互,实现用手机通过无线的方式去控制外设、开关等;这里相当于把stm32作为上一篇的串口助手和esp8266进行通信;说着挺容易,但实际做起来还是挺困难的,特别是对初学者来说,我也是废了很大劲,走了不少的弯路才把这个给做出来,这里也是希望给像我一样的初学者提供一点便捷吧!

准备材料

  1. STM32STM32F103C8T6
  2. 面包板
  3. LED灯5个,杜邦线若干根
  4. 蜂鸣器
  5. ST-LINK下载器
  6. esp8266-01
  7. 5.网络调试助手手机端

实验目的

用手机通过WiFi去控制外设,esp8266作为一个中介与手机和stm32进行通信,stm32负责初始化esp8266及接受来自esp8266的数据,并将这些数据转化成命令去控制相应的外设。
手机相当于终端去发送指令。

实验效果

esp8266➕stm32c8t6在wifi下通过手机控制外设


代码

主函数

主函数用到的代码,ESP8266的连接:USART3(PB10、PB11)
这个是我从网上找的一个工程改的,针对stm32f103c8t6这块板子,以前的代码用的定时器7,现在换成了定时器3,还有对esp8366的初始化,以及控制的外设做了一些修改,大家也可以根据自己的需求进行修改,这代码我测试了几次,除了有延时其他没有问题,但我觉得延时应该硬件上的问题。如果代码有问题欢迎大家指出来。代码解析,大家看注释吧!

 int main(void)
 {		
	char a[2];

	delay_init();	    	 			//延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 			//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
	LED_Init(); 	
		
	 
	 usart3_init(115200);	 				//串口初始化为115200
//   esp8266_start_trans();	   //esp8266进行初始化 ,其实初始化一次就可以了,后面调试程序的时候这个成功了就直接可以注释,不然每次都重启WiFi,效率低
	
						
	
	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.2\",8080","OK",200));//这命令要等到手机端与esp8266建立连接后才会返回0,结束循环
   USART3_RX_STA=0; //清空接收缓存区
	 led();//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);				//调试的时候可以watch一下变量a和接受缓存区USART3_RX_STA,追踪数据变化
			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;
		}
	//led();
	}

}

我说一下,我在这里碰到的问题,其实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)
{
	  
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
		esp8266_send_cmd("AT","OK",200); //AP+station模式
	esp8266_send_cmd("AT+CWMODE=3","OK",200);
	//Wifi模块重启
	esp8266_send_cmd("AT+RST","OK",200);
	delay_ms(1000);         //延时3S等待重启成功
	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);

}
//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
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;
} 
//ESP8266发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置)
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并没有预想的的那么好,主要是它这个网络不太稳定,有延时,是硬件问题还是程序问题不太清楚,第一次弄,没有经验。以后可能还会结合一下云平台,连一下小爱同学等等。

代码

需要代码的小伙伴好多,一个一个发实在不方便,代码先贴这
这里的代码是我根据上面的改的一个小项目"光照故障检测系统",大体结构还是一样的。

github:
https://github.com/xiaofeifeii/stm32_projects.git

gitee
https://gitee.com/xiaofei-actinide/esp8266-stm32f103c8t6.git

  • 39
    点赞
  • 313
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
STM32F103C8T6是一款基于ARM Cortex-M3内核的单片机,具有丰富的外设接口和高性能的处理能力。它广泛用于各种嵌入式应用,包括工业控制、物联网等。 ESP8266是一款低功耗的Wi-Fi模块,以其高集成度和低成本而备受关注。它内置TCP/IP协议栈,可以通过串口和微控制器进行通信,方便实现物联网设备的无线联网功能。 OneNet是中国移动物联网开放平台,作为IoT(物联网)的云平台,提供云计算、大数据分析、可视化展示和数据存储等功能。通过OneNet平台,用户可以方便地在云端管理、存储和处理传感器数据,并通过手机应用或Web页面实现对物联网设备的远程控制。 将STM32F103C8T6ESP8266结合使用,可以实现物联网设备的智能控制和数据传输。STM32F103C8T6通过串口与ESP8266进行通信,从而实现与OneNet平台的连接。通过OneNet提供的API,可以实现对物联网设备的远程控制,比如通过手机应用控制智能家居设备的开关状态。 同时,STM32F103C8T6还可以通过ESP8266将传感器数据上传到OneNet平台,实现数据的存储和展示。比如,将温湿度传感器的数据上传到云端,在手机应用上展示当前室内的温湿度值。 总的来说,STM32F103C8T6ESP8266结合使用,通过OneNet平台可以方便地实现物联网设备的远程控制和数据传输。这种方案适用于许多物联网应用场景,可以提高设备的智能化程度和用户体验。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小飞爱学习1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值