硬件介绍
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板具有以下技术规格参数:
3、开发板所带传感器信息:
LSM9DSI——ST——9姿态轴传感器,3轴加速度计、3轴陀螺仪、3轴磁力计;
HTS221——ST——温湿度传感器;
LPS22HB——ST——压力计;
APDS9960——Broadcom/Avago——手势检测、接近检测、数字环境光感(ALS)和色感(RGBC);
MP34DT05-A——ST——数字麦克风;
本期Funpack活动任务:利用NANO-33 BLE的传感器, 搭建一个小型环境监测站用于监测户外环境。
开发工具:本次任务选择Arduino IDE进行开发;
1、待监测的参数,所使用的传感器及相应的库:
-
周边环境湿度(精度:±1%):——HTS221 温 湿度传感器
通过对开发板外接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”
白天模式:温度、湿度、压强、分贝显示,白天LED灯熄灭:
夜晚模式:温度、湿度、压强、分贝显示,夜晚LED灯打开:
心得与体会
通过本次活动使我认识到了学习Arduino可以完全不需要了解其内部硬件结构和寄存器设置,仅仅知道它的端口作用即可;可以不懂硬件知识,只要会简单的C语言,就可用Arduino编写程序,大大降低了初学者的学习使用门槛。同时Arduino是开源的,意味着使用者可以从相关网站、博客,论坛里得到大量的共享资源,在共享资讯的辅助下,通过资源整合,能够加快创作作品的速度及效率。Arduino是一款便捷灵活、方便上手的开源硬件产品,具有丰富的接口,有数字I/O口,模拟I/O口,同时支持SPI,IIC,UART串口通信,可拓展性也很高!
建议:希望能学到更多的传感器功能使用,如手势识别,蓝牙模块,加速度及陀螺仪的使用!
鸣谢主办方硬禾学堂与得捷电子举办本次Funpack活动!