STM32物联网项目——WIFI模块联网

程序功能

1、智能配网;

2、上电自动连接WIFI与TCP服务器;

3、间隔1s推送SHT30的温湿度至TCP服务器;

4、接收TCP服务器指令,控制继电器与蜂鸣器;


此项目使用的ESP-12S WiFi 模块是由安信可科技开发的,其规格说明、接口定义手册如下:

链接:https://pan.baidu.com/s/1EqaPRBdUi3dGTrq-f3I6Xg 
提取码:b9fi 
--来自百度网盘超级会员V2的分享

另外,关于ESP8266的AT控制命令集介绍以及ESP8266的AT控制命令的使用实例手册如下:

链接:https://pan.baidu.com/s/1tUCxkR48ThYqr5N_E4y8Kw 
提取码:ncgb 
--来自百度网盘超级会员V2的分享

!!!一定要详细查看AT命令介绍及使用实例


WIFI电路原理图:

  • 配网步骤

步骤一:开发板进入配网模式;

步骤二: 手机连接 AP(路由器或其它 WIFI 热点)

步骤: 微信进入安兴可微信公众号;

步骤四:点击安兴可微信公众号右下角的 WIFI 配置,进入配置页面;

步骤五:点击开始配置,输入 WI-FI 密码,点击连接;

步骤六:等待配置成功,如果配置失败,重复步骤三至五。


初始化,这里只显示串口2的配置:

配置串口2

 

串口2DMA配置

开启串口2全局中断(由于要使用空闲中断)

 代码,这里只显示部分:

 ESP8266初始化

/*
	* @name   Init
	* @brief  ESP8266初始化
	* @param  None
	* @retval None      
*/
static void Init() 
{
	//复位模组
	HAL_GPIO_WritePin(WIFI_RST_GPIO_Port,WIFI_RST_Pin,GPIO_PIN_RESET);
	HAL_Delay(10);
	HAL_GPIO_WritePin(WIFI_RST_GPIO_Port,WIFI_RST_Pin,GPIO_PIN_SET);
	
	//使能模组
	HAL_GPIO_WritePin(WIFI_EN_GPIO_Port,WIFI_EN_Pin,GPIO_PIN_SET);
	//延时500ms,待WIFI稳定,准备接收AT指令
	HAL_Delay(500);
	

	Timer6.usDelay_Timer = 0;
	do
	{
		//DMA接收设置
   	ESP8266.DMA_Receive_Set();
		
		//发送AT指令
		UART2.SendString((uint8_t*)"AT\r\n");
		//延时100ms,等待接收
		HAL_Delay(100);
		
		//打印消息
		printf("%s",UART2.pucRec_Buffer);
		
		//超时处理
		if(Timer6.usDelay_Timer >= TIMER6_10S)
		{
			ESP8266.Error();
			break;
		}
	}
	while(strstr((const char*)UART2.pucRec_Buffer,"OK") == NULL);
}

WIFI模块配网


/*
	* @name   SmartConifg
	* @brief  WIFI配网
	* @param  None
	* @retval None      
*/
static void SmartConifg()
{
	if(ESP8266.SmartConifg_Flag == TRUE)
	{
		//清除TCP连接成功状态,避免串口空闲中断清除缓存,导致配网失败
		ESP8266.TCP_Connect_Status  = FALSE;
		
		//关闭指示灯
		LED.LED_OFF(LED2);
		LED.LED_OFF(LED3);
		
		//退出透传模式
		*(UART2.pucSend_Buffer + 0) = '+';
		*(UART2.pucSend_Buffer + 1) = '+';
		*(UART2.pucSend_Buffer + 2) = '+';
		UART2.SendArray(UART2.pucSend_Buffer,3);
		HAL_Delay(1000);
		
		//配网
		SendAT((uint8_t*)"AT\r\n",(uint8_t*)"OK");                //测试AT	
    SendAT((uint8_t*)"ATE0\r\n",(uint8_t*)"OK");              //关闭回显
    SendAT((uint8_t*)"AT+CWMODE_CUR=1\r\n",(uint8_t*)"OK");   //WIFIÄ模式为STA模式
    SendAT((uint8_t*)"AT+CWAUTOCONN=1\r\n",(uint8_t*)"OK");   //上电自动配网
    SendAT((uint8_t*)"AT+CWSTARTSMART=2\r\n",(uint8_t*)"OK"); //配SmartConfig(SmartConfig为AirKiss)
		
		printf("Start SmartConfig:\r\n");	
		//等待配网,3分钟超时退出
		Timer6.usDelay_Timer = 0;
		while(Timer6.usDelay_Timer < TIMER6_3min)
		{
			//DMA接收设置
			ESP8266.DMA_Receive_Set();
			
			//LED2快闪
			HAL_Delay(100);
			LED.LED_Flip(LED2);
			
			//打印信息
			printf("%s",UART2.pucRec_Buffer);
			
			//判断获取AP
			if(strstr((const char*)UART2.pucRec_Buffer, "Smart get wifi info") != NULL) //获取到AP信息
			{
				Timer6.usDelay_Timer = TIMER6_3min - TIMER6_10S;
			}
			
			//判断连接AP
			if(strstr((const char*)UART2.pucRec_Buffer, "connected wifi") != NULL) //成功连接AP
			{
				SendAT((uint8_t*)"AT+CWSTOPSMART\r\n",(uint8_t*)"OK"); //停止SmartConfig
				break;
			}
		}
		
		//输出信息	
		if(Timer6.usDelay_Timer < TIMER6_3min)
		{
			printf("\r\n\r\nSmartconfig Success!\r\n");
			ESP8266.TCP_Reconnect_Timer = TIMER6_10S; //立马连接TCP
			//清除标志位
		  ESP8266.SmartConifg_Flag = FALSE;
		}
		else
		{
			printf("\r\n\r\nSmartconfig Fail!\r\n");
			ESP8266.TCP_Reconnect_Timer = 0;
		}
		//关闭LED2
		LED.LED_OFF(LED2);
	}
}

 通过TCP连接服务器

/*
	* @name   TCP_Connect_Server
	* @brief  通过TCP连接服务器
	* @param  None
	* @retval None      
*/
static void TCP_Connect_Server()
{
	uint8_t AP_Connect_Flag = FALSE; //清除AP连接标志位,为TRUE才连接
	
	SendAT((uint8_t*)"AT\r\n",(uint8_t*)"OK");              		
  SendAT((uint8_t*)"ATE0\r\n",(uint8_t*)"OK");           
  SendAT((uint8_t*)"AT+CWMODE_CUR=1\r\n",(uint8_t*)"OK"); 
	//获取IP
	Timer6.usDelay_Timer = 0;
	do
	{	
	  ESP8266.DMA_Receive_Set();
		UART2.SendString((uint8_t*)"AT+CIFSR\r\n");
		HAL_Delay(1000);
		
		printf("%s",UART2.pucRec_Buffer);
		
		if(Timer6.usDelay_Timer >= TIMER6_10S)
		{
			ESP8266.Error();
			break;
		}
	}
	while(strstr((const char*)UART2.pucRec_Buffer,"0.0.0.0") != NULL);
	//控制WIFI指示灯
	if(Timer6.usDelay_Timer < TIMER6_10S)
	{
		LED.LED_ON(LED2);	
		AP_Connect_Flag = TRUE;
		printf("AP connect success!\r\n");
	}
	else
	{
		LED.LED_OFF(LED2);
		AP_Connect_Flag = FALSE;
		printf("AP connect fail,auto entry Smartconfig mode!\r\n");
		ESP8266.SmartConifg_Flag = TRUE;
	}	
	
	//等待稳定连接到AP
	Timer6.usDelay_Timer = 0;
	do
	{
	  ESP8266.DMA_Receive_Set();
		UART2.SendString((uint8_t*)"AT\r\n");
		HAL_Delay(100);
		
		printf("%s",UART2.pucRec_Buffer);

		if(Timer6.usDelay_Timer >= TIMER6_10S)
		{
			ESP8266.Error();
			break;
		}
	}
	while(strstr((const char*)UART2.pucRec_Buffer,"OK") == NULL);
	
	//连接服务器
	if(AP_Connect_Flag == TRUE)
	{	
		printf("Connect TCP Server!\r\n");
		
		Timer6.usDelay_Timer = 0;
		do
		{
			ESP8266.DMA_Receive_Set();
			UART2.SendString(TCP_Server);
			HAL_Delay(500);
			
			printf("%s",UART2.pucRec_Buffer);

			if(Timer6.usDelay_Timer >= TIMER6_10S)
			{
				printf("Connect TCP Server Failure!\r\n");		
				
				ESP8266.TCP_Connect_Status = FALSE;
				LED.LED_OFF(LED3);
				break;
			}
			
			//连接到服务器
			if(strstr((const char*)UART2.pucRec_Buffer,"CONNECT") != NULL)
			{
				printf("Connect TCP Server Success!\r\n");

				//开启透传模式
				SendAT((uint8_t*)"AT+CIPMODE=1\r\n",(uint8_t*)"OK"); 
				SendAT((uint8_t*)"AT+CIPSEND\r\n",(uint8_t*)">");   
				
				ESP8266.TCP_Connect_Status = TRUE;
				LED.LED_ON(LED3);
				break;
			}
		}
		while(strstr((const char*)UART2.pucRec_Buffer,"CONNECT") == NULL);
		
		//DMA接收设置
		ESP8266.DMA_Receive_Set();
	}
}
  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西红柿鸡蛋超级美味

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

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

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

打赏作者

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

抵扣说明:

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

余额充值