风筝
发表于: 2017-7-28 14:57:43 | 显示全部楼层

在本文中,我们制作了一个经济实用的全功能蓝牙低功耗(BLE)的数据记录系统,该系统可以从多个传感器读取数据,并将数据保存到SD存储卡。


数据记录仪是环境监测的组成部分,应用广泛。根本上讲,记录仪的主要功能是读取传感器数据并随时间记录读数。


在我们的项目中,数据记录仪的传感器组由TI SensorTag提供,该传感器作为电池供电的BLE外设。要读取SensorTag,我们使用Arduino 101开发板作为BLE中央设备。要记录传感器读数,我们使用Arduino 101和SD卡模块,将带有时间戳的传感器数据写入标准的Secure Digital High Capacity(SDHC)存储卡(最多32 GB)。

Com_Pro_700x_IMG_3098.jpg


所需的材料清单

●     Ti SensorTag CC2650STK

●     Arduino / Genuino 101开发板

●     Adafruit数据记录模块

●     SDHC卡、CR1220电池


使用的软件环境

●     Arduino IDE 1.8.2

●     Intel Curie boards 2.02版(从Arduino Boards Manager安装)

●     Arduino SD库(包含在Arduino IDE中)

●     SensorTag固件版本1.32

●     Windows 7(64位)操作系统


SensorTag

ST_in_case_700_x_IMG_3084.jpg

在撰写本文时,TI提供了三种SensorTag。我们用于该项目的SensorTag(CC2650STK,多标准SensorTag)是基于CC2650低功耗无线MCU,并且是一个BLE 4.0外设。低功耗功能使SensorTag可以由电池供电,并且可以使用单个电池(CR2032)提供超过一年的电池寿命。


该设备拥有令人印象深刻的传感器组以及其他功能。 TI为该设备提供开源硬件和软件参考设计支持。 SensorTag及其组件在专门的TI论坛上也有大量的开发人员和用户支持。详细内容请参考此链接:SensorTag

ST_out_of_case_700x_IMG_3070.jpg


TI在线提供了SensorTag的完整部分,您可以看到所有的细节,包括所有传感器和其他组件以及它们在电路板上的位置。


我们将在数据记录仪项目中的SensorTag上使用以下传感器:

●     TMP007 - 红外热电偶传感器

●     OPT3001 - 环境光传感器

●     HDC1000 - 温湿度传感器

●     BMP280 - 气压传感器


SensorTag作为BLE外设运行,除了上述传感器的数据手册外,建议您了解另外两个文档:SensorTag用户指南完整的通用属性(GATT)表


值得注意的是,在程序存储器的限制之内,如果您特别需要它们,则可以添加另一个可用的传感器(MPU-9250)和其他开关(例如磁簧开关、用户按钮)。甚至有一个可以使用的数字麦克风。


Arduino 101开发板

要从SensorTag获取数据,我们需要一个微控制器和BLE功能。具体来说,我们需要BLE功能,包括在中心角色中运行的能力。 SensorTag作为外设。为了使微控制器找到它,连接到它并与之相反(即读取传感器),它需要作为中央设备工作。


考虑本项目的外设与中心角色的另一种方法是将SensorTag视为GATT服务器,将微控制器视为GATT客户端。


Arduino 101板载BLE功能,随着Core 2.02版(可通过Arduino IDE安装)的发布,它可以作为外设或中心角色运行。

A101_700x_IMG_3056.jpg


它是一个3.3V的电路板,包含可以耐受5V的I / O,以及一个Intel居里微处理器(32位Intel Quark SoC)。有大量的I / O以及SPI和I2C接口。它具有许多熟悉的Arduino系列的编程易用性,可以使用无处不在的Arduino IDE。开发板的原理图可以在线获得,固件的源代码也是如此。此外,还有开发板和居里芯片的支持论坛。


SD卡和RTC

DL_700x_IMG_3064.jpg

一旦我们能够连接到SensorTag,并且可以使用Arduino 101开发板读取传感器,我们就需要保存数据。另外,因为我们将定期记录数据,所以需要对传感器读数添加时间戳。


为了完成这些功能,项目的第三个硬件组件是上图所示的Adafruit数据记录模块。模块的原理图可以在线获得,并且有大量详细的文档,包括示例。


该模块带有一个SD卡接口,可以支持FAT16或FAT32格式的SD卡。该模块还带有一个电池(CR1220)备份的PCF8523实时时钟(RTC)。这两个功能正是我们完成数据记录仪所需要的。


要使用SD卡功能,我们将使用IDE中包含的Arduino SD库。有许多软件可用于格式化SD卡,我使用SD Formatter for Windows工具,将32GB卡格式化成FAT32。


要使用RTC,您需要安装Adafruit库。该库包括一些例子,其中包括使用编译代码计算机的时间和日期戳设置时钟的例子。


该库提供了Unix time变量(unixtime)以及通常的时间和日期变量。 Unix时间起始时间为自从00:00:00 1970年1月1日星期四(UTC)开始的秒数。我们将使用此变量对传感器读数进行计时。

LEDs2_700x_IMG_3077.jpg


我们将用于数据记录器模块的另一个功能是可用的两个用户LED。要使用此功能,您需要焊接L1和L2两个连接到数字I / O端口的接头连接的引脚。我分别使用了端口6和7(见上图)。通过这些连接,我们可以在程序内使用LED1和LED2(它们靠近复位按钮)向用户发出信号。


程序设计

一旦我们解决了硬件组件,我们就可以解决这个软件了。包含的程序SensorTagDLv1.ino是数据记录器的完整Arduino 101程序。它可以自由评论,以下是旨在作为理解该计划的指南。文章中的其他部分(用户指南、GATT表、传感器数据表)中的BLE编程和链接参考资料的一些基础知识也将有助于理解该程序。


要从SensorTag获取传感器读数,需要下列过程。同样,建议您熟悉上述SensorTag用户指南和完整的GATT表格,因为这些文档中概述了SensorTag的特性和服务以及阅读每个传感器的具体过程。


1.找到SensorTag。 Arduino 101开发板通过扫描外设,并通过广播名称“CC2650 SensorTag”来识别SensorTag,当Arduino 101找到外围设备时,它可以在变量peripheral.localName()中使用。


SensorTag必须广播以被任何中央设备检测到。在通电(通过按电源按钮)SensorTag通告约2分钟(100毫秒间隔)。在与设备断开连接后,广​​告也会发生相同的间隔。传感器标签上的绿色LED以1Hz速率闪烁显示广告。


2.连接到SensorTag。一旦中央设备被看到,与SensorTag的连接是很容易的。然而,在这种情况下,连接与SensorTag不提供的安全配对或绑定不同 - 它是一种简单且非安全的连接。


另外值得注意的是,数据记录器只需要一个传感器标签,并连接到第一个。如果您的环境包含多个传感器标签,则可以修改程序中的部分,以搜索特定SensorTag的MAC地址。


3.发现周边特征。基本上,发现过程是一个BLE过程,让中央设备(Arduino 101)知道外围设备(SensorTag)所提供的内容。当然,我们已经知道SensorTag中有哪些属性,但是我们仍然需要以编程方式发现它们。功能do_discovery()发现我们想要读取的每个传感器的外设属性。在每种情况下,都会发现“值”和“控制”属性。


任何特征发现的故障导致外设断开。


4.订阅外设服务。对于每个传感器,存在服务订购功能(例如,用于大气压力传感器的subscribe_BP())。中央设备必须预订外设服务,才能请求外设提供服务使用。


5.读一个传感器。一旦我们“连接”,“发现”和“订阅”,只要我们保持连接,我们就可以读取传感器,而不必重复发现和订阅过程。基本上,我们需要请求传感器打开,等待传感器执行读取的时间。然后获取传感器值,最后请求关闭传感器。


请注意,此过程不同于使用通知过程,其中传感器以某种间隔连续读取,并且外围设备通知中央设备已更新传感器值。


SensorTag可以任意一种配置。也就是说,我们可以打开通知并使用它们。然而,我们在数据记录器中的方式要求较少的传感器功率,并为Arduino 101提供更多的控制。我们要求传感器只有在需要读数时才能读取。


为了进一步说明该过程,下面的代码片段显示了我们如何读取湿度传感器(连接,发现和订阅之后)。从SensorTag用户指南中,我们知道温度和相对湿度值将作为16位值(以LSB,MSB顺序)传输。这些值将从HUMValCharacteristic的字节数组中读取。在得出温度和相对湿度的最终值后,将它们保存在数据结构中。

  1. if (peripheral.connected()) {
  2.     // while the peripheral is connected, turn the humidity sensor on by writing a '1' to the characteristic
  3.     HUMConCharacteristic.writeByte(0x01);
  4.     delay(1200); // wait for the sensor to do a read
  5.     unsigned int rawtem = (HUMValCharacteristic[0]) + (HUMValCharacteristic[1] * 256);
  6.     unsigned int rawhum = (HUMValCharacteristic[2]) + (HUMValCharacteristic[3] * 256);
  7.     HUMConCharacteristic.writeByte(0x00); // turn the sensor off
  8.     // calculate final temperature and relative humidity values
  9.     float temp = (rawtem / 65536.0) * 165.0 - 40.0;
  10.     temp = ((temp * 9.0) / 5.0) + 32.0; // convert to F - comment out to leave at C
  11.     float hum = ((double)rawhum / 65536.0) * 100.0;
  12.     // save into the structure
  13.     SensorData.tem = temp;
  14.     SensorData.hum = hum;
  15.   }
复制代码


测试程序

当我构建类似数据记录仪这样的项目时,我通常会在开发过程的早期写一个初步的程序。在这种情况下,包含的程序SensorTagTestv1.ino就是这样一个程序。


该程序根本不使用SD卡模块。然而,它连接到SensorTag并读取传感器。它使用Arduino串行监视器显示连接、发现、订阅和传感器值的状态(并根据需要提供错误消息)(见下面的屏幕截图)。它可以作为数据记录仪项目和读者可能有兴趣创建的任何类似项目的开发辅助。

screenshot-1_1400x.jpg


数据图

如果不能显示几个图形,那么制作数据记录仪还能有什么乐趣呢?

Humidity_700x.jpg

Light_700x.jpg

Pressure_700x.jpg


总结

这是一个非常有价值的项目,我觉得超出了我的期望。该项目的优势是采用电池供电的传感器组,并且BLE功能使其可以容易地将其放置在离其他数据记录系统较远距离。此外,该项目可以进行增强和扩展,以满足特定需求。


SensorTag是令人印象深刻的设备。 Arduino 101开发板包含板载的BLE无线和CurieBLE软件,并且可以作为BLE中央设备,使得使用SensorTag时变得很容易。使用带RTC功能的SD卡模块,这样您有了一个相当容易构造并且非常有用的设备。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 15:35 , Processed in 0.073244 second(s), 10 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表