×

建立一个网状连接的家庭项目

消耗积分:0 | 格式:zip | 大小:3.23 MB | 2023-06-30

周必镜

分享资料个

描述

计划是什么?

该计划是建立一个网状连接的家庭项目。

舰队由什么组成?

我将从Particle Ultimate Mesh Bundle开始,并根据需要添加尽可能多的节点:

 
poYBAGN-udSAUgd3AADvbs6_O8Y359.png
多么有用的捆绑!
 

粒子网格设备介绍

2020 年 1 月更新:Particle 已在其所有第三代设备中停止使用 Mesh 协议。你可以在这里阅读公告

如果您还不知道 Particle 的第三代开发套件 Particle Mesh 是什么,那么您就错过了。立即在他们的网站上阅读更多内容

David Scheltema在他的帖子中很好地描述了它

另外,让我从Jeffrey Lee 的帖子“复制粘贴”一些话(感谢Julien向我介绍了这个词,不能停止使用它):

什么是无线网状网络?

无线网状网络是彼此无线连接的节点(网状拓扑)的基础设施。这些节点相互捎带以扩展无线电信号(如 Wi-Fi 或蜂窝连接)来路由、中继和代理进出客户端的流量。每个节点都将无线电信号传播得比上一个节点更远一些,从而最大限度地减少死区的可能性。

好处

应该注意的是,并非所有无线网状网络解决方案都提供这些优势,但这是 Thread 和 Particle Mesh 独有的完整列表。

  • 无单点故障——构建一个可自我修复的本地网状网络——如果单个设备离线,网络可以将自身重新配置为最近的连接。这意味着没有数据丢失,没有死区,没有问题。
  • 自扩展——此外,如果您需要从网状系统中获得更多范围,您可以添加另一个节点,并且消息可以通过网状网络跳回网关。
  • 可靠的网络——互连的设备可以同时流畅地传输数据,不会使网络连接复杂化。如果一个节点出现故障,附近的另一个节点可以接起连接并继续数据通信。
  • 低成本、低功耗——使用无线网状网络消除了在设施之间安装光纤/电线的成本和复杂性。随着需要或多或少的覆盖范围,可以添加或删除无线网状节点。Mesh 使用与蓝牙相当的能量,因此您可以设计可以使用 3-5 年然后被丢弃和更换的设备。

感谢 Jeffrey 和 David 的所有解释!

粒子网格设备

使用 Particle,您可以拥有 WIFI(使用 Argon 开发套件)或蜂窝(Boron 开发套件)连接的网状网络:

 
pYYBAGN-udaABMbAAAE315Yc9RY30.jpeg
WIFI 或蜂窝网状网络
 

都可以有不同的作用:

 
poYBAGN-udmAMWiGAABy5rubG1Y637.png
网格角色
 

我的舰队

以下是我将使用的所有设备:

 
poYBAGN-uduAC21OAAGnb2qzDbg709.jpg
我的设备群
 

这就是我计划为我的 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 伏的电压都可能对您的健康构成威胁,因此:小心

 
pYYBAGN-ud2AdlUUAAB1WlIwL4Y943.jpg
暖通空调布线
 

恒温器:连接温度传感器

我使用的传感器是流行的DHT22 DHT22 是一种基本的低成本数字温度和湿度传感器。它使用电容式湿度传感器和热敏电阻来测量周围的空气,并在数据引脚上输出数字信号(不需要模拟输入引脚)。它使用起来相当简单,但需要谨慎的时间来获取数据。该传感器唯一真正的缺点是您每 2 秒只能从中获取一次新数据。

连接如下:

DHT22 引脚 1 是氩气上的 Vcc <==> 3v3

DHT pin2是Argon上的数据<==> D5

DHT pin 3 <==> 保持断开连接

DHT pin 4 <==> 连接到 Argon 上的 GND

不要忘记在数据引脚上添加一个 4.7K - 10K 电阻上拉到 Vcc。

注意:我使用的是相当旧的 PietteTech 库,因为我遇到了最新库的问题

恒温器:放置温度传感器

我把我的放在以前不太聪明的恒温器上:

 
poYBAGN-ud-AM_WeAAAoE8qEZ2U670.jpg
用 DHT22 玩捉迷藏
 

恒温器:固件

我是有限状态机(从现在开始为 FSM)的忠实粉丝,我现在几乎在所有项目中都使用它们。次我不使用一个,我以后后悔!

如果您不熟悉状态机以及我们如何在物联网项目中使用它们,请查看我关于它们的文章。

现在对于固件,请使用Particle WorkBench 打开文件夹 minimumistThermostat。

我使用从 Arduino 移植的库用于 FSM,加热状态如下所示:

 
poYBAGN-ueKAWDMkAAA3WBz0ddQ361.jpg
用于加热的恒温器状态
 

冷却状态与这些相同。

这是全图,请原谅质量:

 
pYYBAGN-ueeAPhERAArW6RPVgOk812.jpg
恒温器的所有状态
 

您可以使用此布尔变量决定温度使用的单位:

bool useFahrenheit = false;

温控器:网状连接

恒温器将在我的家庭网状网络中扮演网关的角色。看到下图中的氩气了吗?正是这个角色。

 
pYYBAGN-ueqAc75QAABt_43VICc80.jpeg
我的家庭网状网络设置
 

这意味着其他设备(Xenons)将通过网状协议连接到 Argon。然后他们将通过氩气连接到粒子云。

所以这里的氩气充当网状网络的网关,同时也是极简恒温器的大脑。

恒温器:移动应用程序

为了从我的手机控制我的恒温器,我将使用Blynk

Blynk 是一个与硬件无关的物联网平台,具有白标移动应用程序、私有云、设备管理、数据分析和机器学习。

听起来足够强大?这是!这也是我最喜欢的将移动应用程序添加到我的个人项目的方式,包括这个。

使用 Blynk,您可以在几分钟内设计拖放式漂亮的 IoT 应用程序。您可以从各种预先设计的小部件中进行选择,以构建用于控制电子设备、监控传感器数据、获取通知等的原生 iOS 和 Android 应用程序。

 
poYBAGN-ue2AXpL6AAIGJ_z8_qY098.jpg
Blynk 小部件很棒
 

从世界任何地方控制您的硬件。

没有比这更好的了!

这是我的移动应用程序:

 
poYBAGN-ufCAebRKAAFOpJK9mYw238.png
Blynk 移动应用程序
 

使用 Blynk 可以轻松共享移动应用程序,只需在设备上安装 Blynk 后从内部扫描此代码:

 
pYYBAGN-ufOAAW3oAAFaNRPi2gI853.png
使用 Blynk 应用程序扫描
 
———————————————————————————————————————————————————————————————————————

第三代网状温度传感器

Minimalist Thermostat 的网状远程温度传感器将基于 Particle Xenon 和 DS18B20。

温度传感器:接线

像 DS18B20 这样的传感器接线再简单不过了。这是数据表,以备不时之需。像这样连接

DS18B20 GND 引脚 1 是 GND <==> Argon 上的 3v3

DS18B20 GND 引脚 2 是氩气上的 DQ <==> D9

DS18B20 GND 引脚 3 是 Vdd <==> 氩气上的 3v3

 
pYYBAGN-ufWAZsKpAAApJFebr78134.jpg
DS18B20 温度传感器
 

温度传感器:固件

请在 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

以下是应用程序恒温器选项卡上的信息:

 
poYBAGN-ufiAbKmqAAF89xVFNKY956.png
红色块显示 Blynk 移动应用程序上的网格温度读数
 

温度传感器:节点外

请记住,一旦您拥有一个像这种远程传感器这样的节点,再拥有更多并且您需要或喜欢的节点是微不足道的。需要更改第二个远程传感器的网格事件名称。这是关键:

Mesh.publish(MESH_EVENT_DS18B20_SENSOR_X, the_temperature_reading);

在我们的例子中,MESH_EVENT_DS18B20_SENSOR_X 是事件节点。您使用 X、Y、Z 等事件名称设置额外节点,并修改网关节点上的订阅处理程序。在 Blynk 移动应用程序上进行一些工作以呈现这些新信息,仅此而已!

———————————————————————————————————————————————————————————————————————

第三代网状池温度传感器

这将是我这里的泳池温度监视器的翻版

尽管如此,百万美元的问题是:水的温度是多少?

这可以通过氙气、电阻器和热敏电阻来解决。

你有很多选择,这里有两个:

 
 
 
 
poYBAGN-ufuAfNAiAAHqiJ2zVAo286.jpg
 
1 / 2简单的热敏电阻
 

简单的热敏电阻就是这个。更坚固的是这个

请注意,由于简单的热敏电阻(10K 精密环氧树脂热敏电阻 - 3950 NTC )并非制造用于直接与水接触,因此传感器的使用寿命约为两个夏天。之后,传感器将停止工作,读数将不再有意义。更强大的将持续你的游泳池的整个生命。

水池温度传感器:接线

连接是这样的:

10k 电阻在 Argon 上介于 3v3 和 A0 之间

热敏电阻在 Argon 上的 A0 和 GND 之间

 
pYYBAGN-uf2AQffGAABBf0nk4Zk330.png
池热敏电阻连接
 

温度传感器:固件

请在 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 移动应用上添加了一个选项卡:

 
poYBAGN-ugCAQP9bAAC2XNzx11g172.png
今天是炎热的一天!
 

水池温度传感器:额外节点

你也有水疗中心来监控吗?遵循与上一节中远程温度传感器的额外节点相同的思路。

———————————————————————————————————————————————————————————————————————

第三代车库开门机

这是对我的Garage Commander的完全重写在这个版本中,我使用FSM来跟踪车库的状态。

下面是对 FSM 状态的描述:

 
pYYBAGN-ugWAWttXAAxayjSD68M005.jpg
车库 FSM
 

车库开启器:接线

您将需要两个像这样的磁簧开关这是我的一张照片:

 
poYBAGN-ug2Ab1Y-ABHDZcHvHRI896.jpg
磁簧开关
 

一旦位于战略位置,这些簧片开关将告诉氙气车库是打开还是关闭。

我把感应关闭位置的那个放在车库门的顶部,你可以在那里看到:

 
pYYBAGN-uhOAUP-cAA8V89DGm_s768.jpg
将关闭的簧片传感器开关放在车库门的顶部
 

我将感应打开位置的那个放在车库开启器的导轨下:

 
poYBAGN-uheAY8uHAAcTMg9ISbU416.jpg
打开的开关可以在导轨下
 

您可以为您和您的车库门选择最方便的位置。

安装后,将关闭传感器簧片开关连接到 D2 和 GND,将打开传感器连接到 Argon 上的 D1 和 GND。

这就是传感器。

现在要让Xenon移动门,您需要找到按钮板连接到主机的位置。它看起来像这样:

 
poYBAGN-uiKADc_bABilG8NAn8c908.jpg
右上角是我们的继电器与更多车库门的连接(在我的车库单元上!)
 

将那个连接到我们将在项目的这一部分中使用的featherWing 功率继电器。

提示:如果您将这些连接器短路,车库门将会移动。当心!

我使用了 FeatherWing 三联器,因为我有一个方便的,但如果你愿意,你可以使用双联

 
poYBAGN-uiqAFq1nABL0-amZ_Vo703.jpg
FeatherWing 格式非常实用!
 

车库开启器:固件

是时候刷固件了!您可以在 meshGarage 文件夹下找到它。请使用Particle WorkBench打开文件夹

车库开启器:网状连接

对于车库开启器,我们有不同的情况。以前的远程传感器向网关发送信息,以便在移动应用程序上显示温度。现在,为了从移动应用程序控制车库,我们需要设置一个类似的发布-订阅网格机制,但反过来。

车库开启器:移动应用程序

 
pYYBAGN-uiyANnYgAAC8LXCuS6c151.png
车库开启器的 Blynk 标签
 

车库开启器:额外的节点

你有双车库还是三车库?按照上面远程温度传感器的相同说明添加一个额外的网格节点!

———————————————————————————————————————————————————————————————————————

第三代漏水传感器

这是我的漏水传感器的翻版。但是,与原始项目不同,使用 Particle Mesh 很容易添加我们需要的任意数量的节点。只需复制传感器,修改一下事件名称,瞧!很快您的地下室、厨柜、浴室和热水器都得到保护,不会漏水。

这是我在这个版本上使用的漏水传感器:

 
poYBAGN-ujOAZWwHABE3TFvx4sY027.jpg
漏水传感器
 

漏水传感器:接线

该威廉希尔官方网站 受到了这里的污水泵监控项目这里的威廉希尔官方网站 的强烈启发

示意图如下所示:

 
poYBAGN-ujqALQxpAA9k81HxjIs867.jpg
漏水传感器示意图
 

晶体管是 MPSA13 晶体管(达林顿对)。

 
 
 
 
poYBAGN-ukKAPFFJABJspel9jIY337.jpg
 
1 / 2滚动到一侧查看特写照片
 

漏水传感器:固件

在 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 移动应用上添加一个标签:

 
pYYBAGN-ukWAKY7gAACtp9wUxAM785.png
Blynk 移动应用程序上的漏水传感器选项卡
 

当传感器检测到水时,它会进入 30 秒的过渡状态,然后进入警报状态(如果情况仍然存在):

 
poYBAGN-ukiACVOpAACimjicfM4370.png
不受欢迎的情况!
 

漏水传感器:节外

你有更多的地方来监测漏水吗?重复此处的步骤,更改事件名称,修改 Blynk 应用程序,就是这样!

———————————————————————————————————————————————————————————————————————

第三代污水​​泵监控器

前段时间我为朋友开发了一个污水泵监控项目,并决定将具有此特性或功能的支持网格的节点添加到我的网格家庭项目中。

污水泵监控器由两个水传感器组成,用于读取水位是否过高。第一级将系统的状态设置为高水位报警状态(基本上,你有麻烦了),然后如果水到达第二个传感器,系统进入非常高水位报警状态(这次你是深陷困境)。

这是一个示意图:

 
pYYBAGN-uk2AKRRBAAlNOH1SZF0130.jpg
现在更清楚了吗?
 

请注意,我们计划使用三个传感器,但最终使用了两个。

这些是使用的传感器

 
pYYBAGN-uleADPcuABx-nAcOVmM839.jpg
我们可以将相同的用于漏水传感器
 

污水泵监控传感器:接线

威廉希尔官方网站 与漏水传感器相同,只是两次:

poYBAGN-ulqALz-tAACXMFFdUUs519.jpg
加倍这个!
 

将高水位传感器连接到 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

污水泵监控传感器:移动应用

移动应用程序的另一个标签!!!

 
poYBAGN-ul2AZgntAACY76HQZ5c933.png
污水泵没问题
 

现在如果水上升,系统进入过渡状态 30 秒:

 
pYYBAGN-ul-AV90eAAC3qYE0mlc564.png
似乎有些不对劲
 

如果水没有下降:

 
pYYBAGN-umGAcwvDAAC2vn_elBw864.png
麻烦:快到那里!
 

如果水继续上涨:

 
pYYBAGN-umSAIQmzAAC8led4xBg343.png
你太迟了!
 
———————————————————————————————————————————————————————————————————————

第三代蜂窝连接温湿度传感器

那么如何处理捆绑包中的硼呢?

好吧,让我们将它用于远程温度传感器!

接线与上面恒温器上的 DHT22 相同。

使用 Particle Workbench 打开 tempSensor 代码。

但在刷机之前,请在固件中调整这些行:

// #define SENSOR_POOL // thermistor  
// #define SENSOR_DS18B20  
#define SENSOR_DHT22

这样,固件将为 DHT22 传感器编译。现在您已准备好在任何您想要的地方闪烁和安装这个蜂窝连接的温度传感器!

我将把它安装在我的车上:

 
poYBAGN-umuANkBTABAdX30cpjs146.jpg
使用 DHT22 的蜂窝连接温度和湿度传感器
 
———————————————————————————————————————————————————————————————————————

结论

通过构建这个雄心勃勃的项目,我发现的一件事是,使用网状节点,您可以毫不费力地进行复制,并为您的网状连接家庭设备的组件增加成本。

故障排除

如果您的项目卡在初始化状态,请检查 Blynk 配置。我发现如果我没有正确配置 Blynk(例如:身份验证令牌无效),整个项目甚至都不会开始运行!

如果您不打算使用 Blynk,请通过更改此行来停用它:

#define USE_BLYNK

所以它最终看起来像这样:

// #define USE_BLYNK

需要帮忙?

如果您的项目需要专业帮助,请随时通过 gusgonnet@gmail.com 给我写信。谢谢!


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'建立一个网状连接的家庭项目',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);