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

Posted wlwwwhl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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通信的主要内容,如果未能解决你的问题,请参考以下文章

Arduino ESP8266/ESP32 多路DS18B20温度采样读取

Arduino ESP32自带触摸传感器功能测试

Arduino ESP32利用SDServer文件管理系统在线调取DHT历史数据

Arduino ESP32 WIFI &蓝牙模式触控按键切换

Arduino ESP32 ADC模拟量信号读取

esp32的MQTT物联网开发记录