基于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 <stdio.h>
#include <stdlib.h>

//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

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
基于stm32esp8266的ota在线升级是指通过互联网实现对stm32esp8266设备固件的远程在线升级。这种方式相比传统的离线升级,具有更高的灵活性和便利性。 OTA(Over The Air)在线升级是一种可以无需物理连线的远程设备固件升级的技术,通过云平台或服务器,将新版本的固件通过无线网络传输到目标设备,实现远程升级操作。对于基于stm32esp8266的设备,实现OTA升级的过程如下: 首先,需要在stm32esp8266设备上搭建OTA升级功能的框架。可以利用相应的开发工具或库,编写OTA升级模块代码,以实现设备的OTA功能。 然后,在云平台或服务器端搭建OTA服务器,并将新版本固件上传至服务器。将固件进行版本标识,并提供下载链接。 设备连接到云平台或服务器,检测到有新版本固件时,可以从OTA服务器下载新版本固件。可以通过http或https协议进行下载,也可以使用mqtt等通讯协议。 下载完毕后,设备会对下载的固件进行校验,以确保固件的完整性和正确性。 之后,设备会将自身重启进入升级模式,加载新版本固件,并开始固件升级。 在固件升级过程中,设备会自动备份旧版本固件,以便在升级失败时进行回滚。 固件升级完成后,设备会重新启动,并加载新版本固件。设备便成功完成了OTA在线升级。 总之,基于stm32esp8266的OTA在线升级,通过云平台或服务器,实现了设备的远程固件升级,提高了固件更新的灵活性和便利性。这为设备终端和应用提供了更好的升级管理和维护方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱学习的王大胖子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值