Funpack 第八期-基于Arduino Nano 33 BLE的环境监测站
Funpack 第八期-基于Arduino Nano 33 BLE的环境监测站
标签
嵌入式系统
monnina
更新2021-05-21
669

内容介绍

开发环境介绍

本次开发,我尝试使用了Clion+Platformio来进行开发

其实这次活动算是我第一次使用arduino ,之前一直没使用是因为arduino IDE没有一个友好的使用环境,没有代码补全,编译之后再点击上传却又要重新编译,编译只能单线程编译等等..

之前使用的是Clion开发C语言,它具有强大的代码补全、界面风格、各种插件、流畅性等众多优点,毫无疑问这些是能够极大提高开发效率的。而CLion IDE就是专门面向C/C++开发的。

而PlatformIO是一款跨平台的物联网开发的生态环境,它提供跨平台的开发环境和统一的调试器,还支持远程单元测试和固件更新...它基于python进行运行,

 

而Clion支持PlatformIO,所以本次开发使用了Clion+Platformio进行开发,能够提供友好快速的开发环境。

这个是工程结构

 

FspMeHc2morjK7IcSAjKIDUbaBkg

这个是工程的配置文件和build的工作路径:

Fisv83-Ewv0ZVkZbYw4fMfjj6GjU

这里就是用户的include路径和库路径:

Fhhqqempir1JbFtC9kfrF_vw7XZH

src里面就是main文件:

FhNofBG48qZN5t20gyK2nkF2fxjo

后面就是git和Cmake和platform io 的配置文件

Ft2mg7445muQxeHs7WKFyEbvW_Bm

点击编译,在下方的消息里面可以看到编译的信息,以及使用的内存和flash的大小:

FptI2nKke6SH8S5Lxpl5OK6Iv3um

 

 

安装对应的传感器包

FsLvlfm3OM2Bo7TaC0R6Jm4dIP9D

以下是命令

pio lib --global install "arduino-libraries/Arduino_APDS9960@^1.0.3"

pio lib --global install "arduino-libraries/Arduino_LPS22HB @ ^1.0.1"

pio lib --global install "arduino-libraries/Arduino_HTS221@^1.0.0"

 

安装完库之后需要重新生成一下CMakelist文件

 

Fn0cuX2qY7zsP1KEFr8jtz437A4n

至此开发环境的配置已完成

 

代码补全功能演示:

Fnio8SvtyNfPoCXxApjRJFFjhL4u

至此开发环境的配置已完成

代码实现的功能

使用OLED 12864 显示以下参数

周边环境温度(精度:±0.1°C);

周边环境湿度(精度:±1%);

大气压强(精度:±0.1kPa);

日照强度(用于判断白天/夜晚);

周边平均噪声(精度:±1dB)。

 

代码说明

使用到的arduino 库

  • Arduino_LPS22HB

  • Arduino_HTS221

  • Arduino_APDS9960

  • U8g2lib

温湿度

通过HTS221传感器获得

FkzLFWaVVj-srPRTHiUjpd_RFHaOFkq6RMC0Kd6sB5vXYff8Xj_WEgik

temperature = HTS.readTemperature() - 8; //固定误差

humidity = HTS.readHumidity();

大气压强

通过LSP22传感器获得

 

FrfHiwVH9FMc6fwqwFvhNqn0YV0i

pressure = BARO.readPressure();

光照强度

通过APDS9960传感器获得

FvoksqklZZRqC-WAoOb6O8yXfN_8

if (APDS.colorAvailable())
{
  int r, g, b;
  APDS.readColor(r, g, b, light);
}

噪声

通过数字式麦克风MP34DT06JTR获得的PCM数据根据噪声计算公式得到。

脉冲密度调制(Pulse Density Modulation),简称PDM,是一种使用二进制数0,1表示模拟信号的调制方式。在PDM信号中,模拟信号的幅值使用输出脉冲对应区域的密度表示。PWM波是PDM波转换频率固定的一种特例,对于一个使用8位长表示的电压信号而言,峰值的1/2处会高低电平各持续一半,即128个时钟周期。在PDM信号中,会在1,0之间每个时钟周期都切换。两种波形的平均值都是50%,但是PDM波切换的更加频繁。对于100%和0的电平信号,两种方式的输出相同。

我们在主循环里面计算数据的有效值

if (bytesAvailable)
{
  long long int sum = 0;

  for (int i = 0; i < bytesAvailable / 2; i++)
  {
    sum += (long long int) sampleBuffer[i] * (long long int) sampleBuffer[i];
  }

  db = 20 * log10f(sum)  - 20 * log10f(bytesAvailable / 2);

  bytesAvailable = 0;
}

显示

u8g2.firstPage();
do
{
  u8g2_printf(0, 12, "temp  = %.2f °C", temperature);
  u8g2_printf(0, 24, "RH    = %.2f %%", humidity);
  u8g2_printf(0, 36, "Press = %.1f kPa", pressure);
  u8g2_printf(0, 48, "Noise = %.1f db", db);
  u8g2_printf(0, 60, "light = %d", light);
  u8g2_printf(88, 60, "%s", light > 1000 ? "Day" : "Night");
} while (u8g2.nextPage());

 

同时利用串口将数据发送到电脑

 

Serial1.print("Pressure    = ");
Serial1.print(pressure);
Serial1.println(" kPa");

Serial1.print("Temperature = ");
Serial1.print(temperature);
Serial1.println(" °C");

Serial1.print("Humidity    = ");
Serial1.print(humidity);
Serial1.println(" %");

Serial1.print("light       = ");
Serial1.println(light);

Serial1.print("Sound Noise = ");
Serial1.print(db);
Serial1.println(" db");

演示效果

FrQlAeamuUXpbPXtQF0SNyUzm-xb

FtrZRL0yjhZdnzVoGF68KZLJtxk7

 

期望和建议

这次已经是第二次参加硬禾的活动了,Funpack 的活动每一期都是一次惊喜,同时,在本次开发的时候也体会到了arduino的方便,而且,在Clion和platform IO的结合之下,整个开发流程十分的轻松。

总之,感谢硬禾和DigiKey提供了Funpack这一活动平台。希望这种活动能够一直进行下去。

附件下载

main.ino
代码

团队介绍

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号