风筝
发表于: 2019-8-15 11:53:14 | 显示全部楼层

在本篇文章中,我们将使用Arduino开发板和ESP8266制作周围Wi-Fi信号的热图。


什么是WiFi?

如今,许多人在他们的智能手机、平板电脑和PC上使用WiFi服务。 WiFi是由Wi-Fi联盟注册的用于构建IEEE802.11标准无线LAN的协议。

heat-1.compressed.jpg


Wi-Fi比蓝牙更强大。 Wi-Fi通常用于连接无线互联网,这使得该协议更受欢迎。您可以使用此技术轻松地在任何地方连接到Internet。 Wi-Fi标准在2.4 GHz时支持最高11Mps的速度。为了提高该标准的速度,建立了另一个名为IEEE802.11n的版本,其速度提高了200Mps。这种速度的提高是由于使用了多通道天线(MIMO),使用两个2.4 GHz和5 GHz频率范围以及媒体访问控制(MAC)。


在本篇文章中,我们想要使用ESP8266、Arduino和3.5“TFT LCD创建一个WiFi热图。 ESP8266可以检测指定SSID(RSSI)的Wi-Fi信号。我们在这个项目中使用了ESP-01模块。将其中4个模块放在房间的四个角上。在收到ESP模块的信息后,我们将它们发送给Arduino进行分析和显示。


什么是热图?

热图是一种图形数据,可以使信息具有吸引力。热图通常使用色谱来分析信息,这种色谱从暖色开始,以冷色结束。具有最高强度和特定数据覆盖范围(例如WiFi信号强度)的地图的每个部分具有最热的颜色,因此,随着数据强度的降低,色谱将接近冷色。


所需的材料

●    Arduino UNO R3开发板

●    3.5“TFT彩色显示屏模块

●    ESP8266 WiFi模块

●    Arduino IDE

heat-required.compressed.jpg


创建WiFi热图的电路连接

将ESP模块连接到Arduino开发板,如下图所示。

heat-circuit.compressed.jpg

连接ESP模块后,将TFT Shield放在Arduino上。


代码

首先,我们为ESP模块编写一个代码来检查信号强度并将其发送给Arduino。然后我们为Arduino编写另一个代码来接收信息并显示它们。


在每个ESP模块上传以下代码。您可以阅读本教程,了解有关ESP8266模块以及如何通过Arduino IDE上传代码的更多信息。

  1. #include "ESP8266WiFi.h"

  2. char inByte;

  3. void setup() {
  4.   Serial.begin(115200);
  5.   WiFi.mode(WIFI_STA);
  6.   WiFi.disconnect();
  7.   delay(100);
  8. }

  9. void loop() {
  10.   if (Serial.available() > 0)
  11.   {
  12.     // get incoming byte:
  13.     inByte = Serial.read();
  14.     if (inByte == '1')
  15.     {
  16.       int n = WiFi.scanNetworks();
  17.       if (n == 0) {
  18.         Serial.println("no networks found");
  19.       } else {
  20.         for (int i = 0; i < n; ++i) {
  21.           if (WiFi.SSID(i) == "Specific SSID") {
  22.             Serial.println(WiFi.RSSI(i));
  23.           }
  24.         }
  25.       }
  26.     }
  27.   }
  28. }
复制代码

在此代码中,字符“1”表示ESP模块标识符,对于后续模块,更改此标识符。 例如,对于第二个模块,将标识符更改为“2”。 输入所需的SSID名称代替“Specific SSID”。


现在在Arduino上传以下代码。

  1. #include "Adafruit_GFX.h"
  2. #include "MCUFRIEND_kbv.h"
  3. MCUFRIEND_kbv tft;

  4. int Pa, Pb, Pc, Pd;
  5. int color;
  6. int r = 0, g = 150, b = 200;
  7. int sam, eq;
  8. int r2, b2, g2;

  9. void setup() {
  10.   Serial.begin(115200);
  11.   tft.reset();
  12.   uint16_t ID = tft.readID();
  13.   tft.begin(ID);
  14.   tft.setRotation(1);
  15.   tft.invertDisplay(true);
  16.   tft.fillScreen(0x0000);
  17. }
  18. void loop() {
  19.   Serial.println("1");
  20.   delay(1000);
  21.   if (Serial.available() > 0) {
  22.     // get incoming byte:
  23.     Pa = Serial.read();
  24.   }

  25.   Serial.println("2");
  26.   delay(1000);
  27.   if (Serial.available() > 0) {
  28.     // get incoming byte:
  29.     Pb = Serial.read();
  30.   }

  31.   Serial.println("3");
  32.   delay(1000);
  33.   if (Serial.available() > 0) {
  34.     // get incoming byte:
  35.     Pc = Serial.read();
  36.   }

  37.   Serial.println("4");
  38.   delay(1000);
  39.   if (Serial.available() > 0) {
  40.     // get incoming byte:
  41.     Pd = Serial.read();
  42.   }

  43.   sam =  (( sqrt(pow(240, 2) + pow(160, 2)) * Pa + sqrt(pow(480 - 240, 2) + pow(160, 2)) * Pb + sqrt(pow(240, 2) + pow(320 - 160, 2)) * Pc + sqrt(pow(480 - 240, 2) + pow(320 - 160, 2)) * Pd ) / ( sqrt(pow(240, 2) + pow(160, 2)) + sqrt(pow(480 - 240, 2) + pow(160, 2)) + sqrt(pow(240, 2) + pow(320 - 160, 2)) + sqrt(pow(480 - 240, 2) + pow(320 - 160, 2)) ) );

  44.   for (int y = 0; y < 320; y++)
  45.   { for (int x = 0; x < 480; x++) { eq = (( sqrt(pow(x, 2) + pow(y, 2)) * Pa + sqrt(pow(480 - x, 2) + pow(y, 2)) * Pb + sqrt(pow(x, 2) + pow(320 - y, 2)) * Pc + sqrt(pow(480 - x, 2) + pow(320 - y, 2)) * Pd ) / ( sqrt(pow(x, 2) + pow(y, 2)) + sqrt(pow(480 - x, 2) + pow(y, 2)) + sqrt(pow(x, 2) + pow(320 - y, 2)) + sqrt(pow(480 - x, 2) + pow(320 - y, 2)) ) ); // Serial.println(eq); // delay(20); eq = (eq - sam) * -1; //Serial.println(eq); r2 = r + (10 * eq); b2 = b + (10 * eq); g2 = g + (10 * eq); if (r2 > 255)r2 = 255;
  46.       if (r2 < 0)r2 = 0; if (b2 > 255)b2 = 0;
  47.       if (b2 < 0)b2 = 0; if (g2 > 255)g2 = 0;
  48.       if (g2 < 0)g2 = 0;

  49.       color = tft.color565(r2, g2, b2);
  50.       tft.drawPixel(x, y, color);
  51.     }
  52.   }
  53. }
复制代码

在此代码中,我们使用Adafruit_GFX和MCUFRIEND_kbv库在LCD上显示信息,您可以从以下链接下载。

●     Adafruit_GFX库

●     MCUFRIEND_kbv库

从所有模块接收到RSSI后,Arduino根据位置计算WiFi信号的强度。 您可以通过更改r、g和b变量来创建自己的颜色。


以上就是本文的全部内容。如果遇到任何问题,请随时在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-24 23:30 , Processed in 0.037348 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表