雷竞技注册
项目

使用TI SensorTag构建一个Arduino 101数据记录器

2017年6月07通过雷蒙德热那亚

使用Arduino/Genuino 101、TI SensorTag和SD屏蔽构建BLE多传感器数据记录器,记录温度、湿度、大气压力、环境光等。

在这个项目中,我们建立了一个经济的、功能全面的蓝牙低能耗(BLE)数据记录系统,从多个传感器读取数据,并将数据保存到SD存储卡。

数据记录仪是环境监测的重要组成部分,应用广泛。基本上,记录仪读取传感器数据并记录随时间变化的读数。

在我们的项目中,数据记录器的传感器阵列由TI SensorTag提供,该标签作为电池供电的可编程外围设备运行。为了读取SensorTag,我们使用Arduino 101作为可编程中央设备运行。为了记录传感器读数,我们使用Arduino 101和SD屏蔽,将时间戳传感器数据写入可由多个计算机系统读取的标准安全数字高容量(SDHC)存储卡(高达32 GB)。

已完成的数据记录器项目。

项目需求

材料清单

描述 价格(美元)
传感器标签CC2650STK也可提供在这里在这里 29.00美元
Arduino / Genuino 101 30.00美元
Arduino的Adafruit数据记录屏蔽 13.95美元
情况下,电力供应,SDHC卡,CR1220电池 $25.10
**注:所列案例稍作修改,以适应SD卡和允许访问复位按钮的屏蔽。

用于项目的作者设置

  • Arduino IDE 1.8.2
  • 英特尔居里板2.02版(从Arduino boards Manager安装)
  • Arduino SD库(包含在Arduino IDE中)
  • SensorTag固件版本1.32
  • Windows 7(64位)操作系统

密码

该项目的Arduino程序可在本文末尾下载。

SensorTag

CC2650STK SensorTag在其外部框中。

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

该设备拥有一系列令人印象深刻的传感器和附加功能。TI为该设备提供了开源硬件和软件参考设计支持(参见链接)在这里搜索“SensorTag”在这里)。此外,开发人员和用户对专用网络上的SensorTag及其组件也提供了大量支持透明国雷电竞newbee际论坛

无外框的CC2650STK SensorTag。

TI提供了一个完整的拆卸您可以看到所有的细节,包括所有传感器和其他组件及其在板上的位置。

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

SensorTag作为BLE外围设备运行,除了上面列出的传感器数据表之外,建议您熟悉另外两个文档:SensorTagraybet开户用户指南全部通用属性(GATT)表

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

阿杜伊诺101

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

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

Arduino 101(美国以外的Genuino 101)包含车载可编程功能,随着核心版本2.02(可通过Arduino IDE安装)的发布,可在外围或中心角色中运行。

Arduino/Genuino 101板

它是一块3.3V板,具有5V容错I/O,包含英特尔居里微处理器(32位英特尔Quark SoC)。有大量的I/O以及SPI和I2C接口。它具有熟悉的Arduino系列的编程简单性,并且可以使用无处不在的Arduino IDE。董事会的示意图可在线获取,与固件的源代码. 此外,还有支持论坛雷电竞newbee董事会居里炸薯条

SD卡和RTC

Adafruit数据记录盾(Rev B)。

一旦我们能够连接到SensorTag并用Arduino 101读取传感器,我们需要能够保存数据。此外,由于我们将定期记录数据,因此需要对传感器读数进行时间戳。

为了完成这些功能,项目的第三个也是最后一个硬件组件是Adafruit数据记录屏蔽。的示意图因为防护罩是可以在线使用的,而且有相当数量的详细的文档对于包含示例的板。

该板具有一个SD卡接口,工作与FAT16或FAT32格式的卡。该板还具有一个特点PCF8523实时时钟(RTC)与电池(CR1220)备份。这两个特性正是我们完成数据记录器所需要的。

要使用SD卡功能,我们将使用IDE中包含的Arduino SD库SD格式化程序适用于32GB卡和FAT32格式的Windows操作系统。

要使用RTC,您需要安装图书馆从Adafruit可以在网上找到。该库包括许多示例,其中一个示例使用用于编译代码的计算机的时间和日期戳来设置时钟。

图书馆提供了一个Unix时间变量(unixtime)以及通常的时间和日期变量。Unix time将时间跟踪为自1970年1月1日星期四00:00:00 (UTC)以来的秒数。我们将使用这个变量来记录传感器读数的时间。

用户led (LED1和LED2)的连接。

我们将为数据记录器使用的屏蔽还有另一个特性,那就是两个可用的用户led。为了使用这个功能,你需要从L1和L2焊接两个连接,以引脚在头连接的数字I/O端口。我分别使用端口6和端口7(见上图)。通过这些连接,我们可以在程序中使用LED1和LED2(它们靠近重置按钮)向用户发送事件信号。

编程

一旦我们确定了硬件组件,我们就准备好解决软件问题了。所包含的程序SensorTagDLv1。ino,是完成Arduino 101程序的数据记录器。它有大量的注释,下面的内容旨在作为理解该程序的指南。BLE编程的一些基本知识和文章中其他链接的参考资料(用户指南、关贸总协定表、传感器数据表)也将有助于理解程序。

要从SensorTag获得传感器读数,需要以下步骤。同样,建议您熟悉前面提到的SensorTag用户指南和完整的GATT表,因为SensorTag的特性和服务,以及读取每个传感器的具体过程都在这些文档中列出了。

1.找到SensorTag。Arduino 101通过扫描外围设备并通过广告名称“CC2650 SensorTag”识别SensorTag来查找SensorTag,当Arduino 101找到外围设备时,该名称在变量peripal.localName()中可用。

任何中央设备都必须检测到SensorTag的广告。通电(按下电源按钮)后,SensorTag的广告时间约为2分钟(间隔100毫秒)。从设备断开连接后,广告也会在相同的时间间隔内进行。传感器标签上的绿色LED指示广告,以1 Hz的频率闪烁。

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

值得注意的是,数据记录器只期望有一个SensorTag,并将连接到第一个找到的。如果您的环境包含多个SensorTag,那么可以修改程序中的部分,以搜索特定SensorTag的MAC地址。

3.发现外围特征。本质上,发现过程是一个让中央设备(Arduino 101)知道外围设备(SensorTag)必须提供什么的可恢复过程。当然,我们已经知道SensorTag中的属性,但是我们仍然需要通过编程来发现它们。函数do_discovery()发现我们要读取的每个传感器的外围属性。在每种情况下,都会发现一个“值”和一个“控制”属性。

任何特征发现失败都会导致外围设备断开连接。

4.订阅外围服务。对于每个传感器,都有一个服务订阅函数(例如,用于气压传感器的subscribe_BP())。在中心设备请求外设提供服务之前,它必须订阅外设服务。

5.读一个传感器。一旦我们“连接”、“发现”和“订阅”,只要我们保持连接,我们就可以读取传感器并执行此操作,而无需重复发现和订阅过程。

基本上,我们需要请求打开传感器,并等待传感器执行读取所需的时间。然后获取传感器的值,最后,请求关闭传感器。

注意,这个过程不同于使用通知过程,在通知过程中,传感器以一定的间隔持续读取,外围设备通知中心设备传感器值已经更新。

SensorTag可通过任何一种方式进行配置。也就是说,我们可以打开通知并使用它们。然而,我们在数据记录器中这样做的方式需要传感器标签提供更少的电源,并为Arduino 101提供更多的控制。我们要求仅在需要读数时读取传感器。

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

如果(peripheral.connected()){//当外围设备连接时,通过向特性HUMConCharacteristic.writeByte(0x01);延迟(1200);//等待传感器读取无符号int-rawtem=(HUMValCharacteristic[0])+(HUMValCharacteristic[1]*256);无符号int-rawhum=(HUMValCharacteristic[2] )+(HUMValCharacteristic[3]*256);HUMConCharacteristic.writeByte(0x00);//关闭传感器//计算最终温度和相对湿度值浮动温度=(rawtem/65536.0)*165.0-40.0;温度=((temp*9.0)/5.0)+32.0;//转换为F-注释输出以保留在C浮动温度=(双)浮动温度/65536.0)*100.0;//保存到结构SensorData.tem=temp;SensorData.hum=hum;}

程序功能说明

setup()–包含常见的初始化和终端错误检查(请参见下面的说明)。初始化BLE并开始扫描外围设备。

write_data()–读取传感器并将值存储在数据结构中后,将结构元素写入SD卡。

t_error() -在无限循环中闪烁两个用户的led。

do_discovery() -对感兴趣的每个SensorTag特征执行发现。

每个传感器的订阅和读取功能,例如subscribe_BP(BLEDevice外围设备)和read_BP(BLEDevice外围设备)。

loop()–扫描传感器标签,连接到传感器标签,调用do_discovery()并为每个感兴趣的传感器调用subscribe()函数。随后,在连接时,读取所有传感器并调用write_data(),并在一段时间后重复。如果SensorTag断开连接,它将开始扫描并再次启动整个过程。

程序注释

时期传感器读取的时间间隔存储在全局变量“period”中,定义为传感器读取发生前(初始传感器读取后)的毫秒数。默认值=600000(10分钟)。

数据文件。数据文件的名称存储在全局变量fname[]中,默认名称为“STDATA.CSV”。如果该文件不存在,则创建该文件。如果该文件存在,则将数据附加到该文件中。

数据以逗号分隔值(csv)格式写入。每行包含以下措施:

unixtime、温度、湿度、大气压、模具温度、勒克斯、对象温度、模具温度。

“模具温度”值分别是来自BMP280和TMP007的片上温度读数。

物体温度为未校准价值。看到TMP007校准指南PDF了解更多关于这个问题的信息。

RTC.SD屏蔽上的RTC设置为系统时间,当程序使用一行编译时," RTC .adjust(DateTime(F(__DATE__), F(__TIME__));"。如果您想以另一种方式设置时钟,只需注释掉这一行。

LED1(绿色)和LED2(红色)。led灯用于向用户发送状态信号,方式如下:

终端错误-两个led在t_error()函数中循环闪烁。当出现需要用户干预的错误时,将调用此函数。当出现以下情况时,会出现终端错误:1)RTC无法初始化,2)SD无法初始化,3)无法连接到SensorTag, 4)无法发现或订阅服务,5)无法打开SD写入数据。前三种情况在setup()函数中检查,第四种情况在loop()中检查,最后一种情况在write_data()函数中检查。

周期等待循环-当程序等待“周期”到期时,绿色LED闪烁。

正在写入数据——正在写入SD卡时绿色LED点亮。在屏蔽板上还有一个红色的LED标记着“SD”(与LED1和LED2分开),当SD卡被访问时,它会短暂地照亮。

连接到SensorTag -当未连接到SensorTag时,红色LED将被点亮。如果你看到红色LED在开机时只是短暂地亮了一下,那很可能是SensorTag不是在做广告,这样Arduino 101就不可能找到它。如果在正常工作时看到红色LED亮起,说明由于干扰或距离限制等原因,连接已断开。在失去连接的情况下,软件将自动尝试重新连接并继续记录。

测试程序

当我构建一个像数据记录器这样的项目时,我通常在开发过程的早期编写一个初步程序。在本例中,包含的程序SensorTagTestv1。伊诺,就是这样一个程序。

此程序根本不使用SD屏蔽。但是,它将连接到传感器标签并读取传感器。它使用Arduino串行监视器显示连接、发现、订阅和传感器值的状态(并根据需要提供错误消息)(见下面的屏幕截图)。它是作为数据记录器项目和读者可能感兴趣创建的任何类似项目的开发帮助提供的。

从SensorTagTestv1截图。伊诺(点击扩大)。

数据图

如果你不能展示一些图表,那么做一个数据记录器有什么乐趣呢?

封闭的思想

这是一个有回报的项目,我觉得它超出了我的预期。传感器阵列电池供电尤其有利,BLE功能使其易于与测井系统的其余部分保持一定距离。此外,可以加强和扩大该项目,以满足特殊需要。

SensorTag是一款令人印象深刻的设备。Arduino 101具有车载可编程无线电和随附的CurieBLE软件,包括作为中央设备的功能,使使用SensorTag变得容易。在这对设备上添加一个带RTC的SD屏蔽,您就有了一个非常有用的设备,相对来说,它的构造非常简单。

你自己试试这个项目吧!获取BOM表。

单击下面的链接可以下载项目的程序文件。

DataLogger.zip

8评论
  • s
    Simset 2017年8月2日

    你好,

    我测试了你的项目文件,效果很好。谢谢你。
    我想添加对de IMU的支持。但是,即使在重新创建了服务发现函数、订阅测试和读取测试之后,我仍然有一个奇怪的结果:我对加速度值的每个度量值都等于0。
    似乎我从未发送唤醒IMU的好参数。
    我试着在TI-BLE device monitor上查看要在参数中设置的值。但即使这样,它也不起作用。
    你有什么想法或链接可以帮我吗?

    再次感谢您的工作。

    喜欢的。 回复
    • R
      雷蒙德热那亚 2017年8月2日
      谢谢你的好话,首先是“IMU”是旧的SensorTag中的术语,它已被Invense的MPU9250运动传感器所取代。只是想确保我们在同一页上。我没有使用它,但我只是看完了GATT表格。简单的传感器更复杂,但我认为会遵循相同的程序。如果你看在移动传感器的表格中,您可以看到只能写入三个特征-就像,例如,气压传感器。对于后一个传感器,您可以写入一个特征,以1)启用通知,2)启动传感器读数,3)设置周期。启动传感器对您来说是目前最重要的一个,因为您根本得不到任何读数,这可能是因为它没有打开。例如,运动传感器的工作原理与气压传感器相同,运动传感器的关键是:0x3C 0xAA82运动配置RW轴启用位:gyro-z=0,gyro-y,gyro-x,acc-z=3,acc-y,acc-x,mag=6范围:位8,9因此,不要像使用气压传感器那样简单地打开它,你必须启用这些位,你需要查看《用户指南》中“运动传感器”下的说明。在这里,它们有关于不同位的信息。同样,我没有使用运动传感器,但这是我将采取的方法。希望这有帮助,请让我们知道会发生什么。
      喜欢的。 回复
      • s
        Simset 2017年8月3日,
        您好,谢谢您的快速回复。是的,我目前正在使用Sensortag第二版。关于未来的道路,我也得出了同样的结论。但经过几个小时的“尝试但没有得到结果”,我认为我的问题更多的是基于语法。我根据Gatt表创建了blecharts。注意到写什么样的数据才开心。但当我发送新值时,特征不会更新。我尝试了writeByte、writeValue(使用一个字节数组,甚至使用offset设置为0的版本),似乎都不起作用。这很尴尬,但就像当我需要写不止一个字节时,它就被忽略了。我只需要做:const byte paramaxl[2] = {0x38,0x02}; IMUConCharacteristic.writeValue(paramaxl, 2, 0); (random delay) Serial.print(IMUValCharacteristic[0]); (I repeat this line until the value n°12 to be sure to cover all axes) And I only get a bunch of zeros. If you have an idea about what am I missing... Thanks again for your time.
        喜欢的。 回复