这期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