Funpack第八期_Arduino_环境监测站
通过Arduino Nano 33 BLE Sense开发板实现环境监测站的功能,获取的结果通过蓝牙进行传输
标签
嵌入式系统
vic
更新2021-05-24
869

本次使用Arduino Nano 33 BLE Sense实现的功能是任务二:环境监测站,主要的实现逻辑就是

  • 使用板载的HTS221传感器采集温度以及湿度信息

  • 使用板载的LPS22HB传感器采集气压信息

  • 使用板载的ADS9660传感器采集样色信息获取光照强度

  • 使用板载的MP340T05-A数字麦克风采集声音信息计算当前环境声音强度

  • 使用BLE和手机进行链接,在手机上完成采集信息的上报操作

传感器初始化代码

这一部分代码主要完成板载的HTS221、LPS22HB、ADS9660传感器的初始化以及MP340T05-A数字麦克风初始化和绑定数据处理函数onPDMdata()

    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("Error initializing APDS9960 sensor.");
      while (1);
    }

    PDM.onReceive(onPDMdata);
    if (!PDM.begin(1, 16000)) {
      Serial.println("Failed to start PDM!");
      while (1);
    }

判断白天还是晚上

这一部分的主要实现逻辑为:依照颜色传感器可以采集到透明度的信息,依照这个信息来判断当前的光照强度,如果高于给定阈值,则认为是白天,如果低于给定阈值,则认为是晚上

static bool isNight(int threshold) {
  while (! APDS.colorAvailable()) {
    delay(5);
  }

  int r, g, b, a;
  
  APDS.readColor(r, g, b, a);

  return (a >= threshold) ? false : true;
}

计算环境声音强度

这一部分代码主要是将通过数字麦克风采集的声音数据,通过对应的公式计算出声音强度。

static int getSoundIntensity() {
  static int oldIntensity = 0;

  if (samplesRead) {
    int sampleMax = 0;
    for (int i = 0; i < samplesRead; i++) {
        if (abs(sampleBuffer[i]) >= sampleMax) {
          sampleMax = abs(sampleBuffer[i]);
        }
    }
  
    samplesRead = 0;

    int intensity = 0;
    intensity = (int)(20 * log10(sampleMax));
    intensity = (int)(0.8 * oldIntensity + 0.2 * intensity);
    oldIntensity = intensity;
  }

  return oldIntensity;
}

蓝牙相关代码 全局变量定义

这一部分定义的变量主要是BLE服务相关的定义,依照需要定义即可

static BLEService stationService("917649A0-D98E-11E5-9EEC-0002A5D5C51B");
static BLEStringCharacteristic temperatureCharacteristic("917649A1-D98E-11E5-9EEC-0002A5D5C50B", BLERead | BLENotify, 64);
static BLEStringCharacteristic humidityCharacteristic("917649A1-D98E-11E5-9EEC-0002A5D5C51B", BLERead | BLENotify, 64);
static BLEStringCharacteristic pressureCharacteristic("917649A1-D98E-11E5-9EEC-0002A5D5C52B", BLERead | BLENotify, 64);
static BLEStringCharacteristic soundIntensityCharacteristic("917649A1-D98E-11E5-9EEC-0002A5D5C53B", BLERead | BLENotify, 64);
static BLEStringCharacteristic lightCharacteristic("917649A1-D98E-11E5-9EEC-0002A5D5C54B", BLERead | BLENotify, 64);

蓝牙初始化

这一部分的代码主要是将上面定义的服务相关信息设置到蓝牙模组中

    BLE.begin();
    BLE.setLocalName("Nano33");
    BLE.setAdvertisedService(stationService);
    stationService.addCharacteristic(temperatureCharacteristic);
    stationService.addCharacteristic(humidityCharacteristic);
    stationService.addCharacteristic(pressureCharacteristic);
    stationService.addCharacteristic(soundIntensityCharacteristic);
    stationService.addCharacteristic(lightCharacteristic);
    BLE.addService(stationService);

    BLE.advertise();

蓝牙设备连接后执行的流程

这一部分的代码就是程序中的关键了,在监测到蓝牙设备链接之后,不断的更新温度、湿度、压强、光照、声音强度等信息,然后讲这些信息更新到蓝牙模组中,以便于链接的蓝牙设备可以获取到这些信息

void loop() {
    BLEDevice central = BLE.central();
    if (central) {
      Serial.print("Connected to central: ");
      Serial.println(central.address());
      while (central.connected()) {
        float temperature = HTS.readTemperature();
        float humidity    = HTS.readHumidity();
        float pressure    = BARO.readPressure();
        bool  night       = isNight(5);
        int   intensity   = getSoundIntensity();
  
        temperatureCharacteristic.writeValue(String("Temperature = " + String(temperature) + " °C"));
        humidityCharacteristic.writeValue(String("Humidity = " + String(humidity) + " %"));
        pressureCharacteristic.writeValue(String("Pressure = " + String(pressure) + " kPa"));
        soundIntensityCharacteristic.writeValue(String("Day or Night = " + String(night ? "Night" : "Day")));
        lightCharacteristic.writeValue(String("Sound = " + String(intensity) + " dB"));
      }
    }
}

 

活动心得

Arduino这套体系十分的适合用于做产品原型,丰富的实例基本上可是使得完全没有接触过得新人可以很快的上手驱动硬件,以此来实现自己的原型,完全不需要去关注底层的操作细节,例如本次程序中用到的代码基本上都是从官方实例中组合而来,甚至原理图、数据手册什么都不需要去关注,无疑是十分的便捷。

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