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;
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290165.html
標籤:其他
