雷竞技注册
项目

构建Arduino多节点BLE湿度和温度传感器监视器

2017年4月28日通过Raymond Genovese.

使用柏树太阳能发电机,Arduino UNO和HM10 BLE模块,使您自己的多节点温度和湿度监视器和显示。

使用柏树太阳能发电机,Arduino UNO和HM10 BLE模块,使您自己的多节点温度和湿度监视器和显示。

之前,我们介绍了概述Cypress半导体公司的新型太阳能BLE信标.建议您先阅读这篇文章,为BLE信标提供一些背景知识,特别是柏树太阳能信标。

在这个项目中,我们将通过搭建一个基于arduino的设备来测试驱动信标,通过两个太阳能信标来显示温度和湿度。

柏树太阳能灯塔。

项目需求

  • 两个柏树太阳能BLE温度和湿度传感器
  • Arduino Uno.
  • I2C LCD显示屏(2×16)
  • HM-10或HM-11 BLE模块
  • 耐候传感器支架(可选,见文字)
  • 带架的硬币电池电池(可选,见文字)

Beacon广告

为了监测温湿度,我们需要1)接收信标广告传输,2)识别广告来自哪个太阳能信标,3)读取广告中嵌入的温度和湿度值。

下图包含了太阳信标广告的内容和一些默认值的信息。其中一些领域可以被编程,而其他领域则会发生变化,如温度和湿度。

太阳能信标广告领域。图的一部分由柏树半导体

项目中仅使用以下字段:

  • UUID。我们将使用普遍唯一标识符(UUID)的默认值来识别任何太阳能信标。不应更改默认值以在项目中使用。

  • 主要的 -双字节主ID字段将用于识别哪个太阳能信标发起了广告。该场应编制程序与正在使用的传感器相对应。在这方面,所包含的代码使用了0001和0002的传感器值。我的传感器被编程了,并标记了连续的主要ID值。

  • 湿度 -表示传感器湿度(RH)测量的单字节值。计算公式是:RH [%] = 125×(湿度×256)/ 65536 - 6.如SI7020所示数据表(参见第5.1.1节),当条件接近100%或0%湿度时,由于精度的传感器变化,可以分别接收高于100%或低于0%的湿度值。数据表表明,当发生这种情况时,主机软件适合将湿度范围限制为0-100%。但是,在附带的软件中,不使用人工限制,但这可以很容易地添加到代码中。

  • 温度-表示传感器温度测量(在Celsius)的一个字节值。计算公式是:TEMP [C] = 175.72×(温度×256)/ 65536 - 46.85。

Arduino-Side BLE模块

为了阅读太阳能灯塔广告,我们需要在Arduino侧的一个BLE模块。在这方面,信标基本上是作为外围设备和arduino上的BLE模块作为中央装置,尽管它实际上并不连接到信标。中央/外设以及BLE设备的主/奴隶角色有点复杂,并且您可以更多地阅读这些关系这里(PDF)。

该项目的一个关键特点是BLE模块必须能够作为一个中心设备;Arduino的许多屏蔽层只能作为外围设备。值得注意的是,受限制的功能通常是固件的结果,而不是在屏蔽上使用的BLE芯片。对于Arduino这边的BLE模块,我选择使用HM-10屏蔽来自Linksprite,可作为中心设备使用。

Linksprite HM-10 BLE Shield。

屏蔽上的HM-10模块是由济南华茂科技公司制造的,基于TICC2540/1BLE SOC。

该模块以一组“在”命令中编程,允许通过串行端口相对容易地允许相对容易的功能。我使用的模块的固件版本是V546,这是在本写作时最近的。您使用此版本非常重要,因为早期版本可能没有相同的命令和功能。您可以通过发送命令“在+ VERR?”来查看哪个版本。

模块可以很容易地升级。升级说明和固件V546文件可供下载华茂网站

然而,正如下载的说明所指出的,如果没有仔细遵循这个过程,您可能会将设备砖化。我升级了我的设备,没有问题,但建议在尝试操作之前完全熟悉操作说明。

Linksprite Shield有几个niceties(见原理图),例如复位开关、I/O逻辑电平开关和UART的跳线可选线。对于这里包含的Arduino UNO和项目程序,我使用了逻辑电平开关设置为5v, TX的串口线设置为“2”,RX的串口线设置为“3”(与软件串口一起使用)。屏蔽可以从多个来源获得(例如:这里),我能够让我的少于10美元。

我还测试了一个功能相似的HM-11模块从已见开发,我还升级到V546固件。据我所知,在这个项目中,HM-11板与HM-10屏蔽相同。

液晶显示器

为了可视化温度和湿度值,我使用了一个旧的2 × 16, I2C液晶显示器。这些设备在Arduino世界中无处不在,而且有很多不同的口味。我使用的是典型的1602控制LCD,带有I2C子板。通常使用板到Arduino的连接(+5v->+5v, GND->GND, SDA->A4, SCL->A5)。

I2C LCD显示屏(2×16)。

使用alduino图书馆促进使用LCD,我选择使用新液体库由F. Malparida(在Creative Commons Attribution-ShareAlike 3.0下未移植执照).图书馆很好记录并允许在指定控制行时的灵活性,正如你可以从包含的程序的这个片段中看到的:

// ADDR,EN,RW,RS,D4,D5,D6,D7,BL,BLPOLLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

你可以看看这个AAC项目但我只需要这个灵活性,因为我使用的单位相当旧。更新的模型更加标准化,您可能不需要为您的显示指定这个级别的细节。

实际上,在初始化LCD之后,我在附带的程序中使用的唯一命令是“lcd.home();// col 0行0“,”lcd.setcursoror(col,line)“和”lcd.print(string)“,因此您可能是您用于使用的任何库的I2C的LCD可能会在项目中工作。

信标扫描

在HM-10已成功执行几个初始化命令之后,我们可以通过发出“AT + DISI”来扫描信标广告命令。该命令将返回我们必须检查的ASCII字符串,以确定它是否已接收到任何BLE设备广告。HM-10以66个ASCII字节的固定格式返回广告的结果,如下所示。

由冒号[:]分隔的5个字段[P0-P4]。

  • P0:[8字节]工厂ID
  • P1:[32字节] Beacon UUID
  • P2:[10字节]重要值[4]、次要值[4]、实测功率[2]
  • P3: MAC [12]
  • P4: RSSI [4]

例如,在AT + DISI之后返回以下字符串(没有CR / LFS)?命令:

好+ DISISOK +盘:4 c000215:0005000100001000800000805f9b0131:00014667c3:00a0500b1710: -078 OK +盘:00000000:00000000000000000000000000000000:0000000000:+ DISCE F36D62470C9E: -062 OK

响应字符串以“确定+禁止”开头,并以“确定+ disce”结尾。在这些元素之间将是接收到的广告,并且每个广告都将在“OK +光盘”之前。

在这种情况下,接收来自两个设备的广告。其中一个广告来自太阳能信标:':4C000215:0005000100001000800000805F9B0131:00014667C3:00014667C3:00A0500B1710:-078'

解析该广告将产生以下字段。

  • 4C000215 - [P0]公司编号
  • 0005000100001000800000805f9b0131 - [p1] uuid
  • 00014667C3 - [P2]字符串包含:
    • 0001 -主要ID
    • 4667 -次要ID包含
      • 46 -湿度(十六进制)
      • 67 - 温度(十六进制)
    • C3 - RSSI(来自设备)
  • 00a0500b1710 - [p3] MAC地址
  • -078 - [P4] RSSI(DBM)

如果设备不是信标,则P0、P1和P2字段只包含0。

包括软件

有了对挑战的详细理解,就可以解释所包含的软件是如何解决这个挑战的。本文末尾的下载部分包含三个程序。

SolarBeaconScannerA.ino.扫描太阳信标(传感器1和传感器2,根据主要领域);如果发现一个信标,这个程序通过串行监视器显示接收到的温度和湿度值。在开始执行时,它还向HM-10防护盾发出At命令和响应。如果初始化HM-10失败,错误被发送到串行监视器。

Solarbeaconscannerb.ino..与SolarBeaconscannera.ino相同运行,但也为每个传感器发送温度和湿度值到LCD。

Solarbeaconscannerc.ino..对于太阳能信标(传感器1和传感器2,根据主要场)扫描,如前一节目,但仅将传感器值显示为LCD。此外,如果来自任何传感器的数据尚未更新可选择的时间长度,则该程序采用计数器来显示。

计数器轨道扫描(每次需要四秒钟,加上开销)以及当扫描的数量超过设定量时,与传感器相关联的LCD上的“S”将改变为小写“S”。一旦收到传感器更新,显示器就会重置为传感器的“S”。

提供多个方案以帮助理解并促进项目的发展或延期。

来自SolarBeaconscannera.ino的屏幕捕获(点击扩大)。

***注意在执行开始时的初始化命令和响应。一个”。”is displayed for a scan that did not contain a solar beacon. If the scan did contain an advertisement from one or both sensors, the Sensor ID along with the humidity and temperature values are displayed.

为了进一步援助对代码的理解,对SolarBeaconscannerc.ino中使用的每个功能的简要说明如下:

设置()- 初始化LCD。初始化软件串行端口并刷新缓冲区。

print_lcd()- 将显示模板发送到LCD。

sendcmd()- 将AT初始化代码发送到HM-10并查找正确的响应。

ReadScan(无符号长时间)。通过软件串行端口读取HM-10的输出到全局字符串变量“响应”。你可能会认为通常的代码

while (sSerial.available() != 0) {chr = sSerial.read();response.concat(杆);}

会起作用,但我发现的是HM-10似乎在爆发中发送字符串。因此,如果您只需阅读软件串行端口,直到没有可用的字符然后退出,您会发现其他角色正在路上,但尚未到达,您陷入困境。

我选择实施的策略是继续读取串行端口以获得可编程的时间(变量“持续时间”)。HM-10的文档表明扫描窗口长3秒;我使用四秒钟的“持续时间”,并且在我的体验中,这很好。

理想情况下,您总是希望进行扫描,而您为此方案所付出的代价,包括您不进行扫描的时间,是您错过信标广告的可能性。当广告间隔只有几秒钟长的时候,这不是问题。当广告间隔超过5分钟,就像最低功率的“计时器”模式,这可能是一个因素。有关这个问题的更多信息,请参阅程序中的“isstale”全局变量,以及下面的内容。

SearchScan().这是努力的。此函数在响应字符串中查找信标广告,如果发现,则识别传感器并确定温度和湿度值。

然后,它在响应扫描的其余部分中搜索信标识的另一个实例,并且如果发现,则识别传感器并确定温度和湿度值。

在此函数中发生了很多分析和转换ASCII,并且它大量使用Arduino String(不是String)对象。

该功能将根据所发现的内容返回值(0 - 无广告; 1 - 传感器1发现和更新的值; 2 - 传感器2发现的广告和更新的值; 3 - 发现的传感器1和2的广告.

循环().在调用SendCMD()初始化HM-10后,它循环通过三个部分:”to request a scan, 2) calls ReadScan() to get the response string, then 3) calls SearchScan to process the response string.

如果传感器已更新,它会显示LCD上的新数据。

它还根据更新的读数计算扫描并将值与编程值进行比较(在全局变量“Isstale”中)。如果没有传感器更新的扫描数超过编程限制,则修改该传感器的LCD显示器。也就是说,显示器上的“S”改变为“S”,表示陈旧的数据。当数据更新为传感器时,显示器会更换回“S”。

重要的是要有一些方法可以检测程序何时停止接收广告。如果信标已停止传输,或者如果存在某种干扰,则会发生这种情况。如果您使用的是扫描间隔超过五分钟的定时器模式,则该度量也很有用。

使用ISSTALE的值等于16分钟,因为默认为16分钟,对应于长期间隔缺少三个连续的广告,这是5.17分钟 - 在非常罕见的情况下,请参阅出现“陈旧”数据的发生。但是,随后,显示器会刷新,但报告发生是值得的。当在演示模式下使用信标时,具有足够的光线,这从未发生过,因为广告间隔要短得多。

LCD屏幕输出来自SolarBeaconscannerc.ino。温度(t)是华氏度。

制作灯架耐候户外使用

此时,项目演示基本完成;它将从两个传感器读取和显示数据,您可以在不同内部位置位置。我想通过看我可以在容器中装备一个传感器,以使其在户外使用它的容器中的一个传感器来延伸申请。

允许在室外使用太阳能信标,我需要使其耐候性。请注意,它并不意味着防风雨或防水。由于几个原因,要求最具挑战性。

首先,当涉及到为电子设备构建任何类型的封装时,我明显缺乏。我只是缺乏这些技能,而且对那些拥有这些技能的人感到敬畏。

随着这种自我贬值的资格,第二个挑战是保持太阳能电池能力。也就是说,传感器容器必须允许访问光。此外,希望将温度传感器保持在阳光直射下。

最后也是最困难的挑战是,传感器容器必须允许足够的气流来感知湿度,同时不允许暴露在雨或雪形式的水中。为了得到一个合理准确的湿度测量,我们需要在传感器周围有一定量的气流。因此,传感器容器不能密封。

考虑到这些要求,我决定将外壳从廉价的商业太阳能LED草坪灯重新灌注。我在AJ Moore Craft商店挑选了销售(2美元);它看起来非常类似于我在线看到的设备,例如这个这里

我基本上删除了内部内容(添加到我的垃圾组件盒),也删除了金属包装。我把传感器安装在一块电路板上,下面有一个硬币电池(CR2025)(参见第1部分,使传感器混合)。将传感器安装到使用的电路板上越来越多的腻子这使得易于定位,使得温度和湿度传感器位于窗口的边缘,使其远离阳光直射。然后我在窗户上安装了一块骨髓板,并将其粘在两次两次,一次用接触水泥然后用硅胶密封剂。正如您可以从下面的图片中看到的那样,它不漂亮。

未经修改的容器(a),内部用安装的太阳能信标代替原始部件(b),以及改进的和密封容器(c)。

预先预示,您的结果可能不同,但在这种写作时,安装在门廊栏杆上,它表现良好约两个月,包括多日雪/雨水/雨/风暴。值得注意的是,在延长的高湿度水平期间,例如3-4连续下雨天,传感器内的聚合物传感器膜可以变得湿化并产生不准确的高湿度值。这是传感器的已知特性(参见Si7020的4.3和4.6节数据表).建议使用烘烤程序,但也要注意,在不太极端的湿度条件下,随着时间的推移,会返回准确的值。我已经注意到这种湿润的情况发生了,虽然我没有特别使用烘焙程序,但我只是把传感器放在室内,靠近强光放置几个小时,似乎就起作用了。我还看到,在一天的干燥条件下,湿度值似乎恢复了。

夜间雪也不是雨水,夜晚也不会沮丧,无法防止我的灯塔广告(向USPS道歉)

结束思想

我对这些太阳能信标的印象仍然很好。这个项目证明了BLE通信的“另一边”是可以实现的,不需要太多的困难和花费,也不需要仅仅使用无处不在的智能手机“app”。这开启了许多有趣的可能性,我渴望在这一领域进一步努力。然而,最低功率模式会导致很长的广告间隔,这可能会带来一些挑战。尽管如此,太阳能信标本身的技术仍然令人印象深刻——尤其是如果你想监控照明良好的区域。

为自己提供这个项目!的物料清单

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

solar_beacon_code_files_v1_0.zip.

2的评论
  • Manoj Tegginmani. 2018年10月27日

    你好先生,
    您能否请帮助我知道如何通过使用Arduino Uno通过HM-10 BLE宣传传感器数据。

    像。 回复
  • O
    ockwig 2020年1月4日,

    传感器到arduino的最大距离是多少?

    像。 回复