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);
}

  

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

  1. 为什么房间的 Wi-Fi 信号这么差

    最近把家里主卧整成了个小影院,由于之前房子装修时网线端口与电源插口布置太少,导致家庭网络架设变得麻烦起来,最后终于通过「无线中继」技术达到了全屋满格 Wi-Fi 的效果. 在 Wi-Fi 架设过程中, ...

  2. ubuntu搜不到wifi信号

    很多人刚刚装完ubuntu发现搜不到wifi信号,输入命令查看配置发现没有无线网卡驱动, 其实ubuntu是可以自动识别无线网卡自动安装驱动的,此时只需输入命令更新一下即可, 连上有线网,在终端输入此 ...

  3. win8笔记本无法搜索wifi信号找不到WLAN该 wifi共享特别注意的服务

    WlansvcWLAN AutoConfigWLANSVC 服务提供配置.发现.连接.断开与 IEEE 802.11 标准定义的无线局域网(WLAN)的连接所需的逻辑.它还包含将计算机变成软件访问点的 ...

  4. wind10系统 Atheros AR9271 Wireless Network Adapter USBwifi无线网卡的驱动安装解决无法搜索wifi信号,连接wifi信号无法上网的问题

    一.解决无法搜索wifi信号的问题 卸载掉之前的驱动,上网下载其他的驱动程序安装. http://drivers.mydrivers.com/drivers/463_185289.htm 二.安装完后 ...

  5. 如何轻松搞定 笔记本搜不到WIFI信号问题

    经常用电脑的同志肯定遇到过:一开机,发现右下角网络图标有个×号,wifi信号也搜不到:或者其他wifi信号能搜到,唯独自家的搜不到,是不是感觉很绝望啊,居然被wifi欺负到身上了,这也太憋屈了吧. 此 ...

  6. android 8 wifi 信号等级

    wifi信号等级 /frameworks/base/wifi/java/android/net/wifi/wifimanager.java calculateSignalLevel为计算信号等级函数, ...

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

    背景 1.无线路由在客厅,房间的WIFI信号很差,只有1-2格,虽说是100M的网速,但是从客厅到房间要经过3道墙!电脑的无线接收功能一般都很一般,网速不好理所当然. 2.弄一根网线从客厅连接起来很傻 ...

  8. 家用wifi信号覆盖增强扩展实用指南

    家用wifi信号覆盖增强扩展实用指南 现在网上很多号称穿墙王的无线路由器,但是一般用起来效果都不理想,其实最主要的原因还是家里面一般每个房间不大,但是墙比较多.并且一般也没有一个所谓的中心点放置路由器 ...

  9. 调整 WiFi 驱动设置让 WiFi 信号更稳定

    调整 WiFi 驱动设置让 WiFi 信号更稳定 修改 WiFi 驱动中 的设置,将 Power Saving Mode 的值改为 CAM.

随机推荐

  1. day10——动态参数、函数注释、名称空间、函数的嵌套、global及nonlocal

    day10 三元运算符: 变量 = 条件成立的结果 条件判断 条件不成立的结果 补充: # lst = [12,23,3,4,5,6] # def func(*args): # print(*args ...

  2. 从损失函数优化角度:讨论“线性回归(linear regression)”与”线性分类(linear classification)“的联系与区别

    1. 主要观点 线性模型是线性回归和线性分类的基础 线性回归和线性分类模型的差异主要在于损失函数形式上,我们可以将其看做是线性模型在多维空间中“不同方向”和“不同位置”的两种表现形式 损失函数是一种优 ...

  3. CentOS7安装MySQL(完整版)

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1 下载并安装MySQL官方的 Yum Re ...

  4. Oracle解决锁表语句与批量生成解锁语句

    --以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...

  5. Linux中使用MegaCli工具查看、管理Raid卡信息

    MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等.通常,我们对硬盘当前的状态不太好确定, ...

  6. k8s--yml文件3

  7. 浏览器Notwork XHR被隐藏了

    图片中红色区域内容被隐藏 解决方式,点击此处

  8. ABAP-表修改日志存储

    1.设置了变更文档的,可以通过查看标准表CDHDR,CDPOS SE38   --  RSUSR200   ST03N -- 专家模式 2.SE16N维护的数据,可以查看表SE16N_CD_KEY,S ...

  9. IDEA配置自己的注释

    File-->Setting-->Live Templates,点击+,选择2.Template Group... 创建Group,我的命名为MyAnnotation,然后选中MyAnnt ...

  10. react native错误排查-TypeError: window.deltaUrlToBlobUrl is not a function

    错误现象:window.deltaUrlToBlobUrl is not a function 最近在调试react-native时,打开浏览器调试时发现报错window.deltaUrlToBlob ...