(1)WIFI信号确定距离

https://blog.csdn.net/PINGER0077/article/details/79482238

ESP8266不需要修改任何库

#include "ESP8266WiFi.h"
#include "math.h"
/*

已知三点位置 (x1, y1,z1), (x2, y2,z2), (x3, y3,z3)
已知未知点 (x, y,z) 到三点距离 d1, d2, d3

以 d1, d2, d3 为半径作三个圆,根据毕达哥拉斯定理,得出交点即未知点的位置计算公式:
( x1 - x0 )2 + ( y1 - y0 )2 = d12
( x2 - x0 )2 + ( y2 - y0 )2 = d22
( x3 - x0 )2 + ( y3 - y0 )2 = d32

设未知点位置为 (x, y), 令其中的第一个球形 P1 的球心坐标为 (0, 0),P2 处于相同纵坐标,球心坐标为 (d, 0),P3 球心坐标为 (i, j),
三个球形半径分别为 r1, r2, r3,z为三球形相交点与水平面高度。则有:

r12 = x2 + y2 + z2
r22 = (x - d)2 + y2 + z2
r32 = (x - i)2 + (y - j)2 + z2

化简
x = (r12 - r22 + d2) / 2d
y = (r12 - r32 - x2 + (x - i)2 + j2) / 2j

*/
//第一个点(不修改) 原点  第一个球形 P1 的球心坐标为 (0, 0)
#define x1 0-----------------------------------------------------
#define y1 0-----------------------------------------------------
#define z1 0 //高度一致------------------------------------------

//第二个点(只修改y2) P2 处于相同纵坐标,球心坐标为 (d, 0)------
float x2 =0 ; //实际位置距离测量 1-20米-------------------------- 修改
float y2 =0 ;//实际位置放在相对原点纵坐标为0 --------------------
float z2 =0 ;//高度一致------------------------------------------

//第三个WIfi距离 (修改x3和y3)
float x3 =0;  // 实际位置测量------------------------------------修改
float y3 =0;  // 实际位置测量------------------------------------修改
float z3 =0;  //高度一致-----------------------------------------

// 物体实际位置
float x=0;
float y=0;
float z=0;

//测量距离
float d1=0;
float d2=0;
float d3=0;

/*
  1 单个距离公式
d = 10^((abs(rssi) - A) / (10 * n))  信号强度

  2 参数介绍
d - 计算所得距离(单位:m)
rssi - 接收信号强度
A - 发射端和接收端相隔1米时的信号强度
n - 环境衰减因子
*/

// 3 在自己的环境里实际测试,修改下面两个值适应环境
#define wifiname1 "gps1"
#define A1 -42            //接收机和发射机间隔1m时的信号强度 ssid  一般45-52
#define N1 40             //N = 10 * n ,其中n为环境衰减因子,3.25-4.5  这个没有专门设备无法测到,只能在A数值确定了,修改这个数值,使得输出距离为 1米
#define wifiname2 "gps2"
#define A2 -42            //接收机和发射机间隔1m时的信号强度 ssid  一般45-52
#define N2 40             //N = 10 * n ,其中n为环境衰减因子,3.25-4.5  这个没有专门设备无法测到,只能在A数值确定了,修改这个数值,使得输出距离为 1米
#define wifiname3 "gps3"
#define A3 -42            //接收机和发射机间隔1m时的信号强度 ssid  一般45-52
#define N3 40             //N = 10 * n ,其中n为环境衰减因子,3.25-4.5  这个没有专门设备无法测到,只能在A数值确定了,修改这个数值,使得输出距离为 1米

//信号临界值强大要达到 -65 才参与运算
int rssi_min=-65;
//至少需要 3 个 ap都检测到
int ap_number=0;
int ap_number_min=3;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  Serial.println("Setup done");

}

// 获取单个WIfi距离
float Distance(String wifissid,int wifirssi,int A,int N){

    if(wifissid=="gps1"){
                    Serial.print("Wifiname:"); Serial.print(wifissid); Serial.print("  RSSI:"); Serial.print(wifirssi); Serial.print("");
                    float iu, distance;
                    iu = (float)(A-wifirssi ) / (float)N;
                    distance = powf(10.0, iu);//计算以x为底数的y次幂     功能与pow一致,只是输入与输出皆为浮点数
                    Serial.print("  Distance:"); Serial.print(distance); Serial.println("m");
                    return distance;
                }

  }
//获取自身位置 x y坐标

/*
输入参数
float r1  设备距离第一个wifi的距离
float r2  设备距离第二个wifi的距离
float r3  设备距离第三个wifi的距离
float x2, 第一个点为圆心,第二个点同一水平位置随意放,第一个点到第二个点的实际距离
float x3  以第一个点为原点,以第一个和第二个点连线为X轴,垂直其方向为y轴,第三个点x坐标
float y3  以第一个点为原点,以第一个和第二个点连线为X轴,垂直其方向为y轴,第三个点y坐标
*/
//简单算法
void My_xyz(float r1,float r2,float r3,float x2,float x3, float y3){
 float x = (float)(r1*r1 - r2*r2 + x2*x2) / (float)2*x2;
 float y = (float)(r1*r1 - r3*r3 - x*x + (x - x3)*(x - x3) + y3*y3) / (float)2*y3;
 Serial.print("x:"); Serial.print(x);
 Serial.print("   y:"); Serial.println(y);
  }

void My_2x(){

  }

void loop() {
//  Serial.println("scan start");
  int n = WiFi.scanNetworks();
  Serial.println("---------------------WIFI Scan done---------------------");

  if (n == 0) {
    Serial.println("no networks found");
  } else {
          ap_number=0;//检测到的数目
          d1=0;//第一个距离
          d2=0;//第二个距离
          d3=0;//第三个距离

          for (int i = 0; i < n; ++i) {
            // Print SSID and RSSI for each network found
                if(WiFi.SSID(i)==wifiname1&&WiFi.RSSI(i)>rssi_min){
                  d1= Distance(WiFi.SSID(i),WiFi.RSSI(i),A1,N1);ap_number++;
                }
                if(WiFi.SSID(i)==wifiname2&&WiFi.RSSI(i)>rssi_min){
                  d2= Distance(WiFi.SSID(i),WiFi.RSSI(i),A2,N2);ap_number++;
                }
                if(WiFi.SSID(i)==wifiname3&&WiFi.RSSI(i)>rssi_min){
                  d3= Distance(WiFi.SSID(i),WiFi.RSSI(i),A3,N3);ap_number++;
                }

             }//for
//----------------------------计算位置--------------------------------

if(ap_number==ap_number_min)
       {
        My_xyz(d1,d2,d3, x2, x3, y3);
       }
       else{
        Serial.println("AP_number < 3,distance get fail!");

        }

  }

  delay(500);
}

  

原文地址:https://www.cnblogs.com/kekeoutlook/p/10800331.html

时间: 2024-10-19 06:26:01

(1)WIFI信号确定距离的相关文章

√如何改善无线wifi信号质量

BAT满足了大众在公共场合对免费wifi的需求,路由器.WiFi共享精灵软硬兼施则构建家庭.办公室等室内场合的无线wifi环境.最基本的需求满足之后是什么呢,对wifi网络质量的要求,不要网络慢,不要wifi信号时断时续,可以吗? 一.不要网络慢,如何增强wifi信号,已经有朋友给出了答案:(只针对笔记本wifi情况) 二.如何延伸无线wifi信号距离,或扩大wifi覆盖范围 本人就有这样的体验,晚上睡前有个习惯看看微信,手机靠左还能wifi,翻个身就不行了,再翻回去,又默默地连接上去了--在如

房间WIFI信号不好怎么办?——无线路由桥接(WDS)

背景 1.无线路由在客厅,房间的WIFI信号很差,只有1-2格,虽说是100M的网速,但是从客厅到房间要经过3道墙!电脑的无线接收功能一般都很一般,网速不好理所当然. 2.弄一根网线从客厅连接起来很傻逼,很伤风化. 3.昨天在微信公众号看到一篇文章,背景跟我一样,使用了无线路由桥接来解决这个问题,刚好我有一个多余的路由,说干就干. 原理 客厅的是主路由,WAN口是接光钎的入口,LAN口是空的: 房间的是副路由,WAN口是空的,LAN口可以空(房间里的电脑通过副路由的WIFI上网),也可以接网线(

WIFI信号放大增强器(中继器)中继成功后怎么改名字

大多数有用家用无线路由器WIFI的朋友应该都有这样的经历:手机通常只有一格到两格的地方:很容易掉线:会影响到我们的上网体验:解决方案就是买一个WIFI信号放大器将信号放大:让我们的手机上网就没那么容易掉线.有很多的朋友在中继成功后很多的朋友发现名字和原来的WIFI一模一样:只不过多了个EXT的后缀:有时候我们用的WIFI有可能是邻居的:这样很容易被人发现:需要改名字. 但是当我们一些朋友在浏览器里面输入了192.168.1.1发现就进入了路由器的设置界面:断电也不行:那我们需要怎样才能改掉WIF

北上广8.5%WiFi信号为钓鱼 互联网&quot;黑产&quot;规模百亿元

北上广8.5%WiFi信号为钓鱼 互联网"黑产"规模百亿元 信息安全组织“雨袭团”日前公布了<中国一线城市WiFi安全与潜在威胁调查报告>.报告显示,北京.上海.广州三地机场.火车站.旅游景点.商业中心等6万多个WiFi信号,有8.5%的WiFi信号为“钓鱼”WiFi. 信息安全组织“雨袭团”日前公布了<中国一线城市WiFi安全与潜在威胁调查报告>.报告显示,北京.上海.广州三地机场.火车站.旅游景点.商业中心等6万多个WiFi信号,有8.5%的WiFi信号为“

用wifi信号控制手机

============问题描述============ 手机和电脑连在同一个wifi下,能不能通过电脑来控制手机,或者说能不能有一种方法来用wifi信号代替usb来控制手机 ============解决方案1============ 这个相当于远程控制了, 开发一个独立的Service用来实时接收 电脑发出的指令,做出相应的动作. 但需要一个服务器作为数据交换中转站,讲白了就是 socket通信. 电脑发送指令给服务器,服务器接收到指令后 查找是否有在线的手机(手机第一次需要先连上服务器) 如

Unity3D移动端电量与wifi信号的获取

移动端游戏中无法看到电量与wifi信号对于玩家来说是很困扰的事. 关于这个问题安卓与iOS有不同的方法 电量 安卓 安卓获取电量有两种方法,一种是读取安卓手机里的一个文件,一种是利用安卓与Unity互发消息的方式 读取文件虽然方便,但是咱们不保证哪天厂商把这个文件换个位置咱们就读取不到了 方法一 参考:http://www.cnblogs.com/BobbyWeaver/p/5118118.html 读取安卓手机中的文件,代码如下: int GetBatteryLevel() { try { s

WiFi信号弱?大型场馆高密度WiFi无线网络覆盖

如今,全球移动化.社交化消费需求正以极高的速度在影响人类生活,各类大型活动层出不穷,花样多多,无论是企业的年会,还是品牌发布会,或者动漫展等等,现场都可能超过200人,甚至上千人,那么就需要一个大型场馆来开展这些活动.但想要办好一个活动,除了要布置好场馆之外,还需要布置现场网络. 每逢举办活动时馆内移动上网必然遭遇严峻考验.场馆自身工作设施.工作人员的办公用网,与观众互动玩游戏时难免需要网络的支持.观众在场馆内自拍.拍摄现场图.社交网络图文"直播".拍个精彩片段短视频--没网络绝对不行

mac pro在公司连WiFi正常,回家回宿舍就找不到WiFI信号,需要重启才能找到WiFI热点

解决办法:修改路由器的频段到1-11这个范围. 之前一直没时间去找原因,项目也急,这几天项目不是特别急了,就找找了,原因. 因为之前还是好好的,主要是之前有次修改了下路由器的配置. 改了下默认的发送频段,1-13默认是自动状态.为了不与附近的WiFI信息冲突,或者心理上觉得网速更快些就 选了个13频段,结果后面就出现找不到热点的现象,后面在网上查了查才知道是pro只支持1-11频段.

隐藏路由器的WIFI信号,防蹭网

进入路由器的管理界面 最后别忘了 现在信号隐藏了,现在说一下如何用手机连接隐藏的路由器