基于NANO-33 BLE SENSE 的环境监测站
利用NANO-33 BLE的传感器,搭建一个小型环境监测站用于监测环境,相关参数通过蓝牙在nRF Connect APP上显示
标签
嵌入式系统
eetree_study
更新2021-05-20
1207

这是我第一次参加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码形式表现FvSW9cAvnhvc6dPdAX7Vuy5uC4JgFpLR4oI08UKEl49qFAlDFpb8bSetFuGLznydK6coqSWWa0shwx47iqPN

在串口显示的结果如下图例:

 

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表示特性名称。

     总而言之,参加活动让我这个月过的很充实,收获也很多。

 

软硬件
电路图
附件下载
v9_8.ino
团队介绍
个人团队,第一次参加Funpack活动
团队成员
eetree_study
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号