该计划是建立一个网状连接的家庭项目。
我将从Particle Ultimate Mesh Bundle开始,并根据需要添加尽可能多的节点:
2020 年 1 月更新:Particle 已在其所有第三代设备中停止使用 Mesh 协议。你可以在这里阅读公告。
如果您还不知道 Particle 的第三代开发套件 Particle Mesh 是什么,那么您就错过了。立即在他们的网站上阅读更多内容!
David Scheltema在他的帖子中很好地描述了它。
另外,让我从Jeffrey Lee 的帖子中“复制粘贴”一些话(感谢Julien向我介绍了这个词,不能停止使用它):
无线网状网络是彼此无线连接的节点(网状拓扑)的基础设施。这些节点相互捎带以扩展无线电信号(如 Wi-Fi 或蜂窝连接)来路由、中继和代理进出客户端的流量。每个节点都将无线电信号传播得比上一个节点更远一些,从而最大限度地减少死区的可能性。
应该注意的是,并非所有无线网状网络解决方案都提供这些优势,但这是 Thread 和 Particle Mesh 独有的完整列表。
感谢 Jeffrey 和 David 的所有解释!
使用 Particle,您可以拥有 WIFI(使用 Argon 开发套件)或蜂窝(Boron 开发套件)连接的网状网络:
以下是我将使用的所有设备:
这就是我计划为我的 Mesh Home 项目构建的内容:
您需要首先将您的所有设备都归入您的 Particle 帐户。如果您还没有这样做,请继续这样做。整个过程将花费您几个小时,并在此处进行了描述。
作为记录,我将我的所有设备都更新到了 Device OS 1.3.0-rc.1。
———————————————————————————————————————————————————————————————————————
这是我的极简恒温器的新版本。很难相信我最初的项目在过去三年半的时间里一直在家里不间断地工作,24/7/365,很少中断(也许我不得不重新设置两次?)。
最初的项目是基于一个 Particle Photon(一个 WIFI 开发套件)和一个便宜的四继电器板。这次我将使用Argon (支持网状网络的 WIFI 开发套件)和NCD 4 继电器板。我将使用DHT22来感应温度和湿度。
恒温器:继电器接线
与原始项目相同,将继电器 1(下图中的 R1)、继电器 2 和继电器 3 连接到 HVAC 电线。
我的 HVAC 使用 24 伏电压,可以处理。
请检查您是否使用更高的电压。
如果是这种情况,您在接线时需要格外小心
任何超过 40 伏的电压都可能对您的健康构成威胁,因此:小心
恒温器:连接温度传感器
我使用的传感器是流行的DHT22 。DHT22 是一种基本的低成本数字温度和湿度传感器。它使用电容式湿度传感器和热敏电阻来测量周围的空气,并在数据引脚上输出数字信号(不需要模拟输入引脚)。它使用起来相当简单,但需要谨慎的时间来获取数据。该传感器唯一真正的缺点是您每 2 秒只能从中获取一次新数据。
连接如下:
DHT22 引脚 1 是氩气上的 Vcc <==> 3v3
DHT pin2是Argon上的数据<==> D5
DHT pin 3 <==> 保持断开连接
DHT pin 4 <==> 连接到 Argon 上的 GND
不要忘记在数据引脚上添加一个 4.7K - 10K 电阻上拉到 Vcc。
注意:我使用的是相当旧的 PietteTech 库,因为我遇到了最新库的问题。
恒温器:放置温度传感器
我把我的放在以前不太聪明的恒温器上:
恒温器:固件
我是有限状态机(从现在开始为 FSM)的忠实粉丝,我现在几乎在所有项目中都使用它们。次我不使用一个,我以后后悔!
如果您不熟悉状态机以及我们如何在物联网项目中使用它们,请查看我关于它们的文章。
现在对于固件,请使用Particle WorkBench 打开文件夹 minimumistThermostat。
我使用从 Arduino 移植的库用于 FSM,加热状态如下所示:
冷却状态与这些相同。
这是全图,请原谅质量:
您可以使用此布尔变量决定温度使用的单位:
bool useFahrenheit = false;
温控器:网状连接
恒温器将在我的家庭网状网络中扮演网关的角色。看到下图中的氩气了吗?正是这个角色。
这意味着其他设备(Xenons)将通过网状协议连接到 Argon。然后他们将通过氩气连接到粒子云。
所以这里的氩气充当网状网络的网关,同时也是极简恒温器的大脑。
恒温器:移动应用程序
为了从我的手机控制我的恒温器,我将使用Blynk 。
Blynk 是一个与硬件无关的物联网平台,具有白标移动应用程序、私有云、设备管理、数据分析和机器学习。
听起来足够强大?这是!这也是我最喜欢的将移动应用程序添加到我的个人项目的方式,包括这个。
使用 Blynk,您可以在几分钟内设计拖放式漂亮的 IoT 应用程序。您可以从各种预先设计的小部件中进行选择,以构建用于控制电子设备、监控传感器数据、获取通知等的原生 iOS 和 Android 应用程序。
从世界任何地方控制您的硬件。
没有比这更好的了!
这是我的移动应用程序:
使用 Blynk 可以轻松共享移动应用程序,只需在设备上安装 Blynk 后从内部扫描此代码:
———————————————————————————————————————————————————————————————————————
Minimalist Thermostat 的网状远程温度传感器将基于 Particle Xenon 和 DS18B20。
温度传感器:接线
像 DS18B20 这样的传感器接线再简单不过了。这是数据表,以备不时之需。像这样连接
DS18B20 GND 引脚 1 是 GND <==> Argon 上的 3v3
DS18B20 GND 引脚 2 是氩气上的 DQ <==> D9
DS18B20 GND 引脚 3 是 Vdd <==> 氩气上的 3v3
温度传感器:固件
请在 github 存储库的 tempSensor 文件夹下找到固件。我为这个网状家庭项目的两个组件使用相同的固件:这个远程传感器和水池传感器。请使用Particle WorkBench打开文件夹。
因此,在构建固件之前,您需要使这些行看起来像这样:
// #define SENSOR_POOL // thermistor
#define SENSOR_DS18B20
您还可以使用此布尔变量(默认为摄氏度)决定使用什么单位来表示温度:
bool useFahrenheit = false;
保存更改、构建和闪烁后,您就可以开始使用它了。
温度传感器:网状连接
现在 Xenon 正在读取温度,我们如何处理它?
我们将它发送到恒温器,它也充当网关。
请注意:信息可以通过网关一路到达粒子云,无需我们做任何事情。在这种情况下,我们想要对它进行操作,或者在移动应用程序上显示它,因此我们通过网格协议将它发送到这个网格节点 Argon。
Xenon 上的代码是使用 Mesh.publish 的简单行:
Mesh.publish(MESH_EVENT_DS18B20, the_temperature_reading);
现在在接收端,我们需要使用 Mesh.subscribe。我们在 setup() 函数上设置订阅(每次设备启动时都会运行):
void setup()
{
Mesh.subscribe(MESH_EVENT_DS18B20, meshTempSensorHandler);
}
我们只是设置了一个处理函数,称为 meshTempSensorHandler(),所以该函数的代码如下所示:
double meshTempSensorCurrentTemp = -999;
String meshTempSensorLastHeardOf = "Never";
// enable the remote temperature sensor if on an argon
#if PLATFORM_ID == PLATFORM_ARGON
void meshTempSensorHandler(const char *event, const char *data)
{
char tempChar[BUFFER] = "";
snprintf(tempChar, BUFFER, "event=%s data=%s", event, data ? data : "NULL");
Log.info(tempChar);
snprintf(tempChar, BUFFER, "%s", data ? data : "-999");
meshTempSensorCurrentTemp = atof(tempChar);
meshTempSensorLastHeardOf = Time.timeStr();
#ifdef USE_BLYNK
Blynk.virtualWrite(BLYNK_DISPLAY_CURRENT_TEMP_REMOTE, meshTempSensorCurrentTemp);
Blynk.virtualWrite(BLYNK_DISPLAY_CURRENT_TEMP_REMOTE_LAST_HEARD_OF, meshTempSensorLastHeardOf);
#endif
}
#endif
而已!
从网格上讲,远程网格传感器的温度读数在另一个节点上可用(在这种情况下是网关节点,但任何节点都可以订阅该信息或主题)。
现在变量meshTempSensorCurrentTemp 包含温度,我添加了meshTempSensorLastHeardOf,这是我们每次从该节点接收信息的时间戳。这可以帮助我们判断节点是否处于活动状态,或者即使读数是最近的。
温度传感器:移动应用程序
为了在移动应用程序上显示传感器的信息,我在 Blynk 库中添加了几个对 virtualWrite() 函数的调用。这是向应用程序发送信息的 Blynk 方式。
以下是执行此操作的行:
#ifdef USE_BLYNK
Blynk.virtualWrite(BLYNK_DISPLAY_CURRENT_TEMP_REMOTE, meshTempSensorCurrentTemp);
Blynk.virtualWrite(BLYNK_DISPLAY_CURRENT_TEMP_REMOTE_LAST_HEARD_OF, meshTempSensorLastHeardOf);
#endif
以下是应用程序恒温器选项卡上的信息:
温度传感器:节点外
请记住,一旦您拥有一个像这种远程传感器这样的节点,再拥有更多并且您需要或喜欢的节点是微不足道的。需要更改第二个远程传感器的网格事件名称。这是关键:
Mesh.publish(MESH_EVENT_DS18B20_SENSOR_X, the_temperature_reading);
在我们的例子中,MESH_EVENT_DS18B20_SENSOR_X 是事件节点。您使用 X、Y、Z 等事件名称设置额外节点,并修改网关节点上的订阅处理程序。在 Blynk 移动应用程序上进行一些工作以呈现这些新信息,仅此而已!
———————————————————————————————————————————————————————————————————————
这将是我这里的泳池温度监视器的翻版。
尽管如此,百万美元的问题是:水的温度是多少?
这可以通过氙气、电阻器和热敏电阻来解决。
你有很多选择,这里有两个:
请注意,由于简单的热敏电阻(10K 精密环氧树脂热敏电阻 - 3950 NTC )并非制造用于直接与水接触,因此传感器的使用寿命约为两个夏天。之后,传感器将停止工作,读数将不再有意义。更强大的将持续你的游泳池的整个生命。
水池温度传感器:接线
连接是这样的:
10k 电阻在 Argon 上介于 3v3 和 A0 之间
热敏电阻在 Argon 上的 A0 和 GND 之间
池温度传感器:固件
请在 github 存储库的 tempSensor 文件夹下找到固件。我为这个网状家庭项目的两个组件使用相同的固件:远程传感器和水池传感器。您可以使用Particle WorkBench打开该文件夹。
因此,在构建固件之前,您需要使这些行看起来像这样:
#define SENSOR_POOL // thermistor
// #define SENSOR_DS18B20
您还可以使用此布尔变量(默认为摄氏度)决定使用什么单位来表示温度:
bool useFahrenheit = false;
保存您的更改、构建和闪存,您就可以开始了。
水池温度传感器:网状连接
与之前的传感器相同,Xenon 上的代码使用 Mesh.publish:
Mesh.publish(MESH_EVENT_POOL, the_temperature_of_the_pool);
现在在接收端,我们需要使用 Mesh.subscribe。我们在 setup() 函数上设置订阅(每次设备启动时都会运行):
void setup()
{
Mesh.subscribe(MESH_EVENT_POOL, meshTempSensorPoolHandler);
}
在接收端,看起来与之前的传感器几乎相同,只是处理程序称为meshTempSensorPoolHandler() 。
水池温度传感器:移动应用
我在 Blynk 移动应用上添加了一个选项卡:
水池温度传感器:额外节点
你也有水疗中心来监控吗?遵循与上一节中远程温度传感器的额外节点相同的思路。
———————————————————————————————————————————————————————————————————————
这是对我的Garage Commander的完全重写。在这个版本中,我使用FSM来跟踪车库的状态。
下面是对 FSM 状态的描述:
车库开启器:接线
您将需要两个像这样的磁簧开关。这是我的一张照片:
一旦位于战略位置,这些簧片开关将告诉氙气车库是打开还是关闭。
我把感应关闭位置的那个放在车库门的顶部,你可以在那里看到:
我将感应打开位置的那个放在车库开启器的导轨下:
您可以为您和您的车库门选择最方便的位置。
安装后,将关闭传感器簧片开关连接到 D2 和 GND,将打开传感器连接到 Argon 上的 D1 和 GND。
这就是传感器。
现在要让Xenon移动门,您需要找到按钮板连接到主机的位置。它看起来像这样:
将那个连接到我们将在项目的这一部分中使用的featherWing 功率继电器。
提示:如果您将这些连接器短路,车库门将会移动。当心!
我使用了 FeatherWing 三联器,因为我有一个方便的,但如果你愿意,你可以使用双联器:
车库开启器:固件
是时候刷固件了!您可以在 meshGarage 文件夹下找到它。请使用Particle WorkBench打开文件夹。
车库开启器:网状连接
对于车库开启器,我们有不同的情况。以前的远程传感器向网关发送信息,以便在移动应用程序上显示温度。现在,为了从移动应用程序控制车库,我们需要设置一个类似的发布-订阅网格机制,但反过来。
车库开启器:移动应用程序
车库开启器:额外的节点
你有双车库还是三车库?按照上面远程温度传感器的相同说明添加一个额外的网格节点!
———————————————————————————————————————————————————————————————————————
这是我的漏水传感器的翻版。但是,与原始项目不同,使用 Particle Mesh 很容易添加我们需要的任意数量的节点。只需复制传感器,修改一下事件名称,瞧!很快您的地下室、厨柜、浴室和热水器都得到保护,不会漏水。
这是我在这个版本上使用的漏水传感器:
漏水传感器:接线
该电路受到了这里的污水泵监控项目和这里的电路的强烈启发。
示意图如下所示:
晶体管是 MPSA13 晶体管(达林顿对)。
漏水传感器:固件
在 meshWaterLeakSensor 文件夹下找到该项目节点的固件。
漏水传感器:网状连接
与其他节点的处理相同。网格节点上的事件是:
Mesh.publish(MESH_EVENT_WATER_LEAK_SENSOR, waterLeakState);
然后,事件处理程序在网关节点(恒温器)上接收该信息:
Mesh.subscribe(MESH_EVENT_WATER_LEAK_SENSOR, meshWaterLeakSensorHandler);
并由处理函数本身照顾:
String meshWaterLeakSensorState = "Unknown";
String meshWaterLeakSensorLastHeardOf = "Never";
// enable the remote temperature sensor for the pool if on an argon
#if PLATFORM_ID == PLATFORM_ARGON
void meshWaterLeakSensorHandler(const char *event, const char *data){
char tempChar[BUFFER] = "";
snprintf(tempChar, BUFFER, "event=%s data=%s", event, data ? data : "NULL");
Log.info(tempChar);
snprintf(tempChar, BUFFER, "%s", data ? data : "Unknown");
meshWaterLeakSensorState = tempChar;
meshWaterLeakSensorLastHeardOf = Time.timeStr();
#ifdef USE_BLYNK
Blynk.virtualWrite(BLYNK_DISPLAY_WATER_LEAK_SENSOR, meshWaterLeakSensorState);
Blynk.virtualWrite(BLYNK_DISPLAY_WATER_LEAK_SENSOR_LAST_HEARD_OF, meshWaterLeakSensorLastHeardOf);
#endif
}
#endif
漏水传感器:移动应用
我只需要在精彩的 Blynk 移动应用上添加一个标签:
当传感器检测到水时,它会进入 30 秒的过渡状态,然后进入警报状态(如果情况仍然存在):
漏水传感器:节外
你有更多的地方来监测漏水吗?重复此处的步骤,更改事件名称,修改 Blynk 应用程序,就是这样!
———————————————————————————————————————————————————————————————————————
前段时间我为朋友开发了一个污水泵监控项目,并决定将具有此特性或功能的支持网格的节点添加到我的网格家庭项目中。
污水泵监控器由两个水传感器组成,用于读取水位是否过高。第一级将系统的状态设置为高水位报警状态(基本上,你有麻烦了),然后如果水到达第二个传感器,系统进入非常高水位报警状态(这次你是深陷困境)。
这是一个示意图:
请注意,我们计划使用三个传感器,但最终使用了两个。
这些是使用的传感器:
污水泵监控传感器:接线
电路与漏水传感器相同,只是两次:
将高水位传感器连接到 D1,将超高水位传感器连接到氙气灯上的 D2。
晶体管是 MPSA13 晶体管(达林顿对)。
污水泵监控传感器:固件
使用 Particle Workbench 打开 meshSumpPump 文件夹,快闪,尽情享受吧!
污水泵监控传感器:网状连接
污水泵节点发布的事件是这样的:
#define MESH_EVENT_SUMP_PUMP "meshSumpPump"
网关上的代码:
/************************************************************
sump pump sensors
*************************************************************/
String meshSumpPumpState = "Unknown";
String meshSumpPumpLastHeardOf = "Never";
// enable the remote temperature sensor for the pool if on an argon
#if PLATFORM_ID == PLATFORM_ARGON
void meshSumpPumpHandler(const char *event, const char *data){
char tempChar[BUFFER] = "";
snprintf(tempChar, BUFFER, "event=%s data=%s", event, data ? data : "NULL");
Log.info(tempChar);
snprintf(tempChar, BUFFER, "%s", data ? data : "Unknown");
meshSumpPumpState = tempChar;
meshSumpPumpLastHeardOf = Time.timeStr();
#ifdef USE_BLYNK
Blynk.virtualWrite(BLYNK_DISPLAY_SUMP_PUMP, meshSumpPumpState);
Blynk.virtualWrite(BLYNK_DISPLAY_SUMP_PUMP_LAST_HEARD_OF, meshSumpPumpLastHeardOf);
#endif
}
#endif
污水泵监控传感器:移动应用
移动应用程序的另一个标签!!!
现在如果水上升,系统进入过渡状态 30 秒:
如果水没有下降:
如果水继续上涨:
———————————————————————————————————————————————————————————————————————
那么如何处理捆绑包中的硼呢?
好吧,让我们将它用于远程温度传感器!
接线与上面恒温器上的 DHT22 相同。
使用 Particle Workbench 打开 tempSensor 代码。
但在刷机之前,请在固件中调整这些行:
// #define SENSOR_POOL // thermistor
// #define SENSOR_DS18B20
#define SENSOR_DHT22
这样,固件将为 DHT22 传感器编译。现在您已准备好在任何您想要的地方闪烁和安装这个蜂窝连接的温度传感器!
我将把它安装在我的车上:
———————————————————————————————————————————————————————————————————————
通过构建这个雄心勃勃的项目,我发现的一件事是,使用网状节点,您可以毫不费力地进行复制,并为您的网状连接家庭设备的组件增加成本。
如果您的项目卡在初始化状态,请检查 Blynk 配置。我发现如果我没有正确配置 Blynk(例如:身份验证令牌无效),整个项目甚至都不会开始运行!
如果您不打算使用 Blynk,请通过更改此行来停用它:
#define USE_BLYNK
所以它最终看起来像这样:
// #define USE_BLYNK
如果您的项目需要专业帮助,请随时通过 gusgonnet@gmail.com 给我写信。谢谢!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !