切换到宽版
  • 6120阅读
  • 20回复

[无线]超远程遥控开门智能家居版 [复制链接]

上一主题 下一主题
离线ppxiaop
 

发帖
88
M币
622
专家
5
粉丝
23
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2015-05-23
前几天看到coolrikuy的这个帖子,

让废旧手机再放光芒,超远程遥控开门

真是非常好的创意。。。!不过与用手机实现开关想比,我更喜欢用无线的方式,这样还可以和我正在进行中的智能家居系统进行整合

搭建中央控制智能家居系统【进行中】

我家也有这么一个类似的对讲门禁系统,如下:


拆看测一下电压,傻眼了,这个系统只有两根供电线,而且在按下门铃的时候才有电压,电压在3-5V之间波动。。。很不稳定。没有常电,不得已只好用外供电的手段。

控制方面,这个系统有点变态,门铃响了之后,一定要摘掉话筒之后,才能按开关开门。。。不得已用了两个继电器实现。
单片机使用STC11F02E,NEC格式红外接收头,具体电路和代码很简单。。。就不多说了。




红外接收头安装在角落,不注意看看不出来。



随便找了个不用的遥控器获得编码,然后祭出大杀器:红外遥控学习解码发射中心。
使用WIFI转串口模块控制



将学习到的编码添加到控制数据库


系统自动检测到并显示简单的控制面板



外接的电源线使用扁平网线制作,找个时间需要美化一下。



这样,只要在能上网的地方,就可以开楼道门,家里门也是密码锁,终于再也不用担心忘带钥匙了。。。


附上单片机代码

#include<reg52.h>    //包含头文件
#include<intrins.h>           //    intrins.h
sbit IR=P3^2;  //红外接口标志
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit switcher1 = P1^7;
sbit switcher2 = P1^6;
/*------------------------------------------------
                全局变量声明
------------------------------------------------*/

unsigned char  irtime;//红外用全局变量

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];

/*------------------------------------------------
                  函数声明
------------------------------------------------*/

void smgdisplay(void);
void Ircordpro(void);


void Delay300ms()        //@5.5296MHz
{
    unsigned char i, j, k;

    i = 7;
    j = 78;
    k = 167;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}




/*------------------------------------------------
                 定时器0
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
  irtime++;  ////用于计数2个下降沿之间的时间,每次中断时间为0.555ms(5.5M内部晶振)
}

/*------------------------------------------------
                  外部中断0
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
  static unsigned char  i;             //接收红外信号处理
  static bit ir_flag;                //是否开始处理标志位
  
    if(irtime<26&&irtime>=23)   //9ms下降沿和第一个信号下降沿之间的时间,甄别是否为13.5ms的引导信号: 23*0.555 = 12.76, 26*0.555 = 14.43
        {
            i=0;
              ir_flag=0;   //如果是,则开始处理红外信号
          }
          
          if (ir_flag==0)
              {
                    irdata=irtime;     //存储每个电平的持续时间,用于以后判断是0还是1
                    irtime=0;
                    i++;
                    if(i==33)
                  {
                        irok=1;
                        i=0;
                        ir_flag=1;
                        }
         }
                
            if (ir_flag)
                {
                    irtime=0;
                    return;
                }

}

/*------------------------------------------------
                定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{

  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00; //重载值
  TL0=0x00; //初始化值,溢出时间约为0.555ms
  ET0=1;    //开中断
  TR0=1;    
}
/*------------------------------------------------
                  外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1;   //使能外部中断
EA = 1;    //开总中断
}


/*------------------------------------------------
                红外码值处理
------------------------------------------------*/
void Ircordpro(void)//????????
{
  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;   //抛弃irdata[0](引导码时间)
  for(i=0;i<4;i++)      //处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>3)//   2.25ms为1,1.12ms为0  3*0.555 = 1.665 ms
             value|=0x80;
          if(j<8)
            {
             value>>=1;
            }
           k++;
         }
     IRcord=value;
     value=0;    
     }
     irpro_ok=1;////处理完毕标志位置1
}

/*------------------------------------------------
                   主程序
------------------------------------------------*/
void main(void)
{
EX0init(); //???????
TIM0init();//??????

while(1)//???
   {
    if(irok)                       //如果接收好了进行红外处理
      {  
       Ircordpro();
       if ((IRcord[0]==0x00)&&(IRcord[1]==0xBF)&&(IRcord[2]==0x0D)&&(IRcord[3]==0xF2))
            {
            switcher1 = 0;    
            Delay300ms();
            Delay300ms();
            Delay300ms();
            switcher2 = 0;    
            Delay300ms();
            switcher1 = 1;    
            switcher2 = 1;    
            }     //door open
        irok=0;
      }

   }
}
  
  
[ 此帖被ppxiaop在2015-05-23 16:47重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共7条打赏M币+19
离线a813852

发帖
133
M币
107
专家
0
粉丝
5
只看该作者 1楼 发表于: 2015-05-23
离线第六驱动

发帖
341
M币
2232
专家
0
粉丝
30
只看该作者 2楼 发表于: 2015-05-23
离线ppxiaop

发帖
88
M币
622
专家
5
粉丝
23
只看该作者 3楼 发表于: 2015-05-23
回 第六驱动 的帖子
请登录后查看
离线bottle05

发帖
92
M币
311
专家
1
粉丝
11
只看该作者 4楼 发表于: 2015-06-08
请登录后查看
离线bottle05

发帖
92
M币
311
专家
1
粉丝
11
只看该作者 5楼 发表于: 2015-06-08
回 bottle05 的帖子
请登录后查看
离线njh911
发帖
1858
M币
3362
专家
0
粉丝
13
只看该作者 6楼 发表于: 2015-06-08
离线lishibai

发帖
21619
M币
117
专家
11
粉丝
133
只看该作者 7楼 发表于: 2015-06-08
请登录后查看
本帖最近打赏记录:共1条打赏M币+3
离线qjj2857

发帖
644
M币
532
专家
2
粉丝
12
只看该作者 8楼 发表于: 2015-06-08
请登录后查看
离线ppxiaop

发帖
88
M币
622
专家
5
粉丝
23
只看该作者 9楼 发表于: 2015-06-12
回 qjj2857 的帖子
请登录后查看
本帖最近打赏记录:共1条打赏M币+1
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个