Funpack第八期 ---漂亮的环境监测站
根据FUNPACK第八期的活动,制作了一个漂亮的环境监测站,用于监测周围的噪声和温湿度以及大气压强
标签
嵌入式系统
显示
飞跃1989
更新2021-05-13
712

硬件介绍

BLE NANO 33 官方已经说明的很详细了,这边就简单说一下我自己添加的额外的模块

  • 加速度

  • 温湿度

  • 大气压力

  • 光感传感器

  • 麦克风传感器

这边我采用了一块ST7789的屏幕来显示,感觉效果还是不错的。

这边根据环境监测的项目,我们了解到我们需要使用麦克风,IIC控制温湿度和大气压以及光感传感器

 

设计思路

这边我设计思路是,环境监测用一块显示器显示温湿度,以及大气压以及日照强度

这边我简单用了下局部刷新,防止整幅图刷新,这样会稍微方便一些,不然会导致图片刷起来有些缓慢。

 

这边我给了一个小彩蛋,

通过学习tinyML,尝试了一下官方的demo, 用来分类updown和wave的手势

 

介绍用本板卡最终实现了什么功能

 

本次任务用ble nano 33中的传感器实现了一个小型的环境监测站用到了开发板的以下功能:

  • IIC温湿度传感器HTS221

  • IIC 大气压传感器LPS22HB

  • IIC 光照传感器 APDS9960

  • 麦克风 PDM

麻雀虽小,五脏俱全,这颗arduino开发板的传感器功能可以说是异常强大,这次传感器除了加速度传感器没用上,其他都用上了,板子上还有RGB小灯,唯一美中不足的是没有JLINK调试器,但是对于arduino生态来讲,调试器都是多余的,代码都是很简单的,不会出错的。

最终我们实现了一个简易的环境监测站的功能,用于监测外界环境,

可以监测外部温湿度,外部大气压强,外部光照强度,外部的噪声。

各功能对应的主要代码片段及解释温湿度

温湿度HTS221

 

//setup
HTS.begin();
//loop
读取温度值
float temperature = HTS.readTemperature();
float humidity   = HTS.readHumidity();

单单的几行代码,基本已经完成了温度和湿度的读写

 

大气压值

LPS22HB 压力传感器

//setup
BARO.begin();
//loop
//读取大气压值
float pressure = BARO.readPressure();

读取大气压值

光照强度

APDS9960 光照

这个光照传感器还是挺强大的,可以完成以下功能:

  • 手势检测

  • 颜色感光

  • 环境光检测

  • 手机触摸屏禁用

  • 机械开关更换

     

//setup
APDS.begin();
//loop
//读取大气压值
int r, g, b, c;
APDS.readColor(r, g, b, c);

如果c值大于100就是白天

如果c值小于100就是晚上,这个值可以稍微浮动一些,因为光照强度有可能有时候暗,有时候亮,

噪音

噪音通过采集麦克风的PDM的数据来判断当前的噪声

//setup
PDM.onReceive(onPDMdata);
PDM.begin(1, 16000);
//loop
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];
}
uint32_t sample = 24*log10(sample_max*5); //转换分贝
samplesRead = 0;
 
​
void onPDMdata() {
int bytesAvailable = PDM.available();  
PDM.read(sampleBuffer, bytesAvailable);  
samplesRead = bytesAvailable / 2;
}

 

液晶显示屏显示数据

这边我用了一个ST7789的显示屏,显示数据,制作了一幅图片,转换成数组,在arduino平台中显示,

最终效果如视频中所示,这边我用了下局部刷新的技术,就是刷新部分图片,这样刷新会稍微快一些。

//temperature
  line_offset = 100;
  tft.drawRGBBitmap(0, 100, (uint16_t *)((uint32_t)gImage_picture+240*100*2), 240, 25);
​
  tft.setCursor(116,103);
  tft.setTextSize(3);
  tft.print(temperature);
//humidity
  line_offset = 130;
  tft.drawRGBBitmap(0, 130, (uint16_t *)((uint32_t)gImage_picture+240*130*2), 240, 25);
  tft.setCursor(116,133);
  tft.setTextSize(3);
  tft.print(humidity);
  
  ....


 

对本活动的心得体会(包括意见或建议)

 

以前一直觉得arduino都是比较低级的,儿童玩的产品。通过这次做项目才真正的了解到arduino的美丽之处,极多的库函数形式,极大的方便了开发者实现一些炫酷功能的。同时,也方便工程师理解一些外设该如何使用,如何快速搭建,如何快速跑起来。省去了很多的编译环境,IDE之类的东西。代码精简,功能炫酷,让开发者更多的时间用来创新和优化上层应用逻辑。

虽然我已经算一名老工程师了,但是确实这种arduino的编程方式,我觉得也是值得学习的。同样的,另一个视角,会看实现原理,研究里面的机制,能够学到很多东西。

另外有一点也是值得思考的,其实arduino调试起来不是很方便,大部分都是跑一些sample,如果出了问题,不太清楚具体如何调试,也是一个比较麻烦的事情。对于一些复杂的工程来说,调试是一块比较重要的手段。

 

这次我把我的小侄女的照片作为背景色,小侄女看到了非常开心,我也从这次活动中学到了很多东西。做出来的东西也是挺开心的。

同时,这次的活动还有机器学习相关的内容,这边视频中也有简单讲一些,虽然篮球感觉比较复杂一些,这边我根据官方的教程,制作了手势检测的内容,根据手势判断up还是down,还是snake行走,这个简单的tinyML也算是比较方便的制作方法了。也算是简单的入门了,后续会继续学习跟大家一起学习tinyML的相关内容。

 

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