极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11464|回复: 1

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

[复制链接]
发表于 2015-8-21 21:19:14 | 显示全部楼层 |阅读模式
本帖最后由 hbin 于 2015-8-21 21:20 编辑

说到车库,我家的车库电动门遥控钥匙老是忘记带,我就试想着搞一个可以用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[100];
  //接收消息
  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
回复

使用道具 举报

发表于 2015-8-22 11:03:01 | 显示全部楼层
                     赞一个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 15:12 , Processed in 0.056492 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表