Arduino nano 33 BLE sense的初级任务(温湿度传感器,压力传感器,颜色识别)
简介
本次使用arduino nano 33ble sense,建立一个小型环境监测站,检测周围压强,温湿度,光照,还有声音。
利用NANO-33 BLE的传感器, 搭建一个小型环境监测站用于监测户外环境。待监测的参数包括:
1.周边环境温度(单位:℃)
2.周边环境湿度(单位:%)
3.大气压强(单位:KPa)
4.日照强度(day/night)
5.周边环境噪声(单位:dB)
1.声明部分
首先是将使用到头文件都声明。
以下是我使用到的各个传感器和模块对应的库:
#include <Arduino_APDS9960.h>
#include <Arduino_HTS221.h>
#include <Arduino_LPS22HB.h>
#include <PDM.h>
#include <Arduino.h>
#include <U8g2lib.h>
这里我应用I2C的屏幕,所以要初始化I2C:
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,U8X8_PIN_NONE);
2.模块的初始化
紧接着就是初始化各个模块的代码:
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("Failed to initialize APDS9960 sensor."); //初始化失败提醒
while(1);
}
PDM.onReceive(onPDMdata);
if(!PDM.begin(channels, frequency))
{
Serial.println("Failed to initialize PDM!"); //初始化失败提醒
while (1);
}
u8g2.begin();
3.数据的读取与处理
- 麦克风
板子上的麦克风模块采集到的并非是分贝,而是声音的信号,这里我查了不少的资料,上边的公式我基本都试了,但是使用时误差较大,所以我自己调整了一下:
int i = 0;
uint16_t dB=0;
uint16_t sum = 0;
uint16_t avg=0;
if (samplesRead) {
for (i = 0; i < samplesRead; i++) {
if(sampleBuffer[i]<0)
{
sampleBuffer[i] = -sampleBuffer[i]; //将负的电信号转化为正的
}
sum = sum + sampleBuffer[i]; //求和
}
avg = sum/i; //求平均数
dB = 30*log10(avg); //转为音量
samplesRead = 0;
}
- 屏幕
SSD1306显示部分的代码:
u8g2.clearBuffer(); //清除缓存的数据
u8g2.setFont(u8g2_font_ncenB08_tr); //设置字符大小
u8g2.setCursor(0,10); //设置起始点坐标x,y
u8g2.print("Pressure = ");
u8g2.print(pressure1); //OLED显示气压
u8g2.print(" KPa ");
u8g2.setCursor(0,25); //设置起始点坐标x,y
u8g2.print("Temperature = ");
u8g2.print(temp1);
u8g2.print("°C ");
u8g2.setCursor(0,35); //设置起始点坐标x,y
u8g2.print("Humidity = ");
u8g2.print(humidity);
u8g2.print(" %");
u8g2.setCursor(0,45); //设置起始点坐标x,y
if(c>60){ //c是APDS9960可以读取的光照强度
u8g2.print("It's daytime now!"); //对光强进行判断
}
else{
u8g2.print("It's night now!");
}
u8g2.setCursor(0,55); //设置起始点坐标x,y
u8g2.print("Volume = ");
u8g2.print(dB);
u8g2.print(" dB");
u8g2.sendBuffer();
另外在下面的完整代码中 还有对 psi(磅每平方英寸) ℉(华氏度)的读取及显示,各位使用时可以取消注释即可。
其余的数据读取很简单,在示例中就可以找到,而且容易理解就不再说明了,放在下面完整代码中了。
参考开发需要的库(在库管理中添加):
Arduino_APDS9960
Arduino_HTS221
Arduino_LPS22HB
U8g2
PDM