日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

ESP32(arduino)和声音传感器数据采集并实现连接WiFi进行MQTT通信

發布時間:2024/3/12 c/c++ 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ESP32(arduino)和声音传感器数据采集并实现连接WiFi进行MQTT通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ESP32(arduino)和聲音傳感器數據采集并實現連接WiFi進行MQTT通信

簡單物聯網應用——基于老人居家聲音監測系統

使用 WiFi 庫, 創建 WiFiClient 對象, 引用 WiFiClient 類, 通過 begin()函數初始化 WiFi
連接, 通過判斷 status() 的值來確認 WiFi 是否連接成功, 如果成功, 則開始執行下一步程
序, 未連接則延時 500ms 后重新連接, 直到連接成功, 具體的程序如下:

WiFiClient ESPClient; \\引用 Wifi Client 類 PubSubClient client(ESPClient); void setup() { \\初始化 WiFi 連接 Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { \\判斷 WiFi 是否連接 delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network");

使用 PubSubClient 庫, 創建 PubSubClient 對象, 引用 Client 類, 通過 setServer()函數初12
始化 MQTT 的 Client 連接, 通過判斷 connect() 的值來確認 MQTT 是否連接成功, 如果成
功, 則開始執行下一步程序, 未連接則延時 2000ms 后重新連接, 直到連接成功, 具體的程
序如下:

client.setServer(MQTTServer, MQTTPort); while (!client.connected()) { \\判斷 MQTT 是否連接 Serial.println("Connecting to MQTT..."); if (client.connect("ESP32Clientkitchen", MQTTUser, MQTTPassword )) { Serial.println("connected"); }else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } }

(2)MQTT 發送:
通過定義一個帶參數的 send()函數來實現數據發送, 主要使用了 StaticJsonBuffer 中的
createObject()和 PubSubClient()中的 publish()兩個函數進行 json 數據的創建、 賦值以及發送
功能, 具體的程序如下:

void send(char* get_data, int get_time, int get_value){ \\定義 MQTT 發送函數 StaticJsonBuffer<300> JSONbuffer; JsonObject& JSONencoder = JSONbuffer.createObject();\\創建 Json 對象 JSONencoder["device"] = "kitchen"; JSONencoder["sensorType"] = "voice"; JSONencoder["get_data"] = get_data; JSONencoder["get_time"] = get_time; JSONencoder["get_value"] = get_value; char JSONmessageBuffer[100]; JSONencoder.printTo(JSONmessageBuffer, sizeof(JSONmessageBuffer)); Serial.println("Sending message to MQTT topic.."); Serial.println(JSONmessageBuffer); if (client.publish("ESP/test", JSONmessageBuffer) == true) { \\發布 Serial.println("Success sending message"); } else { Serial.println("Error sending message"); } client.loop(); delay(1000);13 }

(3)數據采集主要使用了 ESP32 的 ADC_1、 CHANNL_6 即 ESP32 的 34 號引腳來讀取聲
音傳感器的模擬量輸出引腳的值并進行轉換。 在 ESP32 中, ADC 的數據劃分成了 4096 份,
則區間為 0~4095, 經過測試, 根據使用場景的不同, 在這里閾值上限設置為 4000、 下限為
500, 并且引用信號量機制, 保證當 ADC 數值超過 4000 時或低于 500 時傳感器向云端發送
一條 json 數據, 主循環函數如下:

void loop() { get_value = analogRead(SOUND_PIN); if(get_value>4000&&flag==0){ \\判斷聲音檢測閾值和信號量機制 get_data="open"; get_time++; send(get_data, get_time, get_value); \\調用發送函數發送數據 flag=1; delay(100); } if(get_value<500&&flag==1){ \\判斷聲音檢測閾值和信號量機制 get_data="close"; get_time++; send(get_data, get_time, get_value); flag=0; } }

完整代碼:

#include <ArduinoJson.h> #include <WiFi.h> #include <PubSubClient.h>const char* ssid = "infinite"; const char* password = "password"; const char* mqttServer = "192.168.43.188"; const int mqttPort = 1883; const char* mqttUser = ""; const char* mqttPassword = ""; const int SOUND_PIN = 34; char* get_data; int get_time=0; int get_value; int flag=0; WiFiClient espClient; PubSubClient client(espClient);void setup() {Serial.begin(115200);Serial.println();WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.println("Connecting to WiFi..");}Serial.println("Connected to the WiFi network");client.setServer(mqttServer, mqttPort);while (!client.connected()) {Serial.println("Connecting to MQTT...");if (client.connect("ESP32Clientkitchen", mqttUser, mqttPassword )) {Serial.println("connected");} else {Serial.print("failed with state ");Serial.print(client.state());delay(2000);}}}void send(char* get_data,int get_time,int get_value){StaticJsonBuffer<300> JSONbuffer;JsonObject& JSONencoder = JSONbuffer.createObject();JSONencoder["device"] = "kitchen";JSONencoder["sensorType"] = "voice";JSONencoder["get_data"] = get_data;JSONencoder["get_time"] = get_time;JSONencoder["get_value"] = get_value;//JsonArray& values = JSONencoder.createNestedArray("values");//values.add(20);//values.add(21);//values.add(23);char JSONmessageBuffer[100];JSONencoder.printTo(JSONmessageBuffer, sizeof(JSONmessageBuffer));Serial.println("Sending message to MQTT topic..");Serial.println(JSONmessageBuffer);if (client.publish("esp/test", JSONmessageBuffer) == true) {Serial.println("Success sending message");} else {Serial.println("Error sending message");}client.loop();Serial.println("-------------");delay(1000); }void loop() {get_value = analogRead(SOUND_PIN);if(get_value>4000&&flag==0){get_data="open";get_time++;send(get_data,get_time,get_value);flag=1;delay(100);}if(get_value<500&&flag==1){get_data="close";get_time++;send(get_data,get_time,get_value);flag=0;} }

總結

以上是生活随笔為你收集整理的ESP32(arduino)和声音传感器数据采集并实现连接WiFi进行MQTT通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。