Funpack第八期 — 利用Arduino nano 33 BLE sense 建立的环境监测站
本次使用arduino nano 33ble sense,建立一个小型环境监测站,检测周围压强,温湿度,光照,还有声音。
标签
嵌入式系统
Arduino
SorryMaker
更新2021-05-13
609

本次分享是Funpack第八期的任务二:环境监测站

利用NANO-33 BLE的传感器, 搭建一个小型环境监测站用于监测户外环境。待监测的参数包括:

  • 周边环境温度(精度:±0.1°C, ±0.1°F)

  • 周边环境湿度(精度:±1%)

  • 大气压强(精度:±0.1kPa, ±0.1psi)

  • 日照强度(用于判断白天/夜晚)

  • 周边平均噪声(精度:±1dB)

我本次实现制作显示出的是

  • 周边环境温度(单位:℃)
  • 周边环境湿度(单位:%)
  • 大气压强(单位:KPa)
  • 日照强度(day/night)
  • 周边环境噪声(单位:dB)

1.声明部分

首先是将使用到头文件都声明。

以下是我使用到的各个传感器和模块对应的库:

#include <Arduino_APDS9960.h>
#include <Arduino_HTS221.h>
#include <Arduino_LPS22HB.h>
#include <PDM.h>
#include <Arduino.h>
#include <U8g2lib.h>

这里我应用I2C的屏幕,所以要初始化I2C:

#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,U8X8_PIN_NONE);

2.模块的初始化

紧接着就是初始化各个模块的代码:

if(!HTS.begin())                        
  {
      Serial.println("Failed to initialize humidity temperature sensor!"); //初始化失败提醒
      while(1);
  }
  if (!BARO.begin())               
  {
     Serial.println("Failed to initialize pressure sensor!");    //初始化失败提醒
     while (1);
  }
  if(!APDS.begin())
  {
      Serial.println("Failed to initialize APDS9960 sensor.");     //初始化失败提醒
      while(1);
  }
  PDM.onReceive(onPDMdata);
  if(!PDM.begin(channels, frequency))                    
  {
      Serial.println("Failed to initialize PDM!");                  //初始化失败提醒
      while (1);
  }
 
  u8g2.begin();

3.数据的读取与处理

  • 麦克风

板子上的麦克风模块采集到的并非是分贝,而是声音的信号,这里我查了不少的资料,上边的公式我基本都试了,但是使用时误差较大,所以我自己调整了一下:

  int i = 0;
  uint16_t dB=0;
  uint16_t sum = 0;
  uint16_t avg=0;
  if (samplesRead) {
     for (i = 0; i < samplesRead; i++) {
      if(sampleBuffer[i]<0)
      {
         sampleBuffer[i] = -sampleBuffer[i];   //将负的电信号转化为正的
      } 
      sum = sum + sampleBuffer[i];            //求和
    }
    avg = sum/i;                           //求平均数
    dB = 30*log10(avg);                    //转为音量
    samplesRead = 0;
  }
  • 屏幕

SSD1306显示部分的代码:

  u8g2.clearBuffer();                       //清除缓存的数据
  u8g2.setFont(u8g2_font_ncenB08_tr);       //设置字符大小
  u8g2.setCursor(0,10);                     //设置起始点坐标x,y
  u8g2.print("Pressure = ");                
  u8g2.print(pressure1);                     //OLED显示气压
  u8g2.print(" KPa ");
  u8g2.setCursor(0,25);                     //设置起始点坐标x,y
  u8g2.print("Temperature = ");
  u8g2.print(temp1);
  u8g2.print("°C ");
  u8g2.setCursor(0,35);                     //设置起始点坐标x,y
  u8g2.print("Humidity = ");
  u8g2.print(humidity);
  u8g2.print(" %");
  u8g2.setCursor(0,45);                     //设置起始点坐标x,y
  
  if(c>60){                                 //c是APDS9960可以读取的光照强度
      u8g2.print("It's daytime now!");      //对光强进行判断
  }
  else{
      u8g2.print("It's night now!");
  }                     
  u8g2.setCursor(0,55);                     //设置起始点坐标x,y
  u8g2.print("Volume = ");
  u8g2.print(dB);
  u8g2.print(" dB");
  u8g2.sendBuffer();
  • 其他

另外在下面的完整代码中 还有对 psi(磅每平方英寸)  ℉(华氏度)的读取及显示,各位使用时可以取消注释即可。

其余的数据读取很简单,在示例中就可以找到,而且容易理解就不再说明了,放在下面完整代码中了。

4.心得体会

通过这次的Funpack学习,让我这个初学者对于arduino有了更深的了解,也让我开了眼界,原来arduino已经可以做的这么精致,这么强,可以运用到人工智能方面,激发了我对这个这方面的兴趣。活动非常的赞!

参考开发需要的库(在库管理中添加):

  1. Arduino_APDS9960
  2. Arduino_HTS221
  3. Arduino_LPS22HB
  4. U8g2
  5. PDM

 

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