任务
本期任务需要利用NANO-33 BLE的传感器, 搭建一个小型环境监测站用于监测户外环境。待监测的参数包括:
-
周边环境温度(精度:±0.1°C, ±0.1°F)
-
周边环境湿度(精度:±1%)
-
大气压强(精度:±0.1kPa, ±0.1psi)
-
日照强度(用于判断白天/夜晚)
-
周边平均噪声(精度:±1dB)
开发板传感器丰富
NANO-33 BLE是一颗很强大的开发板,包括以下传感器:
-
APDS9960 距离颜色姿势传感器 用来判断白天/夜晚
-
LSM9DS1 九轴加速度重力传感器
-
HTS221 温湿度传感器 用来测量环境温湿度
-
LPS22HB 压力传感器 用来测量大气压强
-
MP334DT05- A 麦克风 用来判断噪音
库支持
Arduino的强大之处是能安装各种库,来扩展开发板的功能.本次实验需要依赖一些库,如下所示. 在项目-加载库-管理库搜索以下关键字,并安装. (可能需要科学上网)
Arduino_LPS22HB 传感器库
Arduino_HTS221 传感器库
Arduino_APDS9960 传感器库
Adafruit_GFX 这个库是为了支持显示
Adafruit_SSD1306 这个库是为了支持SSD1306屏的显示
中文显示
中文显示可以用字库支持 或者自制字模的方式. 我们采用后者. 使用pctolcdelle 软件(附件提供) 按照 PCtoLCD2002 ,阴码,逐列式,顺向,C51 的配置 如下图
生成如下字模数组
//取16X16汉字字模 逐行式 顺向高位在前
static const unsigned char PROGMEM str_wen[] =
{
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
};
static const unsigned char PROGMEM str_du[] =
{
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",1*/
};
以此类推 生成 需要的文字.
核心代码
void loop() {
int r, g, b, a;
float pressure,f_temperature,c_temperature,humidity;
uint32_t sample;
//读取大气压
pressure = BARO.readPressure();
//读取温度
c_temperature = HTS.readTemperature();
//读取湿度
humidity = HTS.readHumidity();
//读取亮度
while ( APDS.colorAvailable()) {
APDS.readColor(r, g, b, a);
Serial.println("a:");
Serial.println(a);
}
//读取声音 并计算分贝
while (!samplesRead);
{
uint32_t sample_max = 0;
for (int i = 0; i < samplesRead; i++) {
if(sampleBuffer[i] < 0)
sampleBuffer[i] = -sampleBuffer[i];
if(sampleBuffer[i] > sample_max)
sample_max= sampleBuffer[i];
}
sample = 24*log10(sample_max*5);
}
samplesRead = 0;
//display 数据显示部分
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);//设置显示位置
display.drawBitmap(0, 0, str_wen, 16, 16, 1); //画出字符对应点阵数据
display.drawBitmap(16, 0, str_du, 16, 16, 1); //画出字符对应点阵数据
display.setCursor(32,0);
display.print(c_temperature);
display.println(F("C"));
display.drawBitmap(0, 16, str_shi, 16, 16, 1); //画出字符对应点阵数据
display.drawBitmap(16, 16, str_du, 16, 16, 1); //画出字符对应点阵数据
display.setCursor(32,16);
display.print(humidity);
display.println(F("%"));
display.drawBitmap(0, 32, str_qi, 16, 16, 1); //画出字符对应点阵数据
display.drawBitmap(16, 32, str_ya, 16, 16, 1); //画出字符对应点阵数据
display.setCursor(32,32);
display.print(pressure);
display.println(F("kP"));
if(a >= 5){
display.drawBitmap(0, 48, str_bai, 16, 16, 1); //画出字符对应点阵数据
display.drawBitmap(16, 48, str_tian, 16, 16, 1); //画出字符对应点阵数据
}else{
display.drawBitmap(0, 48, str_wan, 16, 16, 1); //画出字符对应点阵数据
display.drawBitmap(16, 48, str_shang, 16, 16, 1); //画出字符对应点阵数据
}
display.setCursor(32,48);
display.print(sample);
display.println(F("dB"));
display.display();//开显示
}
功能展示
一屏以此显示温度 湿度 气压 白天/晚上 噪音分贝信息:
如下图
体会感受
挺感谢主办方. 朋友介绍参与这次活动 受益很多.
Arduino 也挺好玩 ,这是一个起点 ,后续会学习更多玩法.
附录
https://store.arduino.cc/usa/nano-33-ble-sense