这是我第一次参加Funpack活动,也是首次使用Arduino系列产品进行项目设计,选择任务二进行设计。
1.项目简介及功能
本项目利用NANO-33 BLEsense以及板载的传感器,搭建一个小型环境监测站用于监测户外环境。
* 待监测的参数包括:
* 大气压强(精度:±0.1kPa, ±0.1psi)
* 周边环境温度(精度:±0.1°C, ±0.1°F)
* 周边环境湿度(精度:±1%)
* 日照强度(用于判断白天/夜晚)
* 周边平均噪声(精度:±1dB)
本项目采用Arduino nano 33 ble sense 开发板,使用Arduino Editor在线编译程序,加载程序后,可以通过蓝牙在nRF Connect APP上显示检测数据,同时也可以在电脑的串口监视器上显示数据。
Arduino nano 33 ble sense 开发板搭载了众多传感器,如LPS22HB压力传感器,HTS221温湿度传感器,APDS-9960距离颜色姿态传感器,以及MP34DT05麦克风等,可以完美符合项目要求,不需要外接传感器即可完成项目。
2.代码示例
在arduino 中有各个传感器所对应的库,可以方便地调用以进行开发,以 LPS22HB压力传感器 为例,通过加载库,初始化,调用相关函数可以轻松的玩转传感器。
#include <Arduino_LPS22HB.h> //气压
void setup() {
Serial.begin(9600); //设置波特率
while (!Serial);
if (!BARO.begin()) {//传感器初始化
Serial.println("Failed to initialize pressure sensor!");
while (1);
}
void loop() {
float pressure = BARO.readPressure();//调用传感器
Serial.print("Pressure = ");//串口输出
Serial.print(pressureValue);
Serial.println(" kPa");
}
但同样,一些传感器给出的数据需要二次处理才能得到我们想要的结果,例如通过PDM库调用MP34DT05麦克风所得到的数据是采样样本值,需要算法处理后得出噪音的分贝,本项目中,通过计算样本的均方根,并取对数得出分贝值。下面是相关代码
#include <PDM.h>//麦克风
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 16000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
//分贝计算过渡变量
volatile float sq;
volatile float sq_sum;//平方和
float Mean_sq_sum;//方均
float Rms;//方均根
float Sound_level;//噪声值
void setup() {
Serial.begin(9600); //设置波特率
while (!Serial);
PDM.onReceive(onPDMdata);//麦克风初始化
if (!PDM.begin(channels, frequency))
{
Serial.println("Failed to start PDM!");
}
}
void onPDMdata() // Query the number of available bytes
{
int bytesAvailable = PDM.available();
// Read into the sample buffer
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
void loop() {
unsigned long shrink[512];
if (samplesRead) {
for (int i = 0; i < samplesRead; i++) {//取绝对值
shrink[i] = abs(sampleBuffer[i]) ;
}
for (int j = 0; j < samplesRead; j++) {//计算平方和
if (j<samplesRead) {
sq =sq(shrink[j]);
}
sq_sum = sq + sq_sum;
}
sq=0;
}
//计算噪音值
Mean_sq_sum = sq_sum/samplesRead;//均方值
Rms = sqrt(Mean_sq_sum);//均方根
Sound_level = 20*log10(Rms);//计算分贝
samplesRead = 0; // Clear the read count
sq_sum = 0;//Clear
Serial.print(Sound_level );
检测数据通过蓝牙在APP上进行显示,因此需要使用板载的ble蓝牙进行相关设置以及数据传输,蓝牙相关功能可以通过调用ArduinoBLE library进行实现,ble蓝牙相关介绍以及ArduinoBLE library的使用可以参考ArduinoBLE页面。
3.功能演示
在编写好全部代码成测试后,打开手机蓝牙,打开nRF Connect APP,选择Environment-Monitor连接,选择已经在代码中确定的服务,点击进入,5个特性从上到下是气压,温度,湿度,亮度,以及噪声,采集的数据值在Value处以ASCII码形式表现
在串口显示的结果如下图例:
Bluetooth device active,waiting for connections...
Connected event, central: 49:a6:cb:e8:d2:26
Pressure = 100.22 kPa
Pressure = 100.22 kPa
Temperature = 30.61`C
Temperature = 30.59`C
Humidity = 46.39 %
Humidity = 46.27 %
Now is light
luminance = 359 lx
Now is light
luminance = 359 lx
Sound_level = 19.29 db
Sound_level = 21.17 db
Disconnected event, central: 49:a6:cb:e8:d2:26
心得体会:
对我而言,本项目前前后后先后面临并且解决了不少的问题,硬件方面,在开始编程时,本打算使用web editor,但连接板子后并如演示视频一样没有查询到端口,以为可能是edge浏览器原因,当时没有细想,干脆换用arduino IDE软件,但发现设备连接后电脑无反应,设备管理器中也查询不到设备,以为是系统兼容性或者缺少驱动的原因,在上网检索并按图索骥的重装软件或者驱动无果后,尝试换一台机器测试,于是搬出了已经使用多年,键盘已经不大好使的笔记本。。。在笔记本上连接时,设备管理器能够发现未命名设备,但也止步于此,这时反应到可能是使用的micro-USB数据线的问题,没有传输功能或者是接触不良导致平板和笔记本不能正确识别,甚至有可能是板子出厂时候有些问题导致不能连接,开始不断换线进行调试,在林林总总将往年攒下的7,8条闲置线在平板和笔记本上反复测试都没有能识别设备后,我有些怀疑是不是板子有问题,不能这么多线都是纯粹充电线吧!但是观察板子外观也没有发现USB口有连锡等群友曾经反应的明显问题,纠结时又发现家里还有一根日常使用的充电线,抱着试试的态度,连接板子进行测试,笔记本成功识别了!但随之而来又发现,这根仅剩的能用的线,因为使用太久,接口已经很是松动,卡簧失去了 弹性,尝试用镊子夹出塑形,结果直接折了!!但好歹是查明了问题所在,无奈下上网网购了一根品牌数据线。
新线到货后,开始试用各个例程,发现在平板上使用arduino IDE十分卡顿,编译下载一个程序往往要5分钟左右,串口还一直跳,需要不停切换,又过1,2天后,竟然无法载入程序,卡在了upload Started,搜索引擎检索问题后没有解决问题,在群里咨询解决办法,学会了双击进bootload模式,反复测试后解决问题。既然arduino IDE问题这么多换编辑器吧,结果先后换用了notepad++,VsCode,Atom,结果要么是编译脚本用不了,要么是编译插件卡顿,或者是额外自行下载部分软件,这时打算用web editor编译,但是web editor仍然找不到串口,既然不是数据线的问题,那应该就是浏览器问题了,于是换用Chrome浏览器,但并没有什么改变,想了想又拿出了笔记本,用Chrome浏览器仍然不行,详细看web editor官方介绍后才发现,需要安装一个插件arduino create agent,难怪之前用web editor不能查找到串口,给平板安装插件后,终于可以扫描到串口了,没想到竟然不能向板子载入程序!疑惑之下在网络上检索无果,在群里询问也没有好的解决办法。好在用笔记本的web editor可以下载程序,于是我开始了笔记本,平板的来回切换使用,在平板上编辑好,上传,编译,在笔记本上给板子加载程序。用着用着,发现web editor有编译时长限制,为了突破限制,我又注册了一个账号……
在算法中,比较有难度的部分是对麦克风数据的处理上以及对蓝牙的使用,在参加这次项目以前,没有比较深接触过PDM和PCM两种调制方法,在处理数据时面临合适的模型计算分贝值,经过几天的查找技术资料以及对比,最终采用了通过计算采样值的均方根方法间接计算分贝。在对蓝牙的使用上,主要参考了例程,但在特性的输出上遇到了困难,按照例程以及官方库中的函数,在nRF connect app上只能输出16进制无小数的结果,在群里朋友的帮助下,使用了官方库中没有的BLEStringCharacteristic()函数输出字符串,在APP上以ASCII码的形式输出。在当下还有一个问题没有解决,就是用字符替代UUID表示特性名称。
总而言之,参加活动让我这个月过的很充实,收获也很多。