楼主最近做了一个基于STM32和ESP8266的简易WIFI信号检测仪,可以检测到当前连接WIFI的信号强度,并且在OLED屏幕显示,并且每隔2秒刷新
STM32最小系统开发板
ESP8266模块
OLED屏幕
PB6(I2C1_SCL)
PB7(I2C1_SDA)
PA9 USART1_TX ESP8266_RX
PA10 USART1_RX ESP8266_TX
PA2 USART2_TX 串口2,用来看数据和发送的命令
PA3 USART2_RX
1.ESP8266部分
ESP8266相信大家都玩过,这次的小项目就是把ESP8266设置为station模式,连接到手机热点,通过AT命令获取到RSSI值。从控制单片机连接ESP8266,并且发送命令连接到WIFI,不难,难是怎么获取到信号强度RSSI。
一开始我是用另一个串口连接到电脑看有没有成功连接到热点WIFI,并且获取信号强度RSSI。到了周末提取RSSI却是难到我(我比较笨,上个月才开始自己写代码),怎么把串口接收到的字符型数组保存为整数型尼,下面这篇文章帮到我了
https://blog.csdn.net/qq_44515486/article/details/124273457?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32%E4%B8%B2%E5%8F%A3%E5%8F%98%E6%95%B4%E6%95%B0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-124273457.142v40pc_rank_v36,185v2tag_show&spm=1018.2226.3001.4450
按照他的方法,成功提取到RSSI
上代码!!!!
#include "esp8266.h"
#include "usart.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart2.h"
#include "string.h"
#include
#include
//ESP8266初始化
u32 len=0;
u32 t=0;
u8 rssi[200]; //存放RSSI的数值
char *str_xx=",-"; //用来获取RSSI
char *loc;
char *token;
int RSSI=0;
void esp8266_start_trans(void)
{
//设置ESP8266为station模式,连接到ESP8266的热点,这个不懂的伙伴可以学习下ESP8266的玩法
esp8266_send_cmd("AT+CWMODE=1","OK",50);
esp8266_send_cmd("AT+RST","OK",50);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
esp8266_send_cmd("AT+CWQAP","OK",50);
esp8266_send_cmd("AT+CWJAP=\"ESP8266\",\"12345678\"","OK",1000);
RSSI=1;
esp8266_send_cmd("AT+CWJAP?","OK",50);//这里用来获取RSSI的数值
u3_printf("RSSI=%d\r\n",RSSI); //打印到串口2
}
//这里的函数就是一个发送AT命令的函数
*cmd是命令,ack是收到的应答,waittime是等待时间
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART_RX_STA=0;
printf("%s\r\n",cmd); //发送给ESP8266
u3_printf("%s\r\n",cmd); //电脑串口打印
if(ack&&waittime)
{
while(--waittime)
{
delay_ms(10);
if(USART_RX_STA&0X8000)//接收到ESP8266返回的数据
{
//下面这段函数用来打印ESP8266返回的数据
len=USART_RX_STA&0x3fff;/
for(t=0;t<len;t++)
{
rssi[t]=USART_RX_BUF[t];
USART_SendData(USART2, USART_RX_BUF[t]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
//重点是这一段代码,用来提取返回值的RSSI
if(RSSI)
{
loc=strstr((char*)USART_RX_BUF,str_xx);
token = strtok(loc,str_xx);
RSSI = atoi((char*)token);
}
u3_printf("\r\n\r\n");//²åÈë»»ÐÐ
USART_RX_STA=0
}
}
if(waittime==0)res=1;
}
return res;
}
```c
在这里插入代码片
主函数就没什么好讲的,不断刷新RSSI的数值,并且显示
int main(void)
{
extern u8 RSSI;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
EXTIX_Init();
uart_init(115200);
usart2_init(115200);
esp8266_start_trans();
OLED_Init(); //³õʼ»¯OLED
OLED_ColorTurn(0);//0Õý³£ÏÔʾ£¬1 ·´É«ÏÔʾ
OLED_DisplayTurn(0);//0Õý³£ÏÔʾ 1 ÆÁÄ»·×ªÏÔʾ
while(1)
{
LED0=!LED0;
OLED_Clear();
OLED_ShowString(10,16,"WIFI:ESP8266",16);
OLED_ShowString(10,32,"Rssi: - dbm",16);
OLED_ShowNum(68,32,RSSI,2,16);
OLED_Refresh();
delay_ms(5000);
esp8266_send_cmd("AT+CWJAP?","OK",50);
u3_printf("RSSI=%d\r\n",RSSI);
}
}
在这里插入代码片
完整的演示效果可以去我的B站看,求一键3连
https://www.bilibili.com/video/BV1ug411k7MA/
代码下载连接
链接:https://pan.baidu.com/s/18QHUYnECFQdArJ8CEXhqWQ
提取码:3sjt