电子说
步骤1:您需要的内容
我用于该项目的材料是:
带以太网屏蔽的Arduino UNO :我的是用于Arduino的Vilros以太网R3,但是以太盾或等效设备应该没问题
一个备用的Linksys路由器 :我用DD-WRT刷新了固件(自此以后,我将不介绍该步骤在线上有许多有关如何执行此操作的教程)用作WiFi中继器桥。在Craigslist上找到一个。它们非常便宜
iPhone :我的是7颗
LED,330欧姆电阻器,面包板,跨接电缆 :用于调试
5V继电器 :我从这里订购了我的产品。从中国到达大约需要两个星期。但是它们足够便宜,因此订购一堆
3D打印盒(可选) :存放电子设备
Xcode的副本 (Apple应用程序开发软件)
第2步:设置调试硬件
首先,让我们设置用于调试目的的硬件。我将Arduino和以太网屏蔽以及面包板临时安装在一个小平台上。如图所示,我插入了LED和电阻。如果您需要有关如何将LED连接到Arduino的更多详细信息,本教程可能会有所帮助。但是这些教程的数量与彩虹的颜色一样多,因此请选择您喜欢的。最后,我将Arduino的以太网端口连接到路由器,然后通过USB电缆将Arduino插入笔记本电脑。就是这样。
步骤3:编写Arduino代码
下一步是确定Arduino将如何执行我想要它做什么。最初,当用户的iPhone首次连接到LAN时,Arduino应该传达门的当前状态。然后,Arduino会从用户的iPhone接收命令来打开/关闭门,并更新Arduino代码中的变量来跟踪门的状态。
我认为最好的方法是传递JSON(Java脚本对象表示法)消息。我喜欢它们,因为它们具有键值结构以及标头信息。事实证明,如果您下载ArduinoJSON库,则Arduino可以支持此功能。他们有许多有关如何与该库进行交互的示例。您需要密切注意几个使用这些类的示例:
EthernetServer
EthernetClient
DynamicsJsonBuffer
或者您可以看一下我的代码以了解如何使用这些类中的函数。
loop()
p》
我也尽可能地在interwebz上寻找示例代码。一个半相关的应用程序是用于Arduino和iPhone的温度传感器应用程序。这是一个非常完整的示例,其中包含很多很好的解释和可下载的代码。
好,所以接下来让我伤脑筋的是我将Arduino用作 server 还是 client 。似乎当用户最初连接时Arduino应该是服务器,因为它正在为iPhone的初始门状态提供服务。另外,当Arduino从iPhone接收命令时,我认为它应该是客户端,因为它被动地接收数据。
事实证明,在两种情况下,使Arduino成为服务器都是可行的。代码的本质分解方式在主要的Arduino
SendAndReceiveJSONData()
调用中,我定义了一个名为
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
的函数,该函数使Arduino成为服务器它会监听所有客户。如果找到一个,它将忽略客户端的JSON头信息(不重要),并尝试解析数据。如果它找到可以解析的数据,则我们知道iPhone已向我们发送了有关门的状态信息,Arduino会相应地更新这些变量。另一方面,如果我们找不到要解析的数据,那么我们知道这是用户第一次连接(因此他不可能向我们发送有关门的任何信息),并且向他发送了一条JSON消息,通知他的门的当前状态是什么。
如果我上面说的话似乎令人困惑,请告诉我,但您也可以在我的仓库中查看代码。
步骤4:在编写iPhone代码之前免责声明
Apple 。..哦,Apple。 [提示重叹] 。我曾经爱过苹果。但是这个小杂物与这个讨论无关。
Swift是用于在iPhone上设计应用程序的最新语言。伙计们,我真的不在乎。潮流似乎在改变,说实话,我什至不知道我在Xcode上安装了哪个版本。此外,在查找示例/教程时,由于语言的更改速度很快,因此并非所有内容都相关。
现在,如果这还不够糟糕,(我保证这会发生的话),我在编译后发现了/构建我的XCode项目,使其不会在我的iPhone上加载。原因是因为我的机器很旧(2010年的MacBook Pro),所以我拥有的最高操作系统是10.11.6(El Capitan)。本质上,这意味着我无法在支持iPhone中最新iOS(11.1或11.2)的计算机上安装最新的Xcode。该错误通过说出诸如“无法找到设备支持文件”之类的东西来体现。
事实证明,如果您遇到相同的问题,则可以通过修复来解决问题。将错误输入Google会导致大量类似的解决方案。这是一个。结果是您需要下载最新版本的Xcode(这很重要,因此它不会自动安装并随后失败),然后导航到:
PerformRestCall()
并复制所有这些您当前的Xcode版本没有相同目录的目录。之后,重新启动Xcode,并尝试编译等,它应该可以正常工作。
步骤5:编写iPhone代码
在控制版本问题的情况下,我不得不拼凑一些资源来编写应用程序,我不想花一个月学习Swift。话虽如此,我确实发现与Chris一起合作的Code是非常好的资源和时间投入。他的教程特别出色,因为它向您展示了如何实现触摸屏功能以及 Main.Storyboard 与实际代码之间的交互。特别是在最近的一些教程中。因此,我真的鼓励您在开始使用Xcoding之前先观看它们。另外,我和其他人一样,寻找相似的Swift实例,并尝试向他们学习。我不是Swift专家,但我找到了我需要的东西。
该应用的背后想法是设计自定义的 Open 和 Close 触摸按钮您拥有的任何绘画应用程序都可以按预期运行。当应用首次启动时,它会使用一个名为
handleResultsOfWebCall()
的函数,该函数随后会调用:
leftOpenImageTapped()
leftClosedImageTapped()
rightOpenImageTapped()
rightClosedImageTapped()
,该函数实际上是繁重的工作并解析来自Arduino的初始JSON数据描述了门的当前状态。
我使用的其他功能是:
CreateJSONMessage()
,它们在被调用时会更新门的当前状态。门,然后调用函数:
实际创建要发送到Arduino的必要JSON。
有关更多详细信息,您可以在此处看到该项目的代码,由于我试图对其进行合理地注释,因此该代码应进行更多说明。老实说,我有点把它砍在一起,以使其能够完成我想要的工作。
在编写代码之后,我将其上传到iPhone并开始调试。
第6步:调试
编写我的代码并将其上传到Arduino和iPhone上,就该进行调试了。由于我还没有将所有东西连接到车库,因此我想以某种方式模仿它的行为。提示LED。
我拿起了两个红色和两个绿色LED的钩子,如上图所示。一组绿色和红色代表左门,其余代表右门。如果任一扇门关闭,则绿灯将不停闪烁。否则,如果任何门打开,则红灯将闪烁。我选择了要关闭的门的初始状态(绿色闪烁的灯),因为当我第一次将Arduino连接到开门器时,我将确保门已关闭。
看看它如何可以,您可以观看正在播放的简短视频(糟糕透顶-对不起!)。瞧!到目前为止可以正常工作!
步骤7:连接
自从维修了3D打印机以来,我还没有机会打印箱子。我以此为基础的先前说明,具有可供下载的.stl文件。(注意:如果您打算使用.stl文件,则单位以厘米为单位,与作者相对应。我不得不缩放我的.stl文件的大小是原来的10倍,因为我的打印机以毫米为单位工作。我必须修改设计,因为我有两个门,因此需要两个继电器。但是由于我渴望将所有东西都连接起来,所以我开始将电子设备安装在我躺在的一块废旧木头上。因此,我不会在这种指导中展示绝对的成品。
一旦将电子设备安装到我拥有的木头上,在其上找到临时住所就很简单了。壁。在图片中,您可以看到从路由器到Arduino,从Arduino到继电器,再到继电器到车库门按钮的电线。当我弹出实际按钮并从墙上拧下外壳时,只有两个接线端子。因此,就像我以前作为基础的指导一样,您可以按任意顺序将继电器的电线钩到门按钮上的端子上。
在此之后,整个设置第一次神奇地起作用了!抱歉,不发布视频。我必须暂时将其取下来,然后才能捕获它的视频,但我发誓确实如此!
步骤8:最终想法
之后玩了一点,我确实注意到了一些问题,我将在下面提到。这些是很重要的,因此在决定重复该项目之前,请先考虑它们。
按下iPhone上的按钮与让车库门响应之间存在一些不一致的延迟。
一个大问题:将应用程序加载到iPhone应用程序后,我注意到几天后我试图打开该应用程序。应用程序,它只会返回主屏幕。这是一致的行为。挣扎了一段时间之后,我终于崩溃了,并在stackoverflow上发布了问题。一个人的答案似乎是正确的:邪恶的帝国使Apple决定,如果您不是开发人员,那么您从Xcode获得的信任证书对您刚开发的应用程序仅有效1周。之后,除非您重新安装它(并重置1周的倒计时),否则您将无法在iPhone上使用它,或者需要为更长的证书支付99美元的费用。我发现这完全令人沮丧。就像我浪费时间一样。但是,如果您是开发人员,那么这对您来说就不是问题了。。
我想到的一个想法是,如果有人手动按下车库门按钮,则不会捕获此事件在Arduino代码中因此,就Arduino而言,在按下按钮之前,门的状态保持不变。此外,如果有人站在门底下,而另一个人正在使用该应用程序将其关闭。门传感器将迫使门再次返回,并且此事件也未在Arduino代码中捕获。不用说,这是要弄清楚的另一点。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !