Arduino Nano
自2008年第一块Arduino Nano推出后,基于此大小,nano已进化出了非常多的变种
2018年,arduino推出了最新的nano系列:Nano 33
此系列包含三块板卡,分别面向于BLE和Wi-Fi的iot应用,其中BLE和Sense都板载BLE模组,iot板载wifi模组。
Arduino Nano 33 BLE Sense
本次活动所采用的为Sense板卡,Sense板卡为BLE板卡的带传感器升级版,在保持原有电路的基础上,携带了非常丰富的传感器。
Nano Sense的核心处理器为nRF52840 SoC,这是一款基于ARM Cortex-M4F核心且集成了蓝牙5.0的SOC,在保证与经典款nano兼容尺寸管脚的基础上,大大提升了处理器性能。同时,Nano Sense配有多种高性能传感器(角速度,加速度,压力,温湿度,距离,光感,姿态)等,配合板载的蓝牙5.0,足以支持大部分iot应用。
Getting Started
如果要在Arduino桌面IDE上使用Arduino Nano 33 BLE Sense,需要依次进行以下操作:
1)安装开发板:工具——开发板——开发板管理器——搜索“nano 33 ble”——安装“Arduino Mbed OS Boards”
2)安装IMU库:项目——加载库——管理库——搜索ArduinLSM9DS1
3)安装麦克风包:项目——加载库——管理库——搜索PDM
4)安装颜色传感器包:项目——加载库——管理库——搜索APDS9960
5)安装气压计包:项目——加载库——管理库——搜索ArduinoLPS22HB
6)安装温湿度传感器包:项目——加载库——管理库——搜索ArduinoHTS221
功能展示
本次实验完成了要求的第二个小题目:环境检测站。如图采用了0.96寸oled进行显示,依次显示了温度、湿度、气压、正上方RGB色、噪声以及基于RGB色进行的白天/夜晚判断。
代码细节
本实验代码除麦克风外所有传感器代码皆为上方格式,首先调用库函数得到需要的传感器值(具体使用方式见传感器对应例程),之后利用dtostrf函数进行数据类型转换并打印在oled屏幕上。
// read HTS221 sensor values
float temperature = HTS.readTemperature(); // read HTS221 sensor values
float humidity = HTS.readHumidity(); // read HTS221 sensor values
u8g2.drawStr(0,10,"Temperature="); // write something to the internal memory
dtostrf(temperature,3,2,buffer); // 3:小数点前保留3位;2:小数点后保留2位。
u8g2.drawStr(78,10,buffer); // write something to the internal memory 78=12*6+6
u8g2.drawStr(108,10," C"); // write something to the internal memory
u8g2.drawStr(0,20,"Humidity="); // write something to the internal memory
dtostrf(humidity,3,2,buffer); // 3:小数点前保留3位;2:小数点后保留2位。
u8g2.drawStr(66,20,buffer); // write something to the internal memory
u8g2.drawStr(96,20,"%"); // write something to the internal memory
麦克风部分因为库函数可以获取到的为PDM信号,所以采用了PDM-PCM-DB的思路,先取均方根,再带入公式得到最终的结果。
void onPDMdata() {
// Query the number of available bytes
int bytesAvailable = PDM.available();
// Read into the sample buffer
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
double SPL_cal()
{
double amp=0,sum=0;
int cnt=0;
while(cnt<1020)
{
if (samplesRead)
{
for (int i=0; i<samplesRead; i++)
{
sum=sum+double(sampleBuffer[i])*sampleBuffer[i];
}
cnt=cnt+samplesRead;
samplesRead=0;
}
}
amp=20*log10(10*sqrt(sum/cnt));
return amp;
}
可改进点
本次实验中温度传感器获得的数据比室温高2度左右,原因是nano的板卡体积实在太小,板卡本身的发热导致了温湿度传感器的温度高于室温。如果要使其达到室温可采用官方推荐的方式:通过代码将板卡进入尽可能低的低功耗模式,切断下图中的3.3V连接,并绕过DC-DC稳压器为电路板供电。