硬件介绍
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的相关内容。