【2024 DigiKey 创意大赛】会议声源追踪器 会议室环境检测(1)
本帖最后由 左手阿飞 于 2024-10-18 11:24 编辑<p> </p>
<p>这次打算做一个会议拾音系统,主要功能如下:</p>
<p>1、声源定位,识别声音方向;(麦克风阵列,控制器)</p>
<p>2、声源追踪,用步进电机控制麦克风方向,追踪声源,减少干扰噪声;(麦克风阵列,控制器)</p>
<p>3、检测会议室环境,上传云端,可以提醒工作人员提前开启空调等设备。(传感器、ESP32)。</p>
<p> </p>
<p>由于功能1、2较难,先进行了任务3。</p>
<p> </p>
<p>任务3 主要使用的模块是ESP32 和传感器,结合阿里云物联网平台。</p>
<p>使用的开发环境是VSCode+Platformio。</p>
<p> </p>
<p>由易到难:</p>
<p>1、首先连接WIFI,先确定要连接WIFI的ID和密码,然后利用库函数连接WIFI,并打印连接信息:</p>
<p>(1)库函数头文件</p>
<p> </p>
<p>(2)设置WIFI的ID和密码</p>
<p> </p>
<p>(3)利用库函数连接WIFI,若链接不成功,则打印信息。</p>
<p></p>
<p>2、物联网平台连接:本次使用的是阿里云生活物联网平台(飞燕平台)。</p>
<p>在物联网平台中,先设置3个功能,2个用于检测会议室温湿度,1个开关,控制会议室灯(可以改为其他设备,比如空调等,本次用LED演示)</p>
<p></p>
<p> 人机交互界面示例:</p>
<p> </p>
<p> </p>
<p>代码部分,通过库函数,连接物联网平台,并上传温湿度。温湿度传感器用的是DHT11。</p>
<p>(1)头文件:</p>
<p> </p>
<p>(2)物联网平台连接的参数:</p>
<p> </p>
<p>(3)连接物联网</p>
<p> </p>
<p>(4)上传温湿度</p>
<p> </p>
<p>(5)接收Json信息,控制LED</p>
<p> </p>
<p>3、效果演示:</p>
<p>(1)后台显示温湿度:</p>
<p> </p>
<p>(2)APP显示温湿度:</p>
<p> </p>
<p>(3)APP控制LED亮灭(视频):</p>
<p> </p>
<p>附代码:</p>
<pre>
<code class="language-cpp">#include <Arduino.h>
#include <WiFi.h>
#include "PubSubClient.h"
#include "DHT.h"
#include "ArduinoJson.h"
#define DHTPIN 4
#define LED 38
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE) ;
#define WIFI_SSID "HONOR 200 Pro"
#define WIFI_PASSWORD "87654321"
#define PRODUCT_KEY "a1H4kfnF05D"
#define DEVICE_NAME "ESP32S3Test"
#define DEVICE_SECRET "c0fcb349106f4730b6358b62320f4aab"
#define REGION_ID "cn-shanghai"
#define MQTT_SERVER PRODUCT_KEY".iot-as-mqtt."REGION_ID ".aliyuncs.com"
#define MQTT_PORT 1883
#define MQTT_USERNAME DEVICE_NAME"&"PRODUCT_KEY
#define CLIENT_ID "a1H4kfnF05D.ESP32S3Test|securemode=2,signmethod=hmacsha256,timestamp=1729067953966|"
#define MQTT_PASSWD "252b17f2417acf371e14d0d1f3ac85d070ea49960db96f001ff33b1eafbe1bc0"
#define ALINK_BODY_FORMAT "{\"id\":\"ESP32S3Test\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
const char* topic="/sys/a1H4kfnF05D/ESP32S3Test/thing/service/property/set";
unsigned long lastMs=0;
WiFiClient espClient;
PubSubClient client(espClient);
float soil_data;
float tep;
void wifiInit()
{
WiFi.begin(WIFI_SSID,WIFI_PASSWORD);
while(WiFi.status()!=WL_CONNECTED)
{
delay(500);
Serial.println("WiFi not Connect");
}
}
void mqttCheckConnect()
{
while(!client.connected())
{
Serial.println("Connect to MQTT Server...");
if(client.connect(CLIENT_ID,MQTT_USERNAME,MQTT_PASSWD))
{
Serial.println("MQTT Connected!");
}
else{
Serial.print("MQTT Connect err..");
Serial.println(client.state());
delay(5000);
}
}
}
void mqttIntervalPost()
{
char param;
char jsonBuf;
//upload humidity
soil_data = dht.readHumidity();
sprintf(param, "{\"humidity\":%2f}", soil_data);
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
Serial.println(jsonBuf);
boolean b = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
if(b){
Serial.println("publish Humidity success");
}else{
Serial.println("publish Humidity fail");
}
// Upload temperature
tep =dht.readTemperature();
sprintf(param, "{\"temperature\":%2f}",tep);
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
Serial.println(jsonBuf);
boolean c = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
if(c){
Serial.println("publish Temperature success");
}else{
Serial.println("publish Temperature fail");
}
}
//回调函数
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic); // 打印主题信息
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload); // 打印主题内容
}
Serial.println();
DynamicJsonDocument doc(1024);//创建了一个名为 doc 的动态 JSON 文档
deserializeJson(doc, String((char *)payload));//从一个名为 payload 的数据中解析 JSON 数据并将其填充到 doc 中
// DynamicJsonDocument params = doc["params"];
if(doc["params"].containsKey("deng"))
{
Serial.println("GOT DENG CMD");
digitalWrite(LED, doc["params"]["deng"]);
}
}
void setup() {
pinMode(LED,OUTPUT);
Serial.begin(115200);
dht.begin();
wifiInit();
client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接MQTT服务器 */
client.setCallback(callback);
digitalWrite(LED,LOW);
}
void loop() {
if (millis() - lastMs >= 5000)
{
lastMs = millis();
mqttCheckConnect();
/* 上报 */
mqttIntervalPost();
}
client.loop();
delay(2000);
}
</code></pre>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>追踪到声源方位之后,用于什么场景?</p>
wangerxian 发表于 2024-10-18 13:06
追踪到声源方位之后,用于什么场景?
<p>准备用于麦克风转动,追踪声源,减少声音干扰,提高声音接受质量。</p>
左手阿飞 发表于 2024-10-18 16:46
准备用于麦克风转动,追踪声源,减少声音干扰,提高声音接受质量。
<p>明白了,减少干扰确实有用。</p>
页:
[1]