FunPack第八期——使用Arduino Nano 33 BLE Sense制作一个环境监测站by叶开
使用Arduino Nano 33 BLE Sense和其自带的一系列传感器,制作一个包含有温度湿度大气压强日照强度和周边噪声的环境监测站
标签
嵌入式系统
Arduino
yekai
更新2021-05-11
922

这期FunPack给我们带来的是一块来自Arduino的板卡Arduino Nano 33 BLE Sense。既然是Arduino发布的板卡,自然是支持Arduino框架开发。本次我也使用了Arduino框架进行开发。

任务清单

我这次选择的是任务二:

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

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

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

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

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

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

数据信息反馈方式为通过对开发板外接显示屏显示

任务分析

  • 周边环境温度和湿度可以使用板载的温湿度传感器HTS221获取。

  • 大气压强可以使用板载的LPS22气压传感器实现。

  • 日照强度由于精度要求不高,使用板载的颜色传感器APDS9960获取颜色后和阈值比较后判断白天/夜晚。

  • 周边的平均噪声就需要进行一些处理。板载的MP34DT05为一个PDM的麦克风传感器,获取到的是声音量化后的裸数据,不能直接得到声压。参考文章的方案。

  • 外接显示器我本次使用UART串口屏

代码部分

由于是使用Arduino框架开发,这里也不再自行编写各传感器的驱动,而是使用提供的驱动。

初始化部分

    // 温湿度传感器的初始化
    HTS.begin();
    // 气压传感器的初始化
    BARO.begin();
    // 颜色传感器的初始化
    APDS.begin();
    // 数字麦克风的初始化
    PDM.onReceive(onPDMdata);
    PDM.begin(1, 16000);
    // 日常点个灯
    pinMode(LED_BUILTIN, OUTPUT);
    // 串口(连接到串口屏)的初始化
    Serial1.begin(115200);
    // 串口屏的清屏
    Serial1.print("CLR(0);SBC(0);\r\n");

获取传感器数据

    // 获取温度信息
    auto temperature = HTS.readTemperature();
    // 获取湿度信息
    auto humidity = HTS.readHumidity();
    // 获取气压信息
    auto pressure = BARO.readPressure();
    // 获取颜色传感器信息
    while (!APDS.colorAvailable()) {
        delay(5);
    }
    int r, g, b;
    APDS.readColor(r, g, b);
    // 声压的计算
    double l;
    if (samplesRead) {
        long long pow_sum = 0;
        for (int i = 0; i < samplesRead; i++) {
            pow_sum += sampleBuffer[i] * sampleBuffer[i];
        }
        pow_sum /= samplesRead;
        auto p_rms = sqrt(pow_sum);
        l = 20 * log10(p_rms / 65536.0);
        Serial.println(l);
        samplesRead = 0;
    }

串口屏输出

    delay(100);
    Serial1.print("DCV16(10,10,'");
    sprintf(uartBuf, "Tempe:%.1f C", temperature);
    Serial1.print(uartBuf);
    Serial1.print("',1);\r\n");

    delay(100);
    Serial1.print("DCV16(10,30,'");
    sprintf(uartBuf, "Humi:%.0f %%", humidity);
    Serial1.print(uartBuf);
    Serial1.print("',1);\r\n");

    delay(100);
    Serial1.print("DCV16(10,50,'");
    sprintf(uartBuf, "Pres:%.1f kPa", pressure);
    Serial1.print(uartBuf);
    Serial1.print("',1);\r\n");

    delay(100);
    Serial1.print("DCV16(10,70,'");
    Serial1.print(((r < 30) && (g < 30) && (b < 30)) ?
                  "time:night" : "time:day  ");
    Serial1.print("',1);\r\n");

    delay(100);
    Serial1.print("DCV16(10,90,'");
    sprintf(uartBuf, "Sound:%.0f dB", l);
    Serial1.print(uartBuf);
    Serial1.print("',1);\r\n");

心得体会

第一次使用Arduino框架进行开发,难免有些不适应。一方面是习惯了使用c语言进行面向过程的开发(虽然本次开发使用Arduino我基本上自己没写面向对象的部分,main中仍是面向过程的思想),另一方面是Arduino的框架封装的很严实,并且官方IDE也很难查看库的源码,这让我感觉对工程有些失去掌控。当然我后来也是抽出了工程文件重新使用Clion搭建了一个工程。Arduino的众多库,在使用时很方便,这大概也是非传统嵌入式开发者追捧它的原因吧。

本次使用clion搭建工程,使用了从Arduino框架中找出的mbedos和ArduinoAPI,放在我的github仓库的funpack分支内

完整工程:https://github.com/kaidegit/Arduino33BLE_Templet_Clion/tree/funpack

团队介绍
中国计量大学机电工程学院
团队成员
yekai
一个大三的电子小白
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号