• 基于STM32和ESP8266的WIFI信号检测仪


    背景

    楼主最近做了一个基于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
    在这里插入代码片
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    主函数

    主函数就没什么好讲的,不断刷新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);	
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    在这里插入代码片
    
    • 1

    演示

    完整的演示效果可以去我的B站看,求一键3连
    https://www.bilibili.com/video/BV1ug411k7MA/

    在这里插入图片描述
    在这里插入图片描述
    代码下载连接
    链接:https://pan.baidu.com/s/18QHUYnECFQdArJ8CEXhqWQ
    提取码:3sjt

  • 相关阅读:
    Redis维护缓存的方案选择
    【CKA考试笔记】六、存储管理
    20.(arcgis api for js篇)arcgis api for js面采集(SketchViewModel)
    Mysql中数据表的约束
    Linux内核netLink套接字
    HTML、ASP.NET、XML、Javascript、DIV+CSS、JQuery、AJax的起源与简介
    【计算机网络】第四章:网络层 (万字详解)
    论文翻译:2021_F-T-LSTM based Complex Network for Joint Acoustic Echo Cancellation and Speech Enhancement
    zabbix学习1--zabbix6.x单机
    java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/qq_43547520/article/details/126258044