文章目录[隐藏]
目录
前言
哎哎哎,发觉好久没有更新博客了,最近一直事情比较多,也没什么时间注意博客,不过接下来时间会有了,继续更新STM32F1和MSP430的文章,觉得有帮助的记得收藏点赞哦!关注博主,更多新鲜知识第一时间知道,不容错过哦!
今天这一讲注意涉及到WiFi模块ESP8266的使用,主要是用WiFi来控制LED0亮灭,包括会详细介绍一下该模块的使用,废话不多说,正题进入···
参考资料:WIFI模块ATK-ESP8266(ESP 01) — 正点原子资料下载中心 1.0.0 文档 (openedv.com)
一、ESP8266介绍
互联网+时代,无线传输、无线通信尤为重要,那么在WiFi通信方面就数ESP8266用的最为广泛了,因为ESP8266是一个具备高性能的模块,在不了解其原理的情况下,只要有一定的串口知识理解,那么就可以轻松上手该模块,进而实现手机WiFi操作。简单来说,就是利用编程来实现WiFi模块的透明传输。
一些使用参考资料可以参考正点原子官网
这里我们看到该模块有8个接口,但是实际上我们只需要用到五个接口就可以操作这个WiFi模块了,主要是3.3V、GND、RXD、TXD、EN这五个接口可以看上图,RXD接单片机上的TXD接口(这里我用的是串口3,所以接PB10),TXD接单片机上的RXD接口(即PB11),EN接3.3V即可。
那么他有哪些指令呢?
博客上有许多关于AT指令的文章,这里推荐一篇文章给大家:
ESP8266 WIFI模块AT指令汇总_尘埃世界的博客-CSDN博客_esp8266at指令集
该博主详细地介绍了许多指令,大家可以不断尝试各种指令,在这我就不会详细介绍这些指令了,相信大家仔细阅读该博主的文章,肯定也有所收获,这里我只是作为一名小小搬运工哈哈
这里你会发现它有三种模式即STA、AP、混合,那么我们该如何使用呢,这里简单说明一下
STA模式就是类似一个接收模式,就是开启该模式后,你只能通过串口给他发送信息,ESP8266只负责接收,而不会产生一个热点,(手机或其他设备是找不到热点的)然后这模式我一般会直接用来调试各种AT指令,通过串口调试助手进行数据传输
AP模式就简单了,就是它发出去一个热点,供手机或其他设备连接,如果要实现手机连热点来控制单片机,那么该模式就要开启了。
混合模式就是两者同时实现。
接下来关于传输的方式,一般都是采用透传比较好,如果不采用透传模式,那么每发送一次数据都要发送一次AT+CIPSEND=<param>的指令就显得尤为麻烦,因此模式一般设置为透传模式,退出透传模式就给指令“+++”即可,后面代码里也有具体涉及到透传模式的退出操作,后面代码再一一介绍。
二、如何实现WiFi传输?代码详解附上
串口3初始化函数:
#include "delay.h"
#include "usart3.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "timer.h"
u8 res;
//串口接收发送缓存区
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];
vu16 USART3_RX_STA=0;
//串口3中断
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0)
{
if(USART3_RX_STA<USART3_MAX_RECV_LEN)
{
TIM_SetCounter(TIM7,0);
if(USART3_RX_STA==0)
{
TIM_Cmd(TIM7,ENABLE);
}
USART3_RX_BUF[USART3_RX_STA++]=res;
}else
{
USART3_RX_STA|=1<<15;
}
}
}
}
//串口3初始化
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
USART_DeInit(USART3);
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM7_Int_Init(1000-1,7200-1);
USART3_RX_STA=0;
TIM_Cmd(TIM7,DISABLE);
}
//串口3printf函数,保证输入不大于设定长度
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF);
for(j=0;j<i;j++)
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
ESP8266初始化函数:
#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "lcd.h"
//ESP8266初始化
void esp8266_start_trans(void)
{
esp8266_send_cmd("AT+CWMODE=2","OK",50);//设置为AP模式
esp8266_send_cmd("AT+RST","ready",20);//重启
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
esp8266_send_cmd("AT+CWSAP=\"ESP8266\",\"12345678\",1,4","OK",200);//设置WiFi名称、密码,模式
esp8266_send_cmd("AT+CIPMUX=1","OK",20);//进入透传模式
esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);//设置端口8080
esp8266_send_cmd("AT+CIPSEND","OK",50);//开始发送数据
}
//退出透传模式
u8 esp8266_quit_trans(void)
{
u8 result=1;
u3_printf("+++");
delay_ms(1000);
result=esp8266_send_cmd("AT","OK",20);
if(result)
printf("quit_trans failed!");
else
printf("quit_trans success!");
return result;
}
//发送指令,返回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;
}
//检测是否应答指令
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发送指令(数据)的函数,暂时用不到,可以自己斟酌加上
//u8* esp8266_send_data(u8 *cmd,u16 waittime)
//{
// char temp[5];
// char *ack=temp;
// USART3_RX_STA=0;
// u3_printf("%s",cmd);
// LCD_ShowString(30,130,200,16,16,cmd);
// if(waittime)
// {
// while(--waittime)
// {
// delay_ms(10);
// if(USART3_RX_STA&0X8000)
// {
// USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
// ack=(char*)USART3_RX_BUF;
// printf("ack:%s\r\n",(u8*)ack);
// LCD_ShowString(30,190,200,16,16,(u8*)ack);
// USART3_RX_STA=0;
// break;
// }
// }
// }
// return (u8*)ack;
//}
主函数:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart3.h"
#include "esp8266.h"
#include "string.h"
#include "timer.h"
#include "led.h"
int main(void)
{
char a[15];
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
usart3_init(115200);
LED_Init();
esp8266_start_trans(); //ESP8266初始化
while(1)
{
if(USART3_RX_STA&0x8000)
{
sprintf(a,"%s",USART3_RX_BUF);
if(strstr((const char*)a,"on")) //输入on,LED0亮
LED0=0;
if(strstr((const char*)a,"off")) //输入off,LED0灭
LED0=1;
USART3_RX_STA=0;
}
}
}
三、结果实现流程与展示
下面如何用手机实现控制呢?
1、首先在手机端下载一个TCP,在各大浏览器搜索就有了
2、打开WiFi,搜索你设置的热点并连接
3、查看该WiFi的地址
这里可能会有一定的误差错误,可能会是192.168.4.1,好像要正确的我是去串口调试助手查了一下,跟这里又不太一样,具体原因我也不太了解,如果手机上显示的IP地址不对,那就只能利用调试助手进行一下AT指令查询,这样比较准确,就把串口更改一下就行了(记得代码串口也要更改,自己尝试上手比较有收获)。
4、打开TCP,输入地址和端口,连接上热点,然后就可以进行各种命令了
结果:
输入on
输入off
四、总结
哈哈,学到这里就会发现你已经轻松掌握了如何使用ESP8266WiFi串口模块了,那么接下来就是对所学知识的巩固与实践操作,再然后就是利用该模块进阶完成各种设计,祝大家会有所收获,同时这里附上一个优秀博主的文章,我也是从那里吸取经验的,他那里有更为详细得讲解,遇到问题直接扣扣博主,一定会有所解决的,加油
优秀文章链接:
【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)_Yngz_Miao的博客-CSDN博客_stm32wifi模块
以上就是我这一期的全部内容了,讲的可能不太好,希望大家多多包涵,也可以给博主一个赞,你的每一次点赞都是我前进方向上的动力,一起加油!
走过路过觉得可以给博主点个赞哈哈
题外话:
挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”
学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈
版权声明:本文为CSDN博主「不说二话的自家人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45930808/article/details/119742569
目录
前言
哎哎哎,发觉好久没有更新博客了,最近一直事情比较多,也没什么时间注意博客,不过接下来时间会有了,继续更新STM32F1和MSP430的文章,觉得有帮助的记得收藏点赞哦!关注博主,更多新鲜知识第一时间知道,不容错过哦!
今天这一讲注意涉及到WiFi模块ESP8266的使用,主要是用WiFi来控制LED0亮灭,包括会详细介绍一下该模块的使用,废话不多说,正题进入···
参考资料:WIFI模块ATK-ESP8266(ESP 01) — 正点原子资料下载中心 1.0.0 文档 (openedv.com)
一、ESP8266介绍
互联网+时代,无线传输、无线通信尤为重要,那么在WiFi通信方面就数ESP8266用的最为广泛了,因为ESP8266是一个具备高性能的模块,在不了解其原理的情况下,只要有一定的串口知识理解,那么就可以轻松上手该模块,进而实现手机WiFi操作。简单来说,就是利用编程来实现WiFi模块的透明传输。
一些使用参考资料可以参考正点原子官网
这里我们看到该模块有8个接口,但是实际上我们只需要用到五个接口就可以操作这个WiFi模块了,主要是3.3V、GND、RXD、TXD、EN这五个接口可以看上图,RXD接单片机上的TXD接口(这里我用的是串口3,所以接PB10),TXD接单片机上的RXD接口(即PB11),EN接3.3V即可。
那么他有哪些指令呢?
博客上有许多关于AT指令的文章,这里推荐一篇文章给大家:
ESP8266 WIFI模块AT指令汇总_尘埃世界的博客-CSDN博客_esp8266at指令集
该博主详细地介绍了许多指令,大家可以不断尝试各种指令,在这我就不会详细介绍这些指令了,相信大家仔细阅读该博主的文章,肯定也有所收获,这里我只是作为一名小小搬运工哈哈
这里你会发现它有三种模式即STA、AP、混合,那么我们该如何使用呢,这里简单说明一下
STA模式就是类似一个接收模式,就是开启该模式后,你只能通过串口给他发送信息,ESP8266只负责接收,而不会产生一个热点,(手机或其他设备是找不到热点的)然后这模式我一般会直接用来调试各种AT指令,通过串口调试助手进行数据传输
AP模式就简单了,就是它发出去一个热点,供手机或其他设备连接,如果要实现手机连热点来控制单片机,那么该模式就要开启了。
混合模式就是两者同时实现。
接下来关于传输的方式,一般都是采用透传比较好,如果不采用透传模式,那么每发送一次数据都要发送一次AT+CIPSEND=<param>的指令就显得尤为麻烦,因此模式一般设置为透传模式,退出透传模式就给指令“+++”即可,后面代码里也有具体涉及到透传模式的退出操作,后面代码再一一介绍。
二、如何实现WiFi传输?代码详解附上
串口3初始化函数:
#include "delay.h"
#include "usart3.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "timer.h"
u8 res;
//串口接收发送缓存区
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];
vu16 USART3_RX_STA=0;
//串口3中断
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0)
{
if(USART3_RX_STA<USART3_MAX_RECV_LEN)
{
TIM_SetCounter(TIM7,0);
if(USART3_RX_STA==0)
{
TIM_Cmd(TIM7,ENABLE);
}
USART3_RX_BUF[USART3_RX_STA++]=res;
}else
{
USART3_RX_STA|=1<<15;
}
}
}
}
//串口3初始化
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
USART_DeInit(USART3);
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM7_Int_Init(1000-1,7200-1);
USART3_RX_STA=0;
TIM_Cmd(TIM7,DISABLE);
}
//串口3printf函数,保证输入不大于设定长度
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF);
for(j=0;j<i;j++)
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
ESP8266初始化函数:
#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "lcd.h"
//ESP8266初始化
void esp8266_start_trans(void)
{
esp8266_send_cmd("AT+CWMODE=2","OK",50);//设置为AP模式
esp8266_send_cmd("AT+RST","ready",20);//重启
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
esp8266_send_cmd("AT+CWSAP=\"ESP8266\",\"12345678\",1,4","OK",200);//设置WiFi名称、密码,模式
esp8266_send_cmd("AT+CIPMUX=1","OK",20);//进入透传模式
esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);//设置端口8080
esp8266_send_cmd("AT+CIPSEND","OK",50);//开始发送数据
}
//退出透传模式
u8 esp8266_quit_trans(void)
{
u8 result=1;
u3_printf("+++");
delay_ms(1000);
result=esp8266_send_cmd("AT","OK",20);
if(result)
printf("quit_trans failed!");
else
printf("quit_trans success!");
return result;
}
//发送指令,返回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;
}
//检测是否应答指令
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发送指令(数据)的函数,暂时用不到,可以自己斟酌加上
//u8* esp8266_send_data(u8 *cmd,u16 waittime)
//{
// char temp[5];
// char *ack=temp;
// USART3_RX_STA=0;
// u3_printf("%s",cmd);
// LCD_ShowString(30,130,200,16,16,cmd);
// if(waittime)
// {
// while(--waittime)
// {
// delay_ms(10);
// if(USART3_RX_STA&0X8000)
// {
// USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
// ack=(char*)USART3_RX_BUF;
// printf("ack:%s\r\n",(u8*)ack);
// LCD_ShowString(30,190,200,16,16,(u8*)ack);
// USART3_RX_STA=0;
// break;
// }
// }
// }
// return (u8*)ack;
//}
主函数:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart3.h"
#include "esp8266.h"
#include "string.h"
#include "timer.h"
#include "led.h"
int main(void)
{
char a[15];
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
usart3_init(115200);
LED_Init();
esp8266_start_trans(); //ESP8266初始化
while(1)
{
if(USART3_RX_STA&0x8000)
{
sprintf(a,"%s",USART3_RX_BUF);
if(strstr((const char*)a,"on")) //输入on,LED0亮
LED0=0;
if(strstr((const char*)a,"off")) //输入off,LED0灭
LED0=1;
USART3_RX_STA=0;
}
}
}
三、结果实现流程与展示
下面如何用手机实现控制呢?
1、首先在手机端下载一个TCP,在各大浏览器搜索就有了
2、打开WiFi,搜索你设置的热点并连接
3、查看该WiFi的地址
这里可能会有一定的误差错误,可能会是192.168.4.1,好像要正确的我是去串口调试助手查了一下,跟这里又不太一样,具体原因我也不太了解,如果手机上显示的IP地址不对,那就只能利用调试助手进行一下AT指令查询,这样比较准确,就把串口更改一下就行了(记得代码串口也要更改,自己尝试上手比较有收获)。
4、打开TCP,输入地址和端口,连接上热点,然后就可以进行各种命令了
结果:
输入on
输入off
四、总结
哈哈,学到这里就会发现你已经轻松掌握了如何使用ESP8266WiFi串口模块了,那么接下来就是对所学知识的巩固与实践操作,再然后就是利用该模块进阶完成各种设计,祝大家会有所收获,同时这里附上一个优秀博主的文章,我也是从那里吸取经验的,他那里有更为详细得讲解,遇到问题直接扣扣博主,一定会有所解决的,加油
优秀文章链接:
【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)_Yngz_Miao的博客-CSDN博客_stm32wifi模块
以上就是我这一期的全部内容了,讲的可能不太好,希望大家多多包涵,也可以给博主一个赞,你的每一次点赞都是我前进方向上的动力,一起加油!
走过路过觉得可以给博主点个赞哈哈
题外话:
挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”
学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈
版权声明:本文为CSDN博主「不说二话的自家人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45930808/article/details/119742569
暂无评论