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

在这里插入图片描述

  • 6
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
以下是ESP32 Arduino连接MQTT服务器的示例代码: ```C++ #include <WiFi.h> #include <PubSubClient.h> // Replace the variables below with your network credentials and MQTT broker details const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* mqttServer = "your_MQTT_broker_server_address"; const int mqttPort = 1883; const char* mqttUser = "your_MQTT_username"; const char* mqttPassword = "your_MQTT_password"; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); client.setServer(mqttServer, mqttPort); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP32Client", mqttUser, mqttPassword )) { Serial.println("Connected to MQTT"); client.subscribe("testTopic"); } else { Serial.print("Failed with state "); Serial.print(client.state()); delay(2000); } } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); } void callback(char* topic, byte* message, unsigned int length) { Serial.print("Message received on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { messageTemp += (char)message[i]; } Serial.println(messageTemp); } void reconnect() { while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP32Client", mqttUser, mqttPassword )) { Serial.println("Connected to MQTT"); client.subscribe("testTopic"); } else { Serial.print("Failed with state "); Serial.print(client.state()); delay(2000); } } } ``` 这个代码使用了ESP32WiFi库和PubSubClient库。在代码中,你需要替换以下变量: - `ssid`:你的无线网络名称。 - `password`:你的无线网络密码。 - `mqttServer`:你的MQTT服务器地址。 - `mqttPort`:MQTT服务器端口号,默认为1883。 - `mqttUser`:你的MQTT服务器用户名。 - `mqttPassword`:你的MQTT服务器密码。 在`setup()`函数中,我们连接WiFiMQTT服务器,并订阅了`testTopic`主题。在`loop()`函数中,我们检查是否连接MQTT服务器,如果没有连接,则调用`reconnect()`函数进行重新连接。在`callback()`函数中,我们打印接收到的消息。 注意:在使用此代码之前,请确保你已经在你的网络中安装了MQTT服务器。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值