内容介绍
内容介绍
Funpack第八期-来自荣哥哥的简易环境监测站
任务二:环境监测站
利用NANO-33 BLE的传感器, 搭建一个小型环境监测站用于监测户外环境。待监测的参数包括:
- 周边环境温度(精度:±0.1°C, ±0.1°F)
- 周边环境湿度(精度:±1%)
- 大气压强(精度:±0.1kPa, ±0.1psi)
- 日照强度(用于判断白天/夜晚)
- 周边平均噪声(精度:±1dB)
任务功能实现:
准备物品:
- arduino Nano 33 BLE sense 开发版
- oled显示器(此处使用的是128*64的IIC协议。地址是0X3C)
- MicroUsb数据线
根据开发版的引脚示意图连接OLED屏幕。
开发版 | GND | +3V3 | A5 | A4 |
屏幕(IIC) | GND | VCC | SCL | SDA |
如图所示:
arduino开发代码部分基本逻辑为 1. 引用所需库 2. 初始化(setup函数) 3. 循环执行(loop函数)
源码实现:
安装开发版支持(连接开发版后会自动弹出是否安装)和所需库文件。
在arduinoIDE中依次选择 项目-加载库-管理库 中搜索并安装相应的温湿度HTS221、压力LPS22HB、光照手势颜色APDS9960、oled屏幕SSD1306。
引用所需库文件并定义OLED参数。
#include <Arduino_HTS221.h>//温湿度
#include <Arduino_LPS22HB.h>//压力
#include <Arduino_APDS9960.h>//光照、手势、颜色
#include <PDM.h>//麦克风
//显示
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>//GFX库是SSD1306父类库,需要一起下载安装
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4);
初始化各项传感器。最终代码中删去了调试过程中的串口通讯的代码部分。
void setup() {
//初始化
HTS.begin();
BARO.begin();
APDS.begin();
PDM.onReceive(onPDMdata);
PDM.begin(1,16000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//0X3C为OLED屏幕的地址
delay(100);
display.clearDisplay();
}
short sampleBuffer[256];
volatile int samplesRead;
void onPDMdata() {
int bytesAvailable = PDM.available();
PDM.read(sampleBuffer, bytesAvailable);
samplesRead = bytesAvailable / 2;
}
温湿度、气压和光照强度在库函数的示例程序里都可以找到,可以直接使用。
噪音分贝值计算方式在群友的分享里找到了答案,下图所示,根据范例程序中读取到的声压值加以计算获得。
loop函数中预先定义了过程中需要使用的变量,而后依次读取传感器的数据并加以计算,最后统一输出到OLED屏幕上。
void loop() {
//变量声明
float temperature,humidity,pressure;
int r,g,b,a;
String state;//state变量只用于存储day和night
uint32_t sample_max = 0; //最大声压值
uint32_t sample;
//读取数据
temperature = HTS.readTemperature();
humidity = HTS.readHumidity();
pressure = BARO.readPressure();
APDS.colorAvailable();
delay(100);
APDS.readColor(r,g,b,a);//读取R,B,G,A值
if(a < 15){//15为自定义的亮度判断值。
state ="night";
}
else{
state ="day";
}
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 = 20*log10(sample_max * 5);
samplesRead = 0;
//输出数据
display.clearDisplay();
display.drawRect(0,0,128,64,WHITE);//屏幕四周边框
display.setTextSize(1); //字体大小
display.setTextColor(SSD1306_WHITE);
display.setCursor(3, 4);//温度,排版,指定左上角坐标
display.print("Temperature=");
display.print(temperature);
display.println("'C");
display.setCursor(3, 16);//湿度
display.print("Humidity=");
display.print(humidity);
display.println("%");
display.setCursor(3, 28);//气压
display.print("Pressure=");
display.print(pressure);
display.println("kPa");
display.setCursor(3, 40);//光照
display.print("LightState=");
display.println(state);
display.setCursor(3, 52);//噪音
display.print("SoundLevel=");
display.print(sample);
display.println("dB");
display.display();
delay(500);
}
结果演示:
因为使用的IIC的128*64的OLED屏幕,监测站有5行数据,因此按照12像素进行了简单排版。
效果如下:
第一行为温度,第二行为湿度,第三行为气压值,第四行为光照强度判断的白天/黑夜,第五行为噪音分贝值。(下图依次展示夜晚和白天状态下的数据)
心得体会:
从之前第一次接触arduino,就被他的易用性和开发速度吸引,这次参加活动也是深有体会,有了各项基础库文件的存在,可以在很短时间内开发出想要的模型。
一如既往的支持!
附件下载
funpack_8_ronggege.ino
团队介绍
评论
0 / 100
查看更多