Arduino nano 33 ble 环境监测原型搭建
Funpack8环境监测系统的雏形开发Verision1.0,使用中景园1.14寸IPS进行数据显示!
标签
嵌入式系统
Arduino
砳此不疲
更新2021-05-12
1293

Arduino Nano 33 Ble Sense 一.产品介绍:

  • HTS221:用于测量相对湿度和温度的超紧凑型传感器(直接调用Arduino相关的库就可以了)

  • MP34DT06JTR:MEMS音频传感器全向立体声数字麦克风

  • ADPS9960:先进的手势检测、接近检测、数字环境光感(ALS)和色感(RGBC),这次也没用到光感,直接利用RGB来计算

  • LPS22HB:压力传感器

搭建一个小型环境监测站用于监测户外环境 1.周边环境温度(±0.1℃、±0.1℉):直接通过HTS221获取 2.周边环境湿度(±1%):直接通过HTS221获取湿度信息 3.大气压强(±0.1kP、±0.1psi) 4.日照强度(白天/夜晚) 5.周边平均噪声(±1dB):

其中比较困难的就是周边平均噪声的测量,这个测量的方式肯定是通过麦克风采集,通过一些简单的算法对数据进行处理后进行分析,这里开发板上给我们提供了一个麦克风MP34DT06JTR,因为我以前其实很少接触麦克风,或者说很少接触数字式的麦克风,正好趁此机会学习一下!

数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化和编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构、工艺简单而大量应用,在使用的过程中需要仔细关注这二者的使用区别!

数字式的麦克风管脚是比较简单的,如下图所示:

digital-mems-microphone

有电源、地、时钟引脚CLK、q左右声道选择L/R、信号管脚SD(这个管教对数据的采集和分辨率配置有很大的影响)

在我们这次活动中使用的Arduino开发板上的麦克风是使用DOUT管脚进行信号的输出的,查看这款麦克风的数据手册知道它输出的是PDM信号,谈到这儿又不得不让人提起音频信号的单位分贝(dB),它是一个对数单位,它并不能直接描述一个物理量的大小,它表示的是两个相同单位物理量的比值。这个单位常用来描述声音,比如超过50dB的早上就会影响人的睡眠和休息,除此之外,分贝还被常常拿来描述电子学等其他领域的物理量,比如信号强度的衰减、信噪比等等。

前面提到的分贝是两个物理量的比值,作为分母的量通常是一个标准的基准值(Standard Reference Value),分贝描述的就是作为分子的物理量相对于这个基准值的大小。分贝的计算公式如下:

 

其中Valueref是基准值。在使用分贝的时候物理基准值是十分重要的,基准值用分贝来描述的话就是0dB。

那么我们应该用什么作为基准量来描述声音信号的强度呢?

其实能用来描述声音强度的物理量有很多:声压、功率、产生声音信号的电压等,当我们使用不同的物理量来描述声音的强度的时候,所得到的分贝值也是不同的。

 

下面还需要了解一下数字基准电平,它与0dBFS之间的可用范围就是数字声音的峰值储备,对于以-18dBFS为数字基准编码电平的设备来说有18dB的峰值储备;对于以-20dBFS为数字基准编码电平的设备来说有20dB的峰值储备,其实看了这么多就是对输出的信号进行数字量化,至于选取什么样的量来作为标准,就看你的选择了,其实前面看了那么多,我是有一点了解了,最后还不太明白的其实就是这个数字麦克风输出的数值到底代表什么样的意义,最后看群友们的方法,最终采用了这个看似没啥问题的”数字量化“。

//根据传感器输出的一段采样时间内的数字信号直接均方根求"db"值,我还不确定到底是不是,因为我对这方面也只是初出茅庐,但是我觉得这个就是量化后的有符号16位数据,直接拿来均方根应该可以
float get_db()  //get the db data
{
 int i;
 float sum=0.0,db=0.0;
 for(i=0; i<samplesRead; i++)
{
   sum=sum+sampleBuffer[i]*sampleBuffer[i];
}
 sum=sum/(i+1);
 sum=sqrt(sum);
 db=(20.0*log10(sum));
 return db;
}

同样的,对于光强的分布计算则是利用APDS的颜色感应获得RGB三颜色的值来计算光的亮度,直接通过公式的转换就可以了

//根据RGB转换来粗略计算光强,来作为判断白天和黑夜的依据
float calculatelux(int r ,int g, int b)
{
//float lux;
//lux = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
//return (int)lux;
float lux;
lux=((r*299.0)+(g*587.0)+(b*114.0))/1000.0;
return lux;
}

至于温湿度以及压强的读取就很中规中矩采用Arduino上面的例子,就能很快读取出来我们所需的数据!

整个项目我也上传到电子森林网站上面了,欢迎各位批评指正!

 

附件下载
demo-v1.0.rar
原型开发第一版
团队介绍
团队成员
砳此不疲
西工大大三在读物理学本科生,业余非常爱好开源和电子设计
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号