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