这个例子展示了如何使用ESP32的无线网络功能将数据发布到ThingSpeak™。ESP32记录并记录所连接无线网络的信号强度。按下板子上的一个按钮,测量三种无线网络信号强度,并将平均结果张贴到ThingSpeak频道。该设备还会发布一个计数器值,这样你就可以跟踪测量结果。
您可以生成一个热图覆盖图像来表示无线信号强度。这张图片显示了无线信号强度,凌驾于办公室平面图之上,以及用来生成热图的数据。要生成热图覆盖,请参见创建热图叠加图像.
首先,为ESP32设置Arduino Core。指教,请参阅用于ESP32的Arduino Core安装说明.您可以使用“Blink”示例草图在ESP32上测试您的Arduino®设置文件>例子>01.基础知识.定义LED_BUILTIN
引脚作为引脚5使用板载LED。
使用ThingSpeak,则必须拥有用户帐户和已创建的通道。每个通道最多有8个数据字段、3个位置字段和1个状态字段。如果你有一个免费账户,你可以每15秒向ThingSpeak发送数据。
1)注册新账户,如注册ThingSpeak吧.
2)通过选择创建通道渠道>我的频道>新渠道.
3)启用字段1和字段2。
4)输入RSSI
作为字段1的名称,并且计数器
作为字段2的名称。
5)命名频道。例如,ESP32信号强度
.
保存你的频道。
7)注意写入API键API密钥选项卡。
要完成这个示例,您只需要安装在Sparkfun提供的ESP32开发套件中的设备。然而,使用便携式微型usb兼容电池可以使您的设备便携,便于测量。
使用Arduino IDE为您的设备创建应用程序。
1)使用micro-USB线缆将ESP32连接到计算机,等待连接成功。
2)在Arduino IDE中选择ESP32 Dev Module板和正确的COM端口。
3)创建应用。在Arduino IDE中打开一个新窗口并保存文件。添加代码部分中提供的代码。编辑您的通道的无线网络SSID、密码和写入API密钥。
要将结果可视化,您可以使用ThingSpeak的无线网络优势生成办公室地图的叠加图像。由于简化的硬件只记录信号强度,您必须手动记录每个点的坐标。您可以使用大多数图形编辑程序来查找图像上的像素坐标。关于生成热图的详细信息请参见创建热图叠加图像.
1)首先定义库、定义和全局变量。输入您的无线网络SSID和密码,以及您的通道的写入API密钥。
#include#define buttonPin 0 #define LEDPin 5 //网络信息char* ssid = "WIFINAME";const char* password = "PPPPPPPPP";// ThingSpeak设置char server[] = "api.thingspeak.com";String writeAPIKey = "XXXXXXXXXXXXXXXX";// const const unsigned long postingInterval = 15L * 1000L;//全局变量unsigned long lastConnectionTime = 0;int measurementNumber = 0;
2
)在设置中,启动串行输出,初始化输入和输出引脚,连接到无线网络。
无效的设置(){Serial.begin (115200);pinMode (buttonPin、输入);pinMode (LEDPin、输出);connectWiFi ();}
3)在主回路中,首先确保有无线连接,然后检查是否有按钮按下。如果按下按钮,请检查是否经过了足够的时间来发布数据。检测后按下按钮测量无线网络强度,然后调用HTTP发布功能。
void loop(){const int numberPoints = 7;浮动wifiStrength;//在每个循环中,确保有一个Internet连接。if (WiFi.status() != WL_CONNECTED) {connectWiFi();} //如果检测到按下按钮,将数据写入ThingSpeak。if (digitalRead(buttonPin) == LOW){if (millis() - lastConnectionTime > postingInterval) {blinkX(2,250);//验证按下按钮。wifiStrength = getStrength (numberPoints);httpRequest (wifiStrength measurementNumber);blinkX (measurementNumber, 200); // Verify that the httpRequest is complete. measurementNumber++; } } }
4)将您的设备连接到无线网络connectWiFi
函数。连接成功后,设备快速闪5次。
void connectWiFi(){while (WiFi.status() != WL_CONNECTED);开始(ssid、密码);延迟(3000);} //显示连接成功的通知。以“连接”);blinkX (50);}
连接到ThingSpeak服务器,并为HTTP POST命令建立数据字符串httpRequest
函数。
void httpRequest(float field1Data, int field2Data) {WiFiClient客户端;如果客户机(!。(服务器,80)){串行连接。println(“连接失败”);lastConnectionTime =米尔斯();client.stop ();返回;} else{//创建要发送到ThingSpeak的数据字符串。String data =" fieldd1 =" + String(field1Data) + "&field2=" + String(field2Data); / /输入字段//显示如何包括额外的字段数据在http post // post数据到ThingSpeak。 if (client.connect(server, 80)) { client.println("POST /update HTTP/1.1"); client.println("Host: api.thingspeak.com"); client.println("Connection: close"); client.println("User-Agent: ESP32WiFi/1.1"); client.println("X-THINGSPEAKAPIKEY: "+writeAPIKey); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.print(data.length()); client.print("\n\n"); client.print(data); Serial.println("RSSI = " + String(field1Data)); lastConnectionTime = millis(); delay(250); } } client.stop(); }
6)进行多次测量并将平均值返回给主循环getStrength
.
//测量Wi-Fi强度并返回平均结果。int getStrength(int points){长rssi = 0;long averageRSSI = 0;for (int i=0;i < points;i++){rssi += WiFi.RSSI();延迟(20);} averageRSSI = rssi/点数;返回averageRSSI;}
7)最后,使用theblinkX
功能,使设备LED闪烁。闪烁允许板与您通信时,它没有通过USB连接到计算机。
//使LED闪烁可变次数和可变延迟。void blinkX(int numTimes, int delayTime){for (int g=0;g < numTimes;g++){//打开LED并等待。digitalWrite (LEDPin、高);延迟(时延);//关闭LED并等待。digitalWrite (LEDPin、低);延迟(时延);} }