关于电路
项目

Build an Arduino 101 Data Logger with the TI SensorTag

June 07, 2017经过raymond Genovese

使用Arduino/feenino 101,Ti SensOrtag和SD屏蔽层构建BLE多传感器数据记录仪,以记录温度,湿度,大气压,环境光等。

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

数据记录仪是具有广泛应用的环境监视的组成部分。从本质上讲,记录器读取传感器数据并随着时间的推移记录读数。

在我们的项目中,数据记录器的传感器阵列由Ti Sensortag提供,该Ti Sensortag作为电池供电的BLE外围功能。要读取Sensortag,我们使用Arduino 101作为BLE中央设备。为了记录传感器读数,我们使用Arduino 101以及SD屏蔽台将时间戳记的传感器数据写入标准安全的数字高容量(SDHC)存储卡(最多32 GB),可以通过多个读取计算机系统。

这completed data logger project.

项目要求

材料清单

Description 价格(美元)
Sensortag CC2650STK也提供这里这里 $29.00
Arduino/funino 101 $ 30.00
Arduino的Adafruit数据记录屏蔽层 $ 13.95
Case,,,,电源,,,,SDHC卡,,,,CR1220电池 $ 25.10
**注意:列出的案例已稍作修改为accommodateSD卡,允许访问屏蔽上的重置按钮。

作者的设置用于该项目

  • Arduino IDE 1.8.2
  • 英特尔居里板2.02版(从Arduino董事会经理安装)
  • Arduino SD库(包括在Arduino IDE中)
  • sensortagfirmware revision 1.32
  • Windows 7(64位)OS

代码

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

sensortag

这CC2650STK SensorTag in its external enclosure.

在撰写本文时,Ti有三个Sensortag。我们用于该项目的SensOrtag(CC2650STK,多标准Sensortag)基于CC2650低功率无线MCU,并且是BLE 4.0外围。低功率功能使Sensortag可以电池供电,并且可以通过单个硬币电池电池(CR2032)提供一年多的电池寿命。

该设备设有令人印象深刻的传感器以及其他功能。Ti为设备提供开源硬件和软件参考设计支持(请参阅链接这里并搜索“ sensortag”这里)。在专用的TI论坛

CC2650STK SensOrtag没有外部外壳。

ti提供完整的拆除在网上的Sensortag中,您可以看到所有详细信息,包括所有传感器和其他组件及其在板上的位置。

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

Sensortag作为BLE外围设备运行,除了上面列出的传感器的数据表外,建议您熟悉两个附加文档:Sensortagbeplay无法取钱用户手册和完整的通用属性(GATT)表

It is notable that, within program memory limitations, another available sensor (MPU-9250如果您特别需要它们,则可以添加其他开关(例如,磁性芦苇开关,用户按钮)。甚至还有一个可以使用的数字麦克风。

Arduino 101

To get data from the SensorTag, we need a microcontroller and BLE capability. Specifically, we need BLE capability that includes the ability to function in the central role. The SensorTag operates as a peripheral device. In order for the microcontroller to find it, connect to it and converse with it (i.e., read the sensors), it needs to work as a central device.

考虑该项目的外围和中心角色的另一种方法是将Sensortag视为GATT服务器和微控制器作为GATT客户端。

Arduino 101(美国以外的典型101)包含板载玻璃功能,并且发布Core 2.02版(可通过Arduino IDE安装)的发布可以在外围或中央角色中起作用。

Arduino/feenino 101板

它是一个3.3V板,具有5V耐耐受性I/O,并包含Intel Curie微处理器(32位Intel Quark Soc)。有很多I/O以及SPI和I2C接口。它具有熟悉的Arduino家族的大部分编程,并且可以使用无处不在的Arduino IDE。董事会的原理图在线上以及固件的源代码。此外,还有木板居里芯片。

SD卡和RTC

Adafruit数据盾牌(Rev B)。

一旦我们能够与Sensortag连接并使用Arduino 101读取传感器,我们就需要能够保存数据。此外,由于我们将定期记录数据,因此我们需要为传感器读取时间戳。

为了完成这些功能,该项目的第三个也是最终的硬件组件是上图所示的Adafruit Datalogging盾牌。这原理图for the shield is available online and there is a considerable amount of详细的文档对于包括示例的董事会。

这木板features an SD card interface that works with FAT16 or FAT32 formatted cards. The board also features aPCF8523real time clock (RTC) with battery (CR1220) back up. These two features are precisely what we need to complete the data logger.

要使用SD卡功能,我们将使用IDE中包含的Arduino SD库。有许多程序可用于格式化SD卡,我使用了SD格式化for Windows with a 32GB card and a FAT32 format.

要使用RTC,您需要安装来自Adafruit的图书馆这可以在线提供。该库包括许多示例,包括使用用于编译代码的计算机的时间和日期邮票来设置时钟的示例。

图书馆提供了一个Unix时间variable (unixtime) as well as the usual time and date variables. Unix time tracks time as the number of seconds since 00:00:00 Thursday, 1 January 1970 (UTC). We will use this variable to time stamp our sensor readings.

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

我们将用于数据记录器的盾牌的另一个功能,这是可用的两个用户LED。为了利用此功能,您需要将两个连接从L1和L2焊接到数字I/O端口的标头连接上。我分别使用了端口6和7(见上图)。通过建立这些连接,我们可以在程序中使用LED1和LED2(附近的重置按钮)向用户发出向用户的信号。

编程

Once we have settled on the hardware components, we are ready to address the software. The included program, SensorTagDLv1.ino, is the complete Arduino 101 program for the data logger. It is liberally commented and what follows is intended as a guide for understanding the program. Some basic knowledge of BLE programming and the linked reference material elsewhere in the article (user guide, GATT table, sensor data sheets) will also aid in understanding the program.

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

1.找到感觉符号。Arduino 101通过扫描外围设备并通过广告名称“ CC2650 sensortag”识别Sensortag,从而找到了Sensortag,当Arduino 101发现了一个外围设备时,可以在可变的外围围栏.localname()中获得。

SensOrtag必须是广告,必须由任何中央设备检测到。电源加快时(通过按下电源按钮)时,Sensortag在大约2分钟(100毫秒间隔)广告。从设备断开连接后,广​​告也发生了相同的间隔。广告是由绿色的LED以1 Hz速度闪烁的绿色LED表示。

2.连接到sensortag。Once it has been seen by the central device, connection to the SensorTag is easy. In this case, however, a connection is not the same as a secure pairing or bonding, which the SensorTag does not offer—it is a simple and non-secured connection.

同样值得注意的是,数据记录器期望只有一个Sensortag出现在那里,并将连接到第一个发现。如果您的环境包含多个SensOrtag,则可以修改程序中的部分以搜索特定Sensortag的MAC地址。

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

任何特征发现的失败都会导致周围断开。

4.订阅外围服务。对于每个传感器,都有一个服务订阅函数(例如,用于气压压力传感器的subscribe_bp())。中央设备必须订阅外围服务,然后才能要求外围设备提供服务的使用。

5.阅读传感器。一旦我们“连接”,“发现”和“订阅”,我们就可以阅读传感器并这样做,而无需重复发现和订阅过程,只要我们保持连接。

Basically, we need to request that the sensor be turned on and wait for the time it takes the sensor to perform a read. Then get the sensor values and, finally, request that the sensor be turned off.

请注意,此过程与使用通知过程不同,在该通知过程中,在该通知过程中不断读取传感器,并且外围设备通知中心设备已更新传感器值。

Sensortag可以以任何一种方式配置。也就是说,我们可以打开通知并使用它们。但是,我们在数据记录器中执行此操作的方式需要更少的sensortag功率,并为Arduino 101提供更多控制权。我们要求仅在需要读取时才读取传感器。

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

if(ourpheral.connected()){//在连接周围时,通过将'1'写入特征性的humconCharacteristic.writebyte.writebyte(0x01)来打开湿度传感器;延迟(1200);//等待传感器执行读取unsigned int rawTem =(Humvalacteristic [0]) +(Humvalacteristic [1] * 256);未签名的int rawhum =(Humvalacteristic [2]) +(Humvalacteristic [3] * 256);humconcharacteristic.writebyte(0x00);//将传感器关闭//计算最终温度和相对湿度值float temp =(RAWTEM / 65536.0) * 165.0-40.0;temp =((temp * 9.0) / 5.0) + 32.0;//转换为f-评论以离开c float hum =((double)rawhum / 65536.0) * 100.0;//保存到结构sensordata.tem = temp;sensordata.hum = hum; }

程序功能的描述

设置() - 包含通常的初始化和检查终端错误的检查(请参见下面的描述)。初始化BLE并开始扫描外围设备。

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

t_error() – flashes both user LEDs in an endless loop.

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

subscribe and read functions for each sensor, e.g., subscribe_BP(BLEDevice peripheral) and read_BP(BLEDevice peripheral).

loop() - 扫描sensortag,连接到sensortag,调用do_discovery()并调用每个感兴趣的传感器的subscribe()函数。随后,在连接时,会读取所有传感器并调用write_data(),并在段过期后重复。如果感觉符号断开连接,它将开始扫描并重新启动整个过程。

Program Notes

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

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

数据以逗号分离值(CSV)格式编写。每行都包含以下措施:

Unixtime,温度,湿度,气压压力,模具温度,lux,物体温度,死温度。

“死温度”值分别是BMP280和TMP007的片上温度读数。

对象温度是未校准价值。看到TMP007校准指南PDF有关此问题的更多信息。

RTC。SD Shield上的RTC设置为使用该行编译程序时的系统时间,“ RTC.ADJUST(DATETIME(f(__ date__),f(__ time__)));”。如果您想以另一种方式设置时钟,只需评论该行即可。

LED1(绿色)和LED2(红色)。LED用于通过以下方式向用户发出状态:

Terminal Error – Both LEDs flash in an endless loop in the function t_error(). This function is called when there has been an error that requires user intervention. A terminal error occurs when any of the following situations arise: 1) RTC cannot be initialized, 2) SD cannot be initialized, 3) cannot connect to the SensorTag, 4) cannot discover or subscribe to services, and 5) SD cannot be opened to write the data. The first three situations are checked in the setup() function, the fourth in loop(), and the last in the write_data() function.

周期等待循环 - 绿色LED在程序等待“期间”到期时会闪烁。

编写数据 - 在将数据写入SD卡时,绿色LED被照亮。屏蔽层(与LED1和LED2分开)也有一个红色LED标记为“ SD”,该红色LED将在访问SD卡时短暂照明。

Connecting to the SensorTag – when not connected to the SensorTag, the red LED will be illuminated. If you see the red LED illuminated more than briefly on power up, it is likely that the SensorTag is not advertising, making it impossible for the Arduino 101 to find it. If you see the red LED illuminated during normal operation, connection has been lost for some reason such as intererence or distance limitation. In the case of a lost connection, the software will automatically try to reconnect and continue recording.

测试程序

当我构建像数据记录器这样的项目时,我通常在开发过程的早期编写初步程序。在这种情况下,随附的程序Sensortagtestv1.ino就是这样的程序。

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

sensortagtestv1.ino的屏幕截图(点击放大)。

数据图

如果您无法炫耀几张图,那么制作数据记录仪有什么乐趣?

结束思想

这是一个有意义的项目,我觉得这超出了我的期望。将传感器阵列电池供电和BLE功能使其易于将其定位在距离日志记录系统的距离的距离时,这是特别有利的。此外,可以增强和扩展该项目以满足特定需求。

Sensortag是一种令人印象深刻的设备。Arduino 101带有车载玻璃电台,其中包括奇异软件,包括充当中央设备的功能,使使用Sensortag变得容易。在这对带有RTC的SD屏蔽层中,您拥有一个非常有用的设备,该设备相对易于构造。

为自己自己尝试一下!得到bom。

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

datalogger.zip

8条评论
  • s
    模拟 2017年8月2日

    Hello,

    我测试了您的项目文件,并且效果很好。谢谢你。
    我想添加de imu支持。但是,即使在重新创建服务发现功能,订阅测试和阅读测试之后,我也有一个奇怪的结果:我对加速度值的每一个措施都等于0。
    看来我从未发送过良好的参数来唤醒IMU。
    我试图查看Ti Ble设备监视器,以查看在参数中设置的值。但是即使这样,也行不通。
    您有一个想法或链接可以帮助我吗?

    再次感谢您的工作。

    Like. 回复
    • r
      raymond Genovese 2017年8月2日
      感谢您的客气话。首先,“ IMU”是较旧的Sensortag中的术语,它已被Invensense的MPU9250替换为MPU9250。只想确保我们在同一页面上。我没有使用过它,但是我只是看了看Gatt桌子。一个简单的传感器更为复杂,但我认为将遵循相同的程序。如果您查看移动传感器的桌子,您可以看到只能写入三个特征 - 例如,大气传感器。对于后一个传感器,您可以写入以下特征1)启用通知,2)启动传感器读数,3)设置一个周期。目前,启动传感器对您来说是重要的一个,因为您根本没有收到任何读数,这仅仅是因为它没有打开。例如,看起来相同的方案适用于运动传感器与气压传感器一样,运动传感器的关键为:0x3C 0xAA82运动配置config rw轴启用位:gyro-z = 0,gyro-y,gyro-y,gyro--x,acc-z = 3,acc-y,acc-x,mag = 6范围:位8,9,因此,您必须启用这些位,而不是简单地打开它,而是要查看在移动传感器下的用户指南中的解释中。 There, they have information about the different bits. Again, I have not used the movement sensor, but that is the approach I would take. Hope this helps and please let us know what happens.
      Like. 回复
      • s
        模拟 2017年8月3日
        您好,谢谢您的快速回复。是的,我目前正在使用Sensortag第二版。我对遵循道路的结论得出了相同的结论。但是经过数小时的“尝试一些东西,不要得到结果”,我认为我的问题是基于语法的。我根据Gatt表创建了Blecharacteristics。注意到要写的是什么样的数据。但这就像当我发送新值时的特征只是不会更新。我尝试了WriteByte,WriteValue(带有一个字节数组,甚至具有偏移集为0的版本)。似乎没有什么用。这是awckward,但就像我需要编写多个字节时,它被完全忽略了。 I just do: 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.
        Like. 回复