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通信相关推荐

  1. Arduino 用声音传感器制作简单的“声纹锁”

    Arduino 用声音传感器制作简单的"声纹锁" 前言 之前就一直在想如何用Arduino制作一个门锁,简单廉价,又可以很方便的开门,最后想了一个办法,就是使用一个声音传感器,制作 ...

  2. arduino UNO通过AT指令控制esp8266连接WiFi及onenet云平台

    写下这篇文章是为了记录我学习使用esp8266的过程.在本文中我们会使用AT指令通过MQTT协议连接onenet云平台 开篇必看 1)关于onenet MQTT设备创建 在设备连接onenet平台中, ...

  3. arduino控制声音传感器

    一.实物连接 二.代码实现 #include <Servo.h> const int ledPin = 8; //pin13 built-in led const int soundPin ...

  4. arduino声音传感器与二极管_如何将声音传感器与Arduino连接 并实现继电器控制项目...

    简介 我前段时间已经实现了声音相关项目,称为 如何制作简单的CLAP SWITCH .该项目基于着名的555定时器IC. 在这个项目中,我将使用不同的声音传感器(虽然想法是一样的),它对声音如大声,拍 ...

  5. 使用声音传感器的Arduino控制的音乐喷泉

    原文:https://circuitdigest.com/microcontroller-projects/arduino-controlled-water-fountain-using-sound- ...

  6. ESP32的MQTT AT固件烧录+STM32以ESP32的MQTT AT固件的AT指令连接EMQX下mqtt服务器实现消息订阅和发布

    目录 写在前面 三种方案(利用ESP32连接EMQX下的MQTT) 步骤 ESP32烧录固件并AT指令进行测试. 下载固件 烧录工具下载 烧录固件(选择ESP32) 关于AT 指令与MQTT服务器断开 ...

  7. 「雕爷学编程」Arduino动手做(35)——模拟量声音传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  8. arduino声音传感器与二极管_Arduino--声音传感器(九)

    一.声音传感器 声音传感器的作用相当于一个话筒(麦克风).它用来接收声波,显示声音的振动图象,但不能对噪声的强度进行测量.传感器内置一个对声音敏感的电容式驻极体话筒.声波使话筒内的驻极体薄膜振动,导致 ...

  9. arduino声音传感器与二极管_怎样使用Arduino构建基于声音传感器的警报

    步骤1:必需的组件 1.声音传感器 2.一个LED 3. 330欧姆电阻 4. Arduino开发板 5.电线束 6.计算机 此外,它还需要对Arduino代码和python有基本的了解 步骤2:构建 ...

最新文章

  1. bugku 成绩单 sqlmap工具的爆破
  2. 使用Gson对复杂json对象的成员进行删选
  3. 【C语言】结构体赋值
  4. ansys命令流_ANSYS命令流建模3之划分单元+施加弹簧
  5. 最强NLP模型BERT可视化学习
  6. 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法
  7. mysql设置用户权限
  8. html 多标签页,html更多标签
  9. 烂泥:nagios监控单网卡双IP
  10. java多线程Thread.sleep方法用法详解
  11. 计算机考研408真题2021年,2021年408考研科目真题及答案_文得学习网
  12. 音乐API(仅测试使用)
  13. 很好听的曲子《红枣树》,歌词写的很好,摘抄一下
  14. 警告: 检测到依赖关系环:_软件设计:依赖关系
  15. LIMS和TDM比较分析
  16. 安卓的第三方sdk是html,第三方SDK目录
  17. 最受java程序员欢迎的极佳性能测试工具
  18. 吊打面试官系列之:什么是 认证、鉴权、授权、权限控制,这一篇必须安排的明明白白。
  19. 身体语言密码_【微观心境】| 身体语言知多少!
  20. springboot整合i18n

热门文章

  1. 01-linux磁盘管理-02-RAID(RAID1,RAID10,RAID01,RAID5,创建RAID,查看RAID,删除RAID)
  2. 《异类》这本书到底有多异类?
  3. LED驱动器满足功率、空间和成本挑战
  4. 计算机网络脆弱性评估技术研究
  5. DS18B20温度传感器 ------ 自学笔记
  6. 光纤收发器怎么连接?光纤收发器连接方式解析
  7. leetcode 1658
  8. 【Unity】跳转其他安卓应用
  9. 你跳槽怎样考虑可持续性发展
  10. php开发discuz插件,discuz x3插件开发傻瓜图文教程,用demo说话