100块搞定APICloud+Arduino单片机实现控制车库自动门的控制器-Arduino中文社区 - Powered by Discuz! Archiver

hbin 发表于 2015-8-21 21:12

100块搞定APICloud+Arduino单片机实现控制车库自动门的控制器

说到车库,我家的车库电动门遥控钥匙老是忘记带,我就试想着搞一个可以用APP控制的电动门控制器.当然不能影响原有的遥控器控制啦.既然有这个设想,咱们就开始动手先查查资料看看这个想法的可行性啦.这是作为一个程序员第一次自己动手解决智能硬件的方案,觉得其中开发的过程很有趣,所以记录下来分享给大家.很快,查了很多资料得出的结论是完全可以实现的.我试想以下几种方案: (大牛请路过,这只是硬件小菜的入门帖,经过这次开发.我彻底爱上了APICloud和Arduino了)


    A : Arduino UNO + HC-06蓝牙连接. (事实证明蓝牙方案不行,HC-06是蓝牙2.1,2.2版的,IOS是不支持HC-06的.根本搜索不到蓝牙,虽然Android是支持的,我不可能为了开车库门还带一个Android手机,尽管我是一个苦逼的Android程序员.后来我也买了BLE蓝牙4.0的模块.但是IOS和Android都没有原生支持,还得自己开发APP模块,这种实现方案比较麻烦,直接PASS)
    B : Arduino UNO + Wifi模块连接. (这种方案也算是最通用的解决方案了.由于车库没有wifi,所以就得开AP模式,让手机连接WIFI模块然后利用TCP socket来通信)
    C : Arduino UNO + GSM或者NFC等等方式. (这种方式的硬件成本比较高,直接放弃)




    一.实现思路
      既然确定可行性方案,那接下来就得想一想实现思路了.其实很简单.分为两个部分,一个是智能硬件的部分.再者就是APP实现的部分.智能硬件就使用成本比较低开发文档比较多一点的Arduino开发版啦.本人选用的是Arduino UNO板 + Xbee拓展板 + Wee Wifi板 + 5v的两路继电器模块. 单片机的代码就是开启Wifi模块的AP模式.然后监听8080端口. APP部分为手机端连接wifi.然后连接智能硬件端的8080端口.再就是用TCP socket进行指令的收发. 控制范围也就是wifi的距离.大约100米左右.
      PS: 假如我家车库有连入WAN外网的wifi路由器.咱们的智能硬件就只要开启Client模式.然后连上外网.然后由手机的4G网络连接socket,真正实现全球控制模式.我这里就不具体讲实现过程了. 以下讲一讲硬件和软件实现的源码.

       1.智能硬件部分

            A.硬件模块图片( 硬件购自某宝,具体咱就不做广告嫌疑了.这里我没有使用调试串口,所以我就未购买,所有硬件设备成本100块以内)
         

         B.车库电动门控制器,带备用电源的(我这要是接入,右下角的手动接口. 1-4的接口分别为1.正转,2.停止,3.反转,4.公共)
            

         C.硬件连接示意图
            

          D.硬件连接实图
            

          E.单片机的代码部分
         #define SSID "CMCC"               //定义SSID广播名
#define PASSWORD "hb123456"         //设置wifi的密码
#define CHNUM 11                  //信道号
#define ECN 3                     //加密模式

#include "uartWIFI.h"               //wifi操作库有提供...其实就是用c写AT指令的一些简单的操作
#include "SoftwareSerial.h"

WIFI wifi;
extern int chlID;                   //client id(0-4)

//初始化函数
void setup()
{
//定义输出阵脚.D6为Ch1接口,D5为Ch2接口
pinMode(6, OUTPUT);               //这里的6就是咱们在Xbee拓展板上接入的D6接口,使用mega不改变接线的话,此处改为D24脚
pinMode(5, OUTPUT);               //这里的5就是咱们在Xbee拓展板上接入的D5接口

//开始wifi
wifi.begin();
//初始化wifi,设置wifi为Ap模式. 信道为11,密码模式为WPA2
bool b = wifi.Initialize(AP, SSID, PASSWORD, 11, 3);
if (!b)
{
    DebugSerial.println("Init error");
}

//Client模式下,线程暂停8s,确定模块有足够的时间来获取IP,这里我使用的是Ap模式,所以注释掉了.
//delay(8000);
//String ipstring = wifi.showIP();
//DebugSerial.println(ipstring);      

//开启多连接模式
delay(2000);
wifi.confMux(1);
delay(100);

//开启服务端8080端口
if (wifi.confServer(1, 8080))
    DebugSerial.println("Server is set up");
}

//循环函数
void loop()
{
char buf;
//接收消息
int iLen = wifi.ReceiveMessage(buf);
if (iLen > 0)
{
    //打开CH1 10秒,然后关闭 (D6 => CH1)
    if (strcmp(buf, "CH1ON") == 0)
    {
      digitalWrite(6, HIGH); //使用mega不改变接线的话,此处改为D24脚
      delay(10*1000);
      digitalWrite(6, LOW);
      DebugSerial.println("CH1ON");
    }
    //直接停止CH1
    if (strcmp(buf, "CH1OFF") == 0)
    {
      digitalWrite(6, LOW); //使用mega不改变接线的话,此处改为D24脚
      DebugSerial.println("CH1OFF");
    }
    //打开CH2 10秒.然后关闭 (D5 => CH2)
    if (strcmp(buf, "CH2ON") == 0)
    {
      digitalWrite(5, HIGH);
      delay(10*1000);
      digitalWrite(5, LOW);
      DebugSerial.println("CH2ON");
    }
    //直接停止CH2
    if (strcmp(buf, "CH2OFF") == 0)
    {
      digitalWrite(5, LOW);
      DebugSerial.println("CH2OFF");
    }
}
}

             #include "uartWIFI.h"    放置于Arduino IDE (版本为1.6.5) 的 \libraries 文件夹下.下载地址为: http://pan.baidu.com/s/1kT9TBz5
             编译以上代码并且上传到Arduino UNO
            

             上传之后打开 Arduino IDE -> 工具 -> 串口监视器   查看代码运行情况.
            Arduino UNO需要按开发板上的Reset按钮和Xbee拓展板上的Reset按钮.会出现以下的指令
            
            这里附上ESP8266 WIFI模块的AT指令详解http://wenku.baidu.com/link?url=0ayxM9Umpd50jnvN5pY3YD024dWRQiFFksZS-PJLau1k13wpfmM7Sb0U24vyrjUcircyyK1zH0fmk8QZdG-oBZQ2yYekpAcpksyOePpJaja


      2.APP部分源码
前面说过了.咱们是要做一个IOS和Android两个版本都适用的APP,咱可只懂Android开发.IOS不懂那不就歇菜了?还好有APICloud.给咱提供了一个可以跨平台的开发方式.这里APP也十分简单,只是调用了官方提供的端API的模块socketManager.具体不啰嗦了.贴代码.

          <div id="statusPanel" style=" margin-bottom: 20px;">
                                        <label>车库密钥&nbsp;:&nbsp;</label><label id="codeLabel">NULL</label>
                              </div>
                              <div id="controlPanel">
                                        <button>
                                                获取车库控制授权
                                        </button>
                                        <br />
                                        <button>
                                                连接车库控制系统
                                        </button>
                                        <br />
                                        <button>
                                                开门
                                        </button>
                                        <br />
                                        <button>
                                                停开
                                        </button>
                                        <br />
                                        <button>
                                                关门
                                        </button>
                                        <br />
                                        <button>
                                                停关
                                        </button>
                                        <br />
                              </div>
                        </div>
                        <div id="footer">
                              <h5>Copyright hbs &copy;2015 </h5>
                        </div>



var sid;
//连接车库控制系统
function connCarRoomController() {
      var socketManager = api.require('socketManager');
      socketManager.createSocket({
                host : '192.168.4.1',
                port : 8080
      }, function(ret, err) {
                if (ret) {
                        var state = ret.state;
                        sid = ret.sid;
                        var data = ret.data;
                        var stateStr = "";
                        if (101 === state) {
                              stateStr = "创建成功";
                        } else if (102 === state) {
                              stateStr = "连接成功";
                        } else if (103 === state) {
                              stateStr = "收到消息";
                        } else if (201 === state) {
                              stateStr = "创建失败";
                        } else if (202 === state) {
                              stateStr = "连接失败";
                        } else if (203 === state) {
                              stateStr = "异常断开";
                        } else if (204 === state) {
                              stateStr = "正常断开";
                        } else if (205 === state) {
                              stateStr = "发生未知错误";
                        }
                        var msg = 'sid: ' + sid + '\nstate: ' + stateStr + '\ndata: ' + ( data ? data : '');
                        api.alert({
                              msg : msg
                        });
                }
      });
}

//发送命令
function sendCmd(cmd) {
      var socketManager = api.require('socketManager');
      socketManager.write({
                sid : sid, //由createSocket方法获取得到
                data : cmd
      }, function(ret, err) {
                if (ret.status) {
                        api.alert({
                              msg : '发送成功'
                        });
                } else {
                        api.alert({
                              msg : 'error'
                        });
                }
      });

}

            云编译之后下载IPA到IOS安装.然后先连接CCMC的wifi接入点(就是之前在wifi模块设置的SSID名称,密码自己随便定义吧),其实可以一键连接Wifi的.但是APICloud模块商店的wifi模块是需要花钱的.498元.所以咱们就不做那么高级了.自己手动连接吧,保存以后可以自动连接的.这里的功能"获取车库控制授权"其实就是在单片机硬写入一个密码.用scaner扫描得到控制权.不然别人知道你的wifi密码,是不是可以随便开启你家的车库门啊?所以还得加一个控制密钥.这里就不写具体实现额.      APP界面也如下.
                        

            到这里,就大功告成了.主体功能是全部完成了.以下留着几个设想有时间慢慢完善:
            1.单片机端是否可以实现多线程执行,线程阻塞了也同时可以接收停止的指令.(这个是完全可以实现的.具体我就不说方法了.)
            2.单片机端是否还可以实现控制手机的Wifi离线而自动关闭车库门呢?有时候走的时候忘记关门了这种情况也很常见的哦
            3.APP端界面的美化,现在的是很丑.美化以后慢慢搞定啦.
            4.APP端实现多个控制端的 在线查看和授权. 还有控制密钥的添加

         这里附上APP的源码.有问题可以与我沟通QQ241492962

alstrom 发表于 2015-8-21 22:19

弄的不错。
我现在是菜鸟哈,但我觉得第二个问题应该不难,比如可以编写一个5分钟内自动关闭车门的程序,如果在5分钟内没有手动点击app关闭车库门。
另外需要加一个安全保护,比如在左边或者右边门框横向安装一个超声波传感器检测车门下是否有障碍,判断无障碍的情况下自动关闭车库门。

hbin 发表于 2015-8-21 22:35

alstrom 发表于 2015-8-21 22:19
弄的不错。
我现在是菜鸟哈,但我觉得第二个问题应该不难,比如可以编写一个5分钟内自动关闭车门的程序,如 ...

这个想法不错哦。只不过要加一个超声波模块。增加了硬件成本啦。我目前的做法是。在loop里面加入一段检测代码。每隔5分钟检测连入ap的客户端是否离线。(手机离开wifi范围会自动离线。)离线则自动关闭车库门。这种实现比较优雅一点。

alstrom 发表于 2015-8-21 22:57

hbin 发表于 2015-8-21 22:35
这个想法不错哦。只不过要加一个超声波模块。增加了硬件成本啦。我目前的做法是。在loop里面加入一段检测 ...

我是做机械自动化的,所以安全保护是首要考虑的,建议增加保护措施,毕竟万一有小孩在那里玩耍或者压到猫猫狗狗就不好了:lol

hbin 发表于 2015-8-21 23:05

alstrom 发表于 2015-8-21 22:57
我是做机械自动化的,所以安全保护是首要考虑的,建议增加保护措施,毕竟万一有小孩在那里玩耍或者压到猫 ...

哈哈,你还是比较专业。这个问题确实有必要解决哦:dizzy:

2268617622 发表于 2015-9-29 14:12

有个疑问,你说“全球手机控制”,国内使用的动态ip地址,如何能确保手机app每次都能连到你加wee wifi模块?

hbin 发表于 2015-9-29 14:45

2268617622 发表于 2015-9-29 14:12
有个疑问,你说“全球手机控制”,国内使用的动态ip地址,如何能确保手机app每次都能连到你加wee wifi模块 ...

动态ip这个问题太好解决了。1.使用动态域名。更新ip了就自动更新域名a记录。ip变化。但是域名不会变化。2.服务器固定ip。
页: [1]
查看完整版本: 100块搞定APICloud+Arduino单片机实现控制车库自动门的控制器