admin管理员组文章数量:1540695
程序功能
1、智能配网;
2、上电自动连接WIFI与TCP服务器;
3、间隔1s推送SHT30的温湿度至TCP服务器;
4、接收TCP服务器指令,控制继电器与蜂鸣器;
此项目使用的ESP-12S WiFi 模块是由安信可科技开发的,其规格说明、接口定义手册如下:
链接:https://pan.baidu/s/1EqaPRBdUi3dGTrq-f3I6Xg
提取码:b9fi
--来自百度网盘超级会员V2的分享
另外,关于ESP8266的AT控制命令集介绍以及ESP8266的AT控制命令的使用实例手册如下:
链接:https://pan.baidu/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();
}
}
版权声明:本文标题:STM32物联网项目——WIFI模块联网 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727036584a1095112.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论