Funpack第八期:基于Arduino Nano 33 BLE Sense的小型环境监测站
Funpack第八期活动:基于Arduino Nano 33 BLE Sense,使用温湿度、压强、光线、数字麦克风传感器制作的小型环境监测站,外接显示屏(SSD1306,128*64,I2C)反馈信息!
标签
嵌入式系统
Arduino
Arduino Nano 33 BLE Sense
Funpack第八期
nRF52840 SoC ARM-32位处理器
mo.mo
更新2021-05-20
1248

硬件介绍

Arduino Nano 33 BLE Sense是一款基于nRF52840 ARM-32位处理器的微型开发板,处理器包含Cortex M4F和用于BLE和Bluetooth 5通信的NINA B306模块。

1、这款开发板的名称本身提供了一些信息:之所以称为“Nano”,是因为其尺寸、引脚排列和形状因数与经典的Arduino Nano非常相似,可以在现有项目中将其用作Arduino Nano的替代品,这款开发板工作电压可以为3.3V,所以称为“33”;名称“BLE”表示模块支持低功耗蓝牙(BLE5 5.0);名称“ sense”表示具有板载传感器(如九轴姿态传感器、温湿度传感器等)。

2、由Nordic nRF52840处理器提供支持的Arduino Nano 33 BLE板具有以下技术规格参数:

Fqj_OeHxw4DAickMNj-nUs4c0TCU

3、开发板所带传感器信息:

LSM9DSI——ST——9姿态轴传感器,3轴加速度计、3轴陀螺仪、3轴磁力计; 

HTS221——ST——温湿度传感器;

LPS22HB——ST——压力计;

APDS9960——Broadcom/Avago——手势检测、接近检测、数字环境光感(ALS)和色感(RGBC);

MP34DT05-A——ST——数字麦克风;

Fg9YgZVL-A-Gf6K7oREAADCKLEFN

本期Funpack活动任务:利用NANO-33 BLE的传感器, 搭建一个小型环境监测站用于监测户外环境。

开发工具:本次任务选择Arduino IDE进行开发;

1、待监测的参数,所使用的传感器及相应的库:

  • 周边环境温度(精度:±0.1°C, ±0.1°F)——HTS221 温 湿度传感器:数据手册Arudino库

  • 周边环境湿度(精度:±1%):——HTS221 温 湿度传感器

  • 大气压强(精度:±0.1kPa, ±0.1psi)——LPS22HB 压力传感器:数据手册Arduino库

  • 日照强度(用于判断白天/夜晚)——APDS9960 数字环境光感:数据手册Arduino库

  • 周边平均噪声(精度:±1dB)——MP34DT05-A 数字麦克风:数据手册PDM库

         通过对开发板外接SSD1306显示屏(128*64)(I2C)显示——U8g2库U8g2库解读

2、相应监测参数功能及代码片段:

1)监测周边环境温及湿度:使用板载的 HTS221 温 湿度传感器采集温湿度数据,并存入temperature、humidity中;

头文件:

#include <Arduino_HTS221.h>//使用Arduino_HTS221库,驱动HTS221温湿度传感器读取环境温度和相对湿度,温度范围: -40 至 120°C,湿度范围: 0 至 100%rH

初始化:

void setup() {
  HTS.begin();//初始化温度湿度传感器HTS221;
}

获取数据:读取传感器浮点温度值、湿度值

void loop() {
  float temperature = HTS.readTemperature();  //读取温度;
  float humidity = HTS.readHumidity();//读取湿度; 
}

板载温度传感器会由于开发板发热,长时间直接通电测得的温度会比实际的温度偏高。

2)监测周边环境大气压强:使用板载的 LPS22HB 压力传感器采集大气压强,并存入pressure中;

头文件:

#include <Arduino_LPS22HB.h>//使用Arduino_LPS22HB库,驱动LPS22HB压力传感器读取气压,绝对压力范围:260 至 1260 hPa;

初始化:

void setup() {
  BARO.begin();//初始化气压传感器LPS22HB;
}

读取传感器压强:

void loop() {
  float pressure = BARO.readPressure();//读取压强;
}

3)监测周边环境日照强度:使用板载的 APDS9960 数字环境光感采集光照强度,并做出相应判断,同时为了便于观察判断,加入一个外置LED灯,判断白天黑夜(白天熄灯,晚上亮灯);

头文件及定义:

#include <Arduino_APDS9960.h>//使用Arduino_APDS9960库,驱动APDS9960光线传感器读取光强度;

int LEDLight = A1;//定义A1引脚为LED灯正极;

初始化:

void setup() {
  APDS.begin();//初始化光线传感器APDS9960;
  pinMode(LEDLight, OUTPUT);//初始化LED灯;
}

环境光检测(带部分显示代码,同时判断LED灯是否点亮):若a>15则为白天,若a<15则为夜晚

void loop() {
  while (! APDS.colorAvailable()) {
    delay(5);
  }
  int r, g, b, a;
  APDS.readColor(r, g, b, a);


if(a>15){
u8g2.print("白天");
digitalWrite(LEDLight, LOW);//白天路灯关闭;
} 
else{
u8g2.print("夜晚");
digitalWrite(LEDLight, HIGH);//夜晚路灯打开;
 }
}

4)监测环境噪声:使用数字麦克风单位时间内获取最大的振幅计算当前环境的噪音

头文件及定义

#include <PDM.h>//使用PDM库,驱动MP34DT05麦克风,处理音频信号;

short sampleBuffer[512];
volatile int samplesRead;

初始化并采集数据:使用单通道数据

void setup() {
  PDM.onReceive(onPDMdata);//初始化麦克风MP34DT05;
  PDM.begin(1, 16000);//
}

//声音采集,使用单通道数据
void onPDMdata() {
  int bytesAvailable = PDM.available();  //查询可用字节数;
  PDM.read(sampleBuffer, bytesAvailable);  //存入缓冲区;
  samplesRead = bytesAvailable / 2;
}

计算分贝:选取值最大的一个作为当前的环境噪声,对该最大值乘5,再取以10为底的对数,乘24即为当前的环境噪声(分贝)。

void loop() {
  while (!samplesRead);
  uint32_t sound_max = 0;
  int i;
  for (i = 0; i < samplesRead; i++) {
    if(sampleBuffer[i] < 0)
      sampleBuffer[i] = -sampleBuffer[i];
    if(sampleBuffer[i] > sound_max) 
      sound_max= sampleBuffer[i];  
  }
  uint32_t sound = 24*log10(sound_max*5)); //得出分贝;
}

5)显示部分:本次显示模块为SSD1306 128*64,I2C协议,使用U8g2库驱动屏幕显示,使用分页模式显示;

头文件及定义:

#include <Arduino.h>
#include <U8g2lib.h>//使用u8g2 OLED库,点亮屏幕;
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//使用I2c驱动12864屏幕;

初始化:环境监测所需传感器初始化成功后显示“Funpack”

void setup() {
  u8g2.begin();//调用u8g2库,初始化oled屏幕;
  u8g2.enableUTF8Print();//启用UTF8打印;

  if(HTS.begin() && APDS.begin())//初始化显示画面
  if(BARO.begin() && PDM.begin(1, 16000))
  {
    u8g2.firstPage();
    do {
    u8g2.setFont(u8g2_font_inb19_mr);
    u8g2.drawStr(0,40,"Funpack");
    } while ( u8g2.nextPage() );
  }
  delay(3000);//显示画面延时
}

环境监测数据显示

void loop() {
  u8g2.setFont(u8g2_font_funpack);  // 使用制作生成的中文字库;
  u8g2.setFontDirection(0);//设置字体方向;
  u8g2.firstPage();//绘制屏幕内容;
  do {
    u8g2.setCursor(0, 15);
    u8g2.print("温度:");
    u8g2.print(temperature);
    u8g2.print("℃");
    u8g2.setCursor(0, 30);
    u8g2.print("湿度:");
    u8g2.print(humidity);	
    u8g2.print("%rH");	
    u8g2.setCursor(0, 45);
    u8g2.print("压强:");
    u8g2.print(pressure);	
    u8g2.print("kPa");
    u8g2.setCursor(0, 60);
    u8g2.print("分贝:");
    u8g2.print(sample);
    u8g2.print("dB");
    u8g2.setCursor(80, 60);
    if(a>15){
      u8g2.print("白天");
      digitalWrite(LEDLight, LOW);//白天路灯关闭;
    } 
    else{
      u8g2.print("夜晚");
      digitalWrite(LEDLight, HIGH);//夜晚路灯打开;
    }
       
  } while ( u8g2.nextPage() );
  delay(1000);//延时;
}

制作所需显示的中文字库:工具详附件,制作方式详见视频;

将生成的“u8g2_font_funpack.c”文件中的内容复制到U8g2库中的“u8g2_fonts.c”文件中;

同时在U8g2库的头文件“u8g2.h”定义添加:

extern const uint8_t u8g2_font_funpack[] U8G2_FONT_SECTION("u8g2_font_funpack");

然后选择此字体显示相应的数据

功能演示及说明

接线:

LED 正极 负极
Nano 33 Ble A1引脚 GND引脚
OLED128*64屏幕 GND VCC SCL SDA
Nano 33 Ble GND引脚 3.3V A5(SCL) A4(SDA)

初始化显示:各传感器初始化成功后屏幕显示“Funpack”

FvQ6WxprQzp0oBLAu2agRyVChNYB

白天模式:温度、湿度、压强、分贝显示,白天LED灯熄灭:

Fh4GLINHj6pzXkW8lo5XoyWyCZlY

夜晚模式:温度、湿度、压强、分贝显示,夜晚LED灯打开:

FoNkJ8_TCgUp0TzzSTOlOxmWzZT0

心得与体会

通过本次活动使我认识到了学习Arduino可以完全不需要了解其内部硬件结构和寄存器设置,仅仅知道它的端口作用即可;可以不懂硬件知识,只要会简单的C语言,就可用Arduino编写程序,大大降低了初学者的学习使用门槛。同时Arduino是开源的,意味着使用者可以从相关网站、博客,论坛里得到大量的共享资源,在共享资讯的辅助下,通过资源整合,能够加快创作作品的速度及效率。Arduino是一款便捷灵活、方便上手的开源硬件产品,具有丰富的接口,有数字I/O口,模拟I/O口,同时支持SPI,IIC,UART串口通信,可拓展性也很高!

建议:希望能学到更多的传感器功能使用,如手势识别,蓝牙模块,加速度及陀螺仪的使用!

 

鸣谢主办方硬禾学堂与得捷电子举办本次Funpack活动!

 

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