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. python 职责链模式

    模式定义 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链. 这种模式给予请求的类型,对请求的发送者和接收者进行解耦. 这种类型的设计模式属于 ...

  2. celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)

    一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...

  3. Python列表添加元素

    Python列表添加元素 1.appent() 在列表尾部添加一个元素 >>>my_list.append("append方法") >>>my_ ...

  4. Win10各个PC版本的差别

    新的电脑有的已经不能够支持安装win7了,也就是说新电脑的硬件支持只能安装win10.那么win10有都有那些版本呢?这些版本之间又有什么样区别?我相信很多人并不是很了解.今天就来整理一下这些资料.据 ...

  5. stompjs, websocket和nginx的配置

    server {    listen 8080; location /socket/ {        proxy_pass http://socket_server/;        proxy_s ...

  6. 多次执行echarts时出现 there is a chart instance already initialized on the dom

    原因,多次使用 echarts.init(document.getElementById(this.options.zid)); 解决方案 设为全局

  7. vs2013 C++编译器在调试的时候无法看到变量的值

  8. 2019 顺网游戏java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.顺网游戏等公司offer,岗位是Java后端开发,因为发展原因最终选择去了顺网游戏,入职一年时间了,也成为了面 ...

  9. C语言知识点拾遗

    sleep() abort() fflush() getimeofday() sigaction() Linux 进程学习(四)------ sigaction 函数 malloc() 如何实现一个m ...

  10. 编程风格统一配置EditorConfig

    EditorConfig 以纯原生无需任何插件支持 EditorConfig 代码风格配置的编辑器: Visual Studio 2017 开始添加了对 EditorConfig 的原生支持.Visu ...