步驟1:硬件和軟件規范
ESP32 WiFi/BLE
無線溫濕度傳感器
軟件規格
Arduino IDE
第2步:創建俘虜門戶
強制門戶網站是一個網頁,向新連接的用戶顯示,然后才向他們授予對網絡資源的更廣泛訪問權限。在這里,我們提供三個網頁,供您在DHCP和靜態IP設置之間進行選擇。我們可以通過兩種方式為ESP定義IP地址。
DHCP IP地址-這是一種動態分配IP地址的方法到設備。 ESP的默認IP地址為192.168.4.1
靜態IP地址-為我們的網絡設備分配一個永久IP地址。為了向設備提供靜態IP,我們需要定義IP地址,網關地址和子網掩碼。
第一個網頁位于192.168.1.77。此處為用戶提供了單選按鈕,可以在DHCP和靜態IP設置之間進行選擇。在下一個網頁中,我們必須提供IP相關信息以繼續進行操作。
HTML代碼
可以在以下位置找到網頁的HTML代碼:
您可以使用任何IDE或文本編輯器(例如Sublime或notepad ++)來制作HTML網頁。
首先創建一個包含兩個單選按鈕的HTML網頁,以在DHCP和靜態之間進行選擇IP設置。
現在創建按鈕以提交您的回復
為單選按鈕命名。
ESP Web服務器類將使用這些名稱作為參數,并使用這些參數獲取單選按鈕的響應
現在插入“ SUBMIT”按鈕以將響應發送到設備。網頁上,我們有文本框。
在文本框中輸入名稱值和輸入類型,然后在“ SUBMIT”中添加提交按鈕以提交響應。
創建“ RESET” ‘按鈕以重置文本字段的內容。
步驟3:提供Wi Fi和UbiDots憑據
主要問題是在管理WiFi憑據時發生的。即使我們有WiFiMulti庫,也可以在其中向設備提供多個SSID和密碼,然后設備將連接到可用的網絡。但是,如果可用網絡不在WiFiMulti列表中,該怎么辦。始終刷新 ESP32 設備不是一個可靠的解決方案。
為解決此問題,我們托管了一個網頁,用戶可以在其中提交可用網絡的SSID和密碼。它的工作方式如下。
該網頁托管于用戶從強制門戶中選擇的靜態IP或DHCP IP
此網頁包含用于輸入SSID的文本字段,密碼和UBIDOTS令牌ID將設備連接到 UbiDots 。
在輸入字段中輸入本地WiFi的SSID和密碼,然后輸入 UbiDot 》的令牌ID并輸入SUBMIT
這些憑據將保存在 ESP32 的EEPROM
60秒后,設備將自動與AP
下次打開設備時,用戶無需執行此過程,設備將自動從EEPROM中獲取用戶憑據并繼續發布傳感器讀數到 UbiDots 。
步驟4:將傳感器讀數發布到UbiDots
此處我們正在將無線溫度和濕度傳感器與 ESP 32 設備一起使用,以獲取溫度和H亮度數據。我們正在使用 MQTT 協議將數據發送到UbiDots。 MQTT 遵循發布和訂閱機制,而不是請求和響應。它比HTTP更快,更可靠。這項工作如下。
我們正在使用任務計劃程序來計劃任務,例如從傳感器中獲取數據,發布傳感器讀數,訂閱 MQTT 主題。/li》
首先,包括Task Scheduler頭文件,它是實例并計劃任務。
我們已經計劃了兩個任務,它們涉及兩個不同的控制操作。
#define _TASK_TIMEOUT
#include
Scheduler ts;
//---------Tasks------------//
Task tSensor(4 * TASK_SECOND, TASK_FOREVER, &taskSensorCallback, &ts, false, NULL, &taskSensorDisable);
Task tWiFi(10* TASK_SECOND, TASK_FOREVER, &taskWiFiCallback, &ts, false, NULL, &taskWiFiDisable);
任務1用于讀取傳感器值,該任務運行1秒鐘,直到達到10秒超時。
當Task1超時時,我們正在連接到本地Wifi和 MQTT 代理。
現在已啟用任務2并我們將禁用任務1
任務2用于將傳感器數據發布到 UbiDots MQTT 經紀人,此任務將運行20秒,直到超時20秒
當Task2達到超時時,將再次啟用任務1,并禁用Task2。再次在這里,我們獲取更新的值,并且過程繼續進行。
讀取I2C傳感器數據
我們從無線溫度和濕度傳感器獲得29字節的幀。對該框架進行操作以獲取實際的溫度和濕度數據。
uint8_t data[29];
data[0] = Serial1.read();
delay(k);
//chck for start byte
if(data[0]==0x7E)
{
while (!Serial1.available());
for ( i = 1; i《 29; i++)
{
data[i] = Serial1.read();
delay(1);
}
if(data[15]==0x7F) /////// to check if the recive data is correct
{
if(data[22]==1) //////// make sure the sensor type is correct
{
humidity = ((((data[24]) * 256) + data[25]) /100.0);
humidity /=10.0;
cTempint = (((uint16_t)(data[26])《《8)| data[27]);
cTemp = (float)cTempint /100.0;
cTemp /= 10.0;
fTemp = cTemp * 1.8 + 32;
fTemp /= 10.0;
battery = random(100,327);
voltage = battery/100;
nodeId = data[16];}
連接到UbiDots MQTT API
包括用于 MQTT 流程的頭文件。
#include
為 MQTT 定義其他變量,例如客戶端名稱,代理地址,令牌ID(我們正在從EEPROM中獲取令牌ID)
#define MQTT_CLIENT_NAME “ClientVBShightime123”
char mqttBroker[] = “things.ubidots.com”;
char payload[100];
char topic[150];
//create variable to store token ID
String tokenId;
創建變量以存儲不同的傳感器數據并創建char變量以存儲主題
#define VARIABLE_LABEL_TEMPF “tempF” // Assing the variable label
#define VARIABLE_LABEL_TEMPC “tempC” // Assing the variable label
#define VARIABLE_LABEL_BAT “bat”
#define VARIABLE_LABEL_HUMID “humid” // Assing the variable label
char topic1[100];
char topic2[100];
char topic3[100];
將數據發布到所提到的 MQTT 主題,有效負載將類似于 {“ tempc”: {value:“ tempData”}}
sprintf(topic1, “%s”,“”);
sprintf(topic1, “%s%s”, “/v1.6/devices/”, DEVICE_LABEL);
sprintf(payload, “%s”, “”); // Cleans the payload
sprintf(payload, “{”%s“:”, VARIABLE_LABEL_TEMPC); // Adds the value
sprintf(payload, “%s{”value“:%s}”, payload, str_cTemp); // Adds the value
sprintf(payload, “%s}”, payload); // Closes the dictionary brackets
Serial.println(payload);
Serial.println(client.publish(topic1,payload) ? “published” : “notpublished”);
//Do same for other topic as well
client.publish()將數據發布到UbiDots。
步驟5:可視化數據
轉到Ubidots并登錄到您的帳戶。
從頂部列出的“數據”標簽導航到儀表板。
現在單擊“ + ”圖標以添加然后ew小部件。
從列表中選擇一個小部件,然后添加變量和設備。
可以使用不同的小部件在儀表板上顯示傳感器數據。
責任編輯:wv
-
傳感器
+關注
關注
2548文章
50740瀏覽量
752143 -
Ubidots
+關注
關注
0文章
10瀏覽量
3850 -
ESP32
+關注
關注
18文章
960瀏覽量
17114
發布評論請先 登錄
相關推薦
評論