Funpack第八期-来自荣哥哥的简易环境监测站
Funpack第八期-来自荣哥哥的简易环境监测站。 任务二:利用NANO-33 BLE的传感器, 搭建一个小型环境监测站。
标签
测试
好大一只荣哥哥
更新2021-05-18
583

Funpack第八期-来自荣哥哥的简易环境监测站

任务二:环境监测站

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

  • 周边环境温度(精度:±0.1°C, ±0.1°F)
  • 周边环境湿度(精度:±1%)
  • 大气压强(精度:±0.1kPa, ±0.1psi)
  • 日照强度(用于判断白天/夜晚)
  • 周边平均噪声(精度:±1dB)

任务功能实现:

准备物品:

  1. arduino Nano 33 BLE sense 开发版
  2. oled显示器(此处使用的是128*64的IIC协议。地址是0X3C)
  3. MicroUsb数据线

根据开发版的引脚示意图连接OLED屏幕。

开发版 GND +3V3 A5 A4
屏幕(IIC) GND VCC SCL SDA

如图所示:

Fi01sbLGbF9vYq9lqrE6oItwt6lD

arduino开发代码部分基本逻辑为  1. 引用所需库  2. 初始化(setup函数)  3. 循环执行(loop函数)

源码实现:

安装开发版支持(连接开发版后会自动弹出是否安装)和所需库文件。

在arduinoIDE中依次选择 项目-加载库-管理库 中搜索并安装相应的温湿度HTS221、压力LPS22HB、光照手势颜色APDS9960、oled屏幕SSD1306。

引用所需库文件并定义OLED参数。

#include <Arduino_HTS221.h>//温湿度
#include <Arduino_LPS22HB.h>//压力
#include <Arduino_APDS9960.h>//光照、手势、颜色
#include <PDM.h>//麦克风

//显示
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>//GFX库是SSD1306父类库,需要一起下载安装
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4);

初始化各项传感器。最终代码中删去了调试过程中的串口通讯的代码部分。

void setup() {
//初始化
  HTS.begin();
  BARO.begin();
  APDS.begin();
  PDM.onReceive(onPDMdata);
  PDM.begin(1,16000);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//0X3C为OLED屏幕的地址
  delay(100);
  display.clearDisplay();
}
short sampleBuffer[256];
volatile int samplesRead;
void onPDMdata() {
  int bytesAvailable = PDM.available();
  PDM.read(sampleBuffer, bytesAvailable);
  samplesRead = bytesAvailable / 2;
}

 

温湿度、气压和光照强度在库函数的示例程序里都可以找到,可以直接使用。

噪音分贝值计算方式在群友的分享里找到了答案,下图所示,根据范例程序中读取到的声压值加以计算获得。

Fq6EwgMwcKXFgagk4-in7qKSF3lm

loop函数中预先定义了过程中需要使用的变量,而后依次读取传感器的数据并加以计算,最后统一输出到OLED屏幕上。

void loop() {
//变量声明
  float temperature,humidity,pressure;
  int r,g,b,a;
  String state;//state变量只用于存储day和night
  uint32_t sample_max = 0; //最大声压值
  uint32_t sample;
  
//读取数据
  temperature = HTS.readTemperature();
  humidity = HTS.readHumidity();
  pressure = BARO.readPressure();
  APDS.colorAvailable();
  delay(100);
  APDS.readColor(r,g,b,a);//读取R,B,G,A值
    if(a < 15){//15为自定义的亮度判断值。
       state ="night";
    }
    else{
       state ="day";
    }
  for (int i = 0; i < samplesRead; i++) {
    if(sampleBuffer[i] < 0) 
      sampleBuffer[i] = -sampleBuffer[i]; 
    if(sampleBuffer[i] > sample_max) 
      sample_max= sampleBuffer[i]; 
  } 
  sample = 20*log10(sample_max * 5);   
  samplesRead = 0;

//输出数据
  display.clearDisplay();
  display.drawRect(0,0,128,64,WHITE);//屏幕四周边框
  display.setTextSize(1); //字体大小
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(3, 4);//温度,排版,指定左上角坐标
  display.print("Temperature=");
  display.print(temperature);
  display.println("'C");
  display.setCursor(3, 16);//湿度
  display.print("Humidity=");
  display.print(humidity);
  display.println("%");
  display.setCursor(3, 28);//气压
  display.print("Pressure=");
  display.print(pressure);
  display.println("kPa"); 
  display.setCursor(3, 40);//光照
  display.print("LightState=");
  display.println(state);
  display.setCursor(3, 52);//噪音
  display.print("SoundLevel=");
  display.print(sample);
  display.println("dB");
  display.display();
  delay(500);
}

结果演示:

因为使用的IIC的128*64的OLED屏幕,监测站有5行数据,因此按照12像素进行了简单排版。

效果如下:

第一行为温度,第二行为湿度,第三行为气压值,第四行为光照强度判断的白天/黑夜,第五行为噪音分贝值。(下图依次展示夜晚和白天状态下的数据)

FoVRQeRJ9hDfZHcdeAlOP2Ytf5LBFhgFsnRosnwJnnaEH8Nsw1dozE5o

 

心得体会:

从之前第一次接触arduino,就被他的易用性和开发速度吸引,这次参加活动也是深有体会,有了各项基础库文件的存在,可以在很短时间内开发出想要的模型。

一如既往的支持!

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