yeapsion 发表于 2016-8-17 01:18:04

【GoKit+STM32】 之智能家居云控制套件

本帖最后由 Genius 于 2016-9-2 11:30 编辑

机智云智能硬件创新大赛作品
希望大家多多支持!:hug:
项目名称:【GoKit+STM32】之智能家居云控制套件
作品适用环境:适用类似于学生宿舍这种小型住宅,套件中的小模块可直接替换住宅中86盒子面板,嵌入到墙壁内,不破坏原来的环境。智能网关与家中路由配对后就可持续工作,使整个套件一直处于联网状态,用户可轻松感知家里的状态和控制家中的已配对电器。
需要用到的材料:1.TFT串口屏X12.STM32F103ZET6单片机X13.汉枫LPB100wifi模块X14.NRF24L01无线通讯模块 X65.AMS1117-3.3 AMS1117-5.0稳压芯片若干6.电阻、电容、led、导线若干7. 220V-7.2V稳压电源X18. STC15W408AS 单片机 X49.五脚继电器X510. MP3模块 X111. 红外发射管 X412.86型开关面板、底盒X313.干簧管 X114 3.3V锂电池X115.220V白炽灯 X1
软件开发环境:KEIL5 MDKKEIL4 C51
1.总体方案设计       智能家居云控制套件最终要实现可以在手机应用程序上远程控制家里的电灯、插座、红外遥控电器的开关以及他们的定时时间,也可以在住宅内的智能网关控制系统上,通过网关携带的图形化人机交互界面设置电灯控制模块、插座控制模块、红外电器遥控模块、门窗开合警报模块、语音模块的所有功能以及监控来自云端的实时遥控命令。        因为采用了“机智云”的物联网技术方案,使手机应用程序端能与智能网关保持快速数据通信。智能网关是整个设计的核心,能起到承上启下的作用,所以设计了STM32主控芯片、高清彩色触控屏、WIFI模块加双发无线通信模块这一方案。STM32主控芯片负责处理来自WIFI模块、触控屏和无线通信模块的数据,并把数据重新打包分发出去,触控屏独立负责人机交互界面,WiFi模块负责与路由器通信,两个无线通信模块负责与下属的子模块进行数据交互。电灯控制模块负责实际开关电灯,插座控制模块负责实际通断插座电源,红外电器遥控模块负责操控红外遥控的电器,门窗开合警报模块负责检测门窗的状态,语音模块负责提供语音警报和播放歌曲,所有的子模块均与智能网关保持无线通信,除门窗开合警报模块外均由220伏市电提供电源 。          所以整个智能家居云控制套件分为手机控制端、智能网关控制器、电灯控制模块、插座控制模块、红外电器遥控模块、门窗开合警报模块、语音模块七部分。
1.1智能网关控制器    智能网关控制器是整个设计的重点,它在本设计中起到数据汇集、承上启下的作用。智能网关需要通过WIFI模块接收来自云端的控制命令,然后发送到MCU上,MCU更新数据库和做出相应的处理后再根据不同的协议把控制指令通过无线通信模块发送到子模块上。智能网关同时还要接收子模块、触控屏和时钟芯片的数据,MCU对数据进行相应的逻辑处理后再发送到云端或临时保存起来。
1.2电灯控制模块电灯控制模块的功能是通过无线通信模块接收来自智能网关的电灯控制指令,通过MCU对控制指令进行处理分析,MCU根据得到的结果再去控制继电器的通断来控制电灯,MCU还要根据接收控制信号指示灯的状态。最后还要防止继电器的电压对MCU产生干扰。
1.3插座控制模块    智能网关把插座信息的控制指令发出后,插座的无线通信模块就会接收到数据并把数据发到MCU上进行处理分析。MCU根据得到的结果再去控制继电器的通断来控制插座电源,MCU还要控制信号指示灯的状态。最后还要对继电器的信号进行光电隔离。在考虑插座模块的具体应用场景后,还要为模块设定独立的电源开关,使用户在插座模块上也能控制电源通断。
1.4红外电器遥控模块    红外电器遥控模块的主要功能是通过无线通信模块接收来自智能网关的遥控指令,MCU把收到的遥控指令进行解释重组后通过红外发射模块把遥控指令转发出去,进而控制空调、电视等。MCU还要根据通信状态控制信号指示灯。
1.5门窗开合警报模块    门窗开合警报模块的主要功能是用模块上的干簧管检测门窗的开合状态,然后用无线通信模块把信号发送给智能网关进行处理。还要根据门的状态用MCU控制信号指示灯的颜色。最后要为粘贴在门窗上的警报模块选择合适的供电方案。
1.6语音模块    语音模块的主要功能是用无线通信模块接收来自智能网关的语音控制指令,MCU把收到的遥控指令进行解释重组后控制警报发生器做出反应。使警报发生器发出声音,起到阻吓贼人的作用。
浏览器复制打开:http://v.youku.com/v_show/id_XMT ...&spm=0.0.0.0.iFj7FE智能家居云控制套件视频演示:
http://player.youku.com/player.php/sid/XMTU3NTcyNzA4OA==/v.swf




http://v.youku.com/v_show/id_XMTU3NTcyNzA4OA==.html?from=s1.8-1-1.2&spm=0.0.0.0.s1WcHq
回帖可见相关源码:
**** Hidden Message *****

1112 发表于 2016-9-9 09:36:08


mark,鼓励开源,期待楼主跟新

yeapsion 发表于 2016-8-20 22:08:53

4.智能家居云控制系统的软件设计
    智能家居云控制套件由七个独立的小系统组成,他们之间通过无线通信的方式组成一个大系统。把七个小系统的电源接通后,小系统之间的通信模块就会自动握手连通,智能家居云控制系统正式进入运行状态。智能网关上电后就与WiFi模块保持心跳通信,STM32每隔一段时间都把自己的状态通过WiFi模块上传到云端上,然后从云端把手机控制端的数据点下载下来保存到STM32的数据库中。STM32还要与串口HMI保持通信,每个程序周期内要都把STM32的数据库通过串口的方式更新到HMI中,用以保持人界界面数据的实时性。同时还要检测用户有没有操控人机界面,一旦检测到数据变化就把人机界面的数据更新到STM32的数据库。STM32 还要读取DS1302时钟模块中的时间。STM32通过以上通信把数据保存到数据库中后就将这些数据进行整合分析,判断是否有开关灯、播放音乐、定时的控制指令。运算结束后就会把这些控制指令从新打包放到发送数据库中,通过发射模式的无线通信模块广播出去。插座、红外、电灯等模块接收到来自智能网关的数据包后就会根据通信协议提取出自己那部分的数据,然后保存到各自的数据库中。子模块会一直检测数据库中的控制指令参数是否改变,一旦有数据改变,就会执行动作,控制电灯点亮、空调调温、切换歌曲等。而门窗开合警报模块会一直向智能网关发送门窗的状态。
4.1 HF-PB100 WiFi模组通信协议WiFi模组与STM32是以9600波特率、8个数据位的方式进行串口通信。他们之间需要传输请求设备信息、WiFi模组与设备MCU的心跳、重置WiFi模组、请求重启MCU、读取设备的当前状态、组控制设备等复杂的命令。而串口通信每次只能传输一个字节,要想实现复杂的控制功能就要设计出稳定可靠的通信协议。现约定以下通信格式:header(2B)=0xFFFF, len(2B), cmd(1B), sn(1B), flags(2B), payload(xB), checksum(1B)上述协议中,通信协议的包头固定为0xFFFF,用来标记数据包的起始位置。Len是数据包的长度,它记录着命令开始到校验和之间的字节长度。cmd是数据包的命令类型,如:0X01表示WiFi模组请求设备信息,0X09表示设备MCU通知WiFi模组进入配置模式……。Sn是消息的序列号,发送方发出后,接收方应答时要返回。Checksum是检验和,本协议的校验方式是对数据包的长度位按字节开始求和,把得到的结果对256进行求余运算。对数据包命令进行分类处理的函数为:
/*****************************************************
* Function Name: MessageHandle
* Description    : 串口有数据发生了,先检查数据是否合法,再解析数据帧,做相应处理
* Input          : None
* Output         : None
* Return         : None
* Attention                   : None
*****************************************************/
void MessageHandle(void)
{
        Pro_HeadPartTypeDef   Recv_HeadPart;
        memset(&Recv_HeadPart, 0, sizeof(Recv_HeadPart));//初始化结构体Recv_HeadPart        memset(&UART_HandleStruct.Message_Buf, 0, sizeof(16));//Message_Buf为数组缓冲区
        if(UART_HandleStruct.Package_Flag) //接收到完成串口数据包标志位
        {
               
        UART_HandleStruct.Message_Len = UART_HandleStruct.UART_Cmd_len + 4;       
        memcpy(&UART_HandleStruct.Message_Buf, UART_HandleStruct.UART_Buf,
               UART_HandleStruct.Message_Len );                       
       memcpy(&Recv_HeadPart, UART_HandleStruct.Message_Buf, sizeof(Recv_HeadPart));                memset(&UART_HandleStruct.UART_Buf, 0, sizeof(UART_HandleStruct.Message_Buf));               
        UART_HandleStruct.Package_Flag = 0; //完整串口数组接收标志位清零
        UART_HandleStruct.UART_Count = 0;
               
        if(CheckSum(UART_HandleStruct.Message_Buf, UART_HandleStruct.Message_Len) !=
         UART_HandleStruct.Message_Buf) //检验和
                {
                        Pro_W2D_ErrorCmdHandle();//WIFI非法通知,MCU返回
                        return ;               
                }
                switch (Recv_HeadPart.Cmd)//Cmd, 串口命令分类处理
                {
                        case Pro_W2D_GetDeviceInfo_Cmd: //0x01,wifi模组请求MCU信息
                                Pro_W2D_GetMcuInfo();   //mcu返回设备信息
                                break;
                        case Pro_W2D_P0_Cmd://0x03,wifi模块下发的控制命令
                                Pro_W2D_P0CmdHandle();               
                                break;
                        case Pro_W2D_Heartbeat_Cmd:        //0x07,WIFI模块发送的 心跳                                               
                                Pro_W2D_CommonCmdHandle();
                                printf("Pro_W2D_Heartbeat ...\r\n");       
                                break;                                               
                        case Pro_W2D_ReportWifiStatus_Cmd: //0x0d,WiFi状态变化通知
                                Pro_D2W_ReportDevStatusHandle(); //返回MCU设备各个状态变量
                                break;
                        case Pro_W2D_ErrorPackage_Cmd:   //0x11,非法通知
                                Pro_W2D_ErrorCmdHandle();   // WiFi发送收到非法信息通知,
                                break;
                        default:
                                break;
                }       
        }
               
}       
给设备发送命令的处理函数:
*****************************************************
* Function Name: Pro_W2D_Control_DevceHandle
* Description    : WiFi 使用P0协议给设备发送命令处理函数
* Input          : uint8_t *Buf:接收到的指令
* Output         : None
* Return         : None
* Attention                   : None
*****************************************************/
extern uint8_t Switch_Sta;
extern u8 tmp_buf;
void Pro_W2D_Control_DevceHandle(void)
{
        Pro_P0_ControlTypeDef      Pro_P0_ControlStruct;//4WiFi模组控制设备
        Pro_W2D_CommonCmdHandle();
        memcpy(&Pro_P0_ControlStruct, UART_HandleStruct.Message_Buf,
               sizeof(Pro_P0_ControlStruct));
        switch (Pro_P0_ControlStruct.Attr_Flags1)
        {
                case Socket_Power: //0x01 插座开关信号
                  if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x01)   //
                  {tmp_buf=1;}      //把单独的位信号,放入自己定义的寄存器Switch_Sta中,                        else                                                                                    {tmp_buf=0;}                        
                        break;                       
                case Socket_Timing:       //0x02 插座定时器开关信号                               
                  if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x02)
                  {tmp_buf=1;}
                  else
                 {tmp_buf=0;}
                 break;
                case Lamp_Power:    //0x04 电灯开关信号
                  if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x04)
                  {        tmp_buf=1;}
                        else
                        {        tmp_buf=0;}
                        Device_WirteStruct.Power_Switch = Switch_Sta ;
                        break;
                case Lamp_Timing: //0x08电灯定时器开关信号
                  if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x08)
                  {tmp_buf=1;}
                        else
                        {tmp_buf=0;}
                        Device_WirteStruct.Power_Switch = Switch_Sta ;
        break;
                case Gree_Power://0x10 格力空调开关
                  if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x10)
                  { tmp_buf=1; }
                        else
                  { tmp_buf=0;}
                        Device_WirteStruct.Power_Switch = Switch_Sta ;
                       
                        break;/******/
                       
                case Socket_Hour: //0x20 插座定时器时数据
       Device_WirteStruct.Socket_Hour = Pro_P0_ControlStruct.Device_Wirte.Socket_Hour;
       tmp_buf=Pro_P0_ControlStruct.Device_Wirte.Socket_Hour;
                        break;
             case Socket_Minute: //0x40 插座定时器分数据
        Device_WirteStruct.Socket_Minute = Pro_P0_ControlStruct.Device_Wirte.Socket_Minute;
       tmp_buf=Pro_P0_ControlStruct.Device_Wirte.Socket_Minute;
                        break;
                case Lamp_Hour: //0x80电灯定时器时数据
        Device_WirteStruct.Lamp_Hour = Pro_P0_ControlStruct.Device_Wirte.Lamp_Hour;
        tmp_buf=Pro_P0_ControlStruct.Device_Wirte.Lamp_Hour;
                        break;
       
/*************************添加更多可写设备*******************************/


/******************************************************************/                               
                default:
                        break;
        }
        switch (Pro_P0_ControlStruct.Attr_Flags2)
        {
                case Lamp_Minute: //0x01 电灯定时器分数据
                Device_WirteStruct.Lamp_Minute = Pro_P0_ControlStruct.Device_Wirte.Lamp_Minute ;
                  tmp_buf=Pro_P0_ControlStruct.Device_Wirte.Lamp_Minute ;
                        break;                       
                case Gree_Temp:       //0x02 格力空调温度值
             Device_WirteStruct.Gree_Temp = Pro_P0_ControlStruct.Device_Wirte.Gree_Temp ;
                  tmp_buf=Pro_P0_ControlStruct.Device_Wirte.Gree_Temp;
                        break;
                default:
                        break;
        }
        Pro_D2W_ReportDevStatusHandle();
        memset(&Pro_P0_ControlStruct, 0, sizeof(Pro_P0_ControlStruct));
}





Gemini 发表于 2016-8-17 13:48:55

:lol好东西

Genius 发表于 2016-8-17 16:42:15

mark,鼓励开源,期待楼主跟新

yeapsion 发表于 2016-8-20 21:15:17

本帖最后由 yeapsion 于 2016-8-20 21:17 编辑

2.主要器件介绍
2.1 STM32F103ZET6单片机
       STM32F103ZET6使用增强型高性能的ARM Cortex-M3 32位RISC内核,工作在72MHZ的工作频率下。芯片内部高速存储器高达64K字节,闪存高达512K字节的闪存。芯片拥有完全满足需求的144个增强I/O端口和丰富的外设。STM32中包含4个通用16位定时器、3个12位的ADC,还包含多达2个I2C接口、3个SPI接口、2个I2S接口、一个USB接口、1个安全数字输入输出卡接口、5个全双工串行接口。
STM32F103ZET6工作于-40°C至+105°C的温度范围,供电电压2.0V至3.6V,芯片具有省电模式,这种模式能提高设备在缺电的特殊环境下的生存能力。
2.2 串口HMI触控屏
       串口HMI触控屏就是设备封装好HMI 的底层功能以后,通过串口与MCU 进行交互,MCU 可以随时通过USART发指令改变某个组件的参数或者页面的界面。设备也可以随时通过USART 通知用户MCU 操作者目前触摸了页面上的某个组件或者设备当前进入了某个页面。
串口HMI对屏幕上点阵的控制交给了设备内部的主控芯片。这样面向用户的就变成了控件了。控件是串口HMI 封装好的一个功能模块。它能通过配套的上位软件创建出来,想要在左上角显示一段文本,就在左上角创建一个文本控件,要在右边显示一个按钮,就在右边创建一个按钮控件。使用控件操作后,用户MCU就无需处理一个内容的点的显示状态和坐标。用户只需要关注屏幕上的控件的属性。MCU在运行中通过串口指令改变控件的内部属性,就能改变屏幕上显示的内容。除此之外控件还有触摸事件功能。他能在屏幕被触摸以后主动通知用户,也可以自动执行一些指令。

2.3 HF-PB100 WiFi模块
      HF-PB100超低功耗WiFi模组可将开发者的串口硬件设备连接到WiFi无线网络上,并用串口进行数据传输。该模块硬件上集成了和功率放大器、MAC、基频芯片、射频收发单元。其内部固件支持TCP/IP协议栈组网和WiFi协议及配置。MCU控制的设备能通过这一一体化的802.11b/g/n WiFi解决方案很方便的接入到WiFi无线网络,实现物联网控制和管理的功能。
其功能齐全,尺寸小巧,尺寸仅为23.1mm x 32.8mm x (3.45±0.3)mm,采用表面贴片封装,容易贴在客户的产品硬件电路板上,既可以使用PCB内置天线,也可以使用外置天线。

2.4 NRF24L01无线通信芯片
       NRF24L01是由NORDIC生产的单片无线收发器芯片。它几乎可以适配任何单片机来完成数据传输工作,可以通过SPI 接口设置输出功率频道和协议。模块具有功耗非常低的待机模式,可以使硬件设备在特殊时期保持低功耗的待机状态,减少非必要的电源消耗,增强设备的生存力。而且还能够读取模块的IRQ电平状态来判断数据的发送和接收情况,使MCU对数据进行及时处理。

2.5 DS1302时钟芯片
      DS1302是DALLAS公司设计的双电源供电的实时时钟芯片。芯片采用SCLK、IO、RST三根线与MCU进行通信,一次可以传送多个时钟数据,是一种低功耗、高性能的芯片。芯片的的传输数据有秒分时月年,且能自动补偿不同天数的月份和闰年。配合MCU和传感器后非常适合测量记录系统。

2.6 STC15W408AS单片机
       STC15W408AS是STC生产的宽电压、低功耗8051单片机。这款单片机的代码执行速度是旧版8051单片机的10倍,且完全兼容传统8051单片机的指令代码。内部集成高可靠的复位电路,就连晶振电路也集成在里面,省去繁杂的外部驱动电路。有可擦写10万次的片内EEPROM功能,内含8通道10位高速ADC、3路PWM、3通道捕获比较单元、一个全双工串口、3个定时器。

2.7 TP4056充电芯片
    TP4056是一款采用了内部PMOSFET架构和防倒充电路的恒流恒压线性充电器。芯片只有八个引脚,外部只需要很少的元件,再加上芯片底部带有散热片。芯片是在4.2V的恒定电压下充电,而充电的电流却是可以调节的,调整芯片外部的电阻器就能实现。为了在高温环境下限制芯片的充电电流,芯片集成了可自动调节充电电流的热反馈。具有自动终止充电循环、低电流状态、欠压闭锁、停机模式、电池温度检测、自动再充电和两个用于指示充电的功能。

yeapsion 发表于 2016-8-20 21:21:23

本帖最后由 yeapsion 于 2016-8-20 22:12 编辑

3.智能家居云控制套件的硬件设计3.1智能家居硬件设计的总体要求本设计由多个模块构成,涉及互联通网信、高频电路、传感器、弱电控制强电等技术,整个设计的成功运行依赖硬件电器部 分的稳定性。要设计出稳定、可行的电气系统要满足:1.主控芯片和它的外设传感器分开供电,给主控芯片一个独立的稳压电路,保证主控芯片的电源稳定性。2.设计电路时做好强弱电的分离工作,防止外部强电影响系统的稳定性。3.主控系统与继电器进行连接时要做光电隔离,防止电涌造成主控系统死机。4.为主控系统配置后备电源,防止电源意外断开造成单片机运行数据的丢失。
3.2硬件供电电路   整个智能家居云控制套件中由智能网关、插座、红外转发器等多个小系统组成,每个小系统工作在不同的环境下,小系统中又有不同的芯片和传感器。电源的设计对智能家居云控制系统格外主要,要根据系统所在的环境选择不同的电源输入,子系统得到电源后还要根据电路中芯片、传感器的电源需求选择不同的稳压电路。
3.2.1 220V-5V整流稳压电路   智能家居云控制套件中的电灯控制模块、插座控制模块、红外电器遥控模块、语音模块最终都会安装在86型通用暗盒中,所以最方便最直接的方式就是直接从220V市电中取电,此时需要把220V的交流电整流降压成模块所需要的5V直流电,整流稳压模块电路图如下图3.1 所示: 本机采用的是现成的交流电转直流电降压模块,这是一款微型5V-700ma隔离开关电源模块,具有温度保护、高低压隔离、短路保护及过流全保护,电压的输入范围在85V-265V交流电之间,可以使模块准确得输出直流5V电源,体积小巧。可以完美的焊接在PCB板上。
3.2.2 AMS1117.5.0 稳压电路   智能网关中的时钟电路和彩色触控屏都是在5V电压下工作,需要选择合适的稳压电路把智能网关电源输入端的9V电源稳压成5V。AMS1117-5.0是一个正向低压降稳压器。芯片内内部集成过热保护和限流电路,具有1%的精度,广泛应用于小型移动设备。它的原理图如下图3.2所示 :
为了对电路进行蓄能和消除旁路的高频噪声,本设计在稳压芯片的输出端接入钽电容作为去耦电容。时钟电路和触控屏均为数字电路,所以采用数字电路中典型的0.1uf去耦电容,它对噪声有较好的去耦效果。同时还在稳压芯片的输出端接上电源指示灯,用1K的电阻对指示灯电路进行限流,防止过流损坏LED灯。
3.2.3 AMS1117-3.3稳压电路智能家居控制器中的MCU、NRF24L01、WiFi模块都需要在3.3V的电压下工作,这些通信模块和MCU都是系统中的核心,对电源的稳定性非常高。本设计选用AMS1117系列稳压芯片中的3.3V。它的原理图如下图3.3所示:
    由于这些核心元件对电源的稳定性都很高,本设计在稳压芯片的输入端和输出端都加入钽电容作为去耦电容,以此消除旁路中的高频噪音。也同样在芯片的3.3V输出端和GND之间加入发光二极管电路,用来观察供电情况。
3.2.4 TP4056充电管理电路   门窗开合警报模块是粘贴在门窗上,本设计在之前的方案对比中选择了单节锂电池作为模块的供电电源。为了保证电池与电路板的稳定性和模块外壳的一致性,要把电池固定在电路板后封装在亚克力外壳内。这样就只能用充电管理电路给锂电池充电了,实际使用中,把手机充电器的插口插到模块的Micro USB中就可以了。它的原理图如下图3.4所示:
在充电时,红色发光二极管会亮起表示充电状态,充满时绿色发光二极管会亮起。本设计在官方电路的基础上加上下载口和电源开关,使模块下载程序时不必取下锂电池。更方便的下载程序。
3.3主控芯片电路3.3.1 智能网关的主控芯片电路    智能网关的控制芯片选择的是:STM32F103ZET6,它要与WiFi模块和NRF24L01无线通信模块通信,读取触控屏的参数,最后把这些数据进行拟合和打包发送。这个芯片是整个系统的核心。它的核心电路图如下图3.5所示:
3.3.2 插座、灯座等子系统的主控芯片电路   为了考虑编程时的统一性,在考虑插座、灯座等五个子系统的总体需求后,我把所有子系统的单片机型号都统一为STC15W408AS。主控芯片在子系统中把来自智能网关的控制指令进行解析,然后再转换成实际指令去控制电灯、插座、MP3模块等外设。这款单片机是内置晶振的,并不需要外部起振电路,在下载程序时选定晶振频率便可。它的核心电路图如下图3.6所示:
3.4无线通信电路3.4.1 HF-PB100 WiFi模块电路    智能家居云控制套件要想实现云控制就必须要连接到互联网,其中最方便最简洁的方式就是采用WiFi连接的方式。所有手机端的操控指令都要通过WiFi模块的转发才能到达子系统。本设计中采用的WiFi模块的型号是: HF-PB100,它支持802.11b/g/n无线标准,支持USART/SPI/GPIO数据通信接口,针对智能家居这种低流量低频率的数据传输领域作了专门优化。本设计的主控芯片与WiFi模块采用串口的方式进行数据交互,把主控芯片的TXD、RXD分别与WiFi模块的RXD、TXD相连。它的原理图如下图3.7所示:
3.4.2 NRF24L01无线通信模块电路智能网关控制套件与下属的五个子系统都依靠无线通信模块进行数据交互,所有的控制指令都依靠无线通信模块传输到子系统上。本设计所用的无线通信模块是NRF24L01,它要用3.3V供电,通信引脚都可以直接和普通的5V单片机IO口直接相连,可用普通的IO口模拟SPI来控制。当单片机IO口电流超过10mA时需要串联电阻分压。本设计的主控芯片IO口电流少于10mA,所以直接将NRF24L01无线通信模块的引脚连接到主控芯片的IO口上。它的原理图如下图3.8所示:



yeapsion 发表于 2016-8-20 21:34:51

本帖最后由 yeapsion 于 2016-8-20 22:13 编辑

3.5其他控制应用电路3.5.1 DS1302时钟电路       智能家居云控制套件中是具有定时开关灯的功能,此时就需要给主控芯片提供一个参考时间作为对比。这样,主控芯片判断到定时时间到了的时候就可以控制电灯和插座的动作了。本设计采用的是DS1302时钟电路,为模块配备了3.3V的纽扣电池作为后备电池,这样时钟电路在智能网关控制系统断电的时候就不会停止计时,导致每次都要调整时间。DS1302时钟芯片采用三线SPI接口与主控芯片进行通信,通信时需要在三个引脚上加上1K的上拉电阻,否则将无法正常通信。DS1302时钟电路原理图如下图3.9所示:
3.5.2 MP3模块电路   语音模块在门窗意外打开时发出警报声和平时用作音乐播放的,它在接收到主控芯片的串口指令时需要根据指令的内容播放/暂停歌曲、切换歌曲等。它是一个成品模块,与主控芯片进行串口通信,采用直流5V的供电方式,其中的SPK1-,SPK1+引脚接到扬声器上。模块的原理图如下图3.10所示:
3.5.3 继电器控制电路      电灯控制模块和插座控制模块接收到电源通断指令时最终都要依靠主控芯片控制继电器控制电路来完成动作。本设计的继电器的通断是通过控制S9015来实现的,在继电器线圈两端并联一个IN4007二极管续流,防止继电器失电时产生的电动势损坏三极管。考虑到线圈的驱动电流比较大,为了防止继电器对主控芯片造成干扰,采用了一个光耦开关对继电器和MCU进行光电隔离。当IO口输出“1”时,继电器得到电而闭合。当IO口输出“0”时,继电器就因为断电而断开。继电器的电路原理图如下图3.11所示:
3.5.4 红外发射管电路   红外电器遥控模块在接收到来自智能网关的遥控指令时,需要通过主控芯片将遥控指令翻译成38KHz载波调制的红外信号。红外发光二极管在少于20mA的电流下工作。为了适应不同的工作电压,需要在回路中串联限流电阻。本设计用一个S9015三极管驱动发光二极管,在发光二极管的基极串联一个1K的电阻,然后又加上一个1K的上拉电阻来保证驱动电路的稳定性。考虑到红外发光二极管的发光角度局限,在模块的不同方向均放置了一个发光电路,保证红外信号的覆盖性。红外发射管的电路原理图如下所示:
3.5.5 干簧管电路    门窗开合警报模块依靠检测粘贴在门框上的磁铁来检测门的开合状态的,只要模块检测到磁铁,干簧管就闭合,IO口输出低电平。模块检测不到磁铁,IO口输出高电平。在干簧管上串联一个1K的限流电阻,在IO口与GND之间串联一个1nF的滤波电容。干簧管的电路原理图如下图3.14所示:
3.5.6 OLED显示屏电路本设计在每个模块上都设置了OLED模块的电路。OLED 屏是一种可控亮度的自发光屏幕。可以在上面显示文字、字符,操作方便,功能丰富,在调试程序的过程中占据重要的位置。模块与单片机进行SPI通信,用单片机模拟SPI总线非常方便。模块电路的原理图如下图3.15所示:

yeapsion 发表于 2016-8-20 21:56:48

3.6智能家居云控制系统实物图

yeapsion 发表于 2016-8-20 22:20:24

设备数据点
另存为模板 + 新建数据点


[*]显示名称:Socket_Power标识名:Socket_Power读写类型:可写数据类型:布尔值
备注: 插座模块的电源开关
编辑 删除




[*]显示名称:Socket_Hour标识名:Socket_Hour读写类型:可写数据类型:数值
数据范围:0 - 23分辨率:1增量:0
备注: 插座模块的定时“时”数据
编辑 删除




[*]显示名称:Socket_Minute标识名:Socket_Minute读写类型:可写数据类型:数值
数据范围:0 - 59分辨率:1增量:0
备注: 插座模块的定时“分”数据
编辑 删除




[*]显示名称:Socket_Timing标识名:Socket_Timing读写类型:可写数据类型:布尔值
备注: 插座模块的定时开关
编辑 删除




[*]显示名称:Lamp_Power标识名:Lamp_Power读写类型:可写数据类型:布尔值
备注: 电灯模块的电源开关
编辑 删除




[*]显示名称:Lamp_Hour标识名:Lamp_Hour读写类型:可写数据类型:数值
数据范围:0 - 23分辨率:1增量:0
备注: 电灯模块的定时“时”数据
编辑 删除




[*]显示名称:Lamp_Minute标识名:Lamp_Minute读写类型:可写数据类型:数值
数据范围:0 - 59分辨率:1增量:0
备注: 电灯模块的定时“分”数据
编辑 删除




[*]显示名称:Lamp_Timing标识名:Lamp_Timing读写类型:可写数据类型:布尔值
备注: 电灯模块的定时开关
编辑 删除




[*]显示名称:Gree_Power标识名:Gree_Power读写类型:可写数据类型:布尔值
备注: 格力空调开关
编辑 删除




[*]显示名称:Gree_Temp标识名:Gree_Temp读写类型:可写数据类型:数值
数据范围:16 - 30分辨率:1增量:16
备注: 格力空调调温数据
编辑 删除




[*]显示名称:Door_state标识名:Door_state读写类型:报警数据类型:布尔值
备注: 门的开合状态数据。
编辑 删除






风乘雪 发表于 2016-8-20 23:27:31

支持!好贴!:D:D:D:D:D:D

yeapsion 发表于 2016-8-20 23:29:55

制作过程中:

hujianqiao 发表于 2016-9-1 22:25:00

好好学习学习:)

Hegemony 发表于 2016-9-2 13:24:33

看着不错,拿来学习一下

iDea 发表于 2016-9-3 01:36:02

学习学习

午觉一下 发表于 2016-9-3 08:17:33

智能家居爱好者学习

longwugdnt 发表于 2016-9-3 13:45:17

很好,很强大

阿克 发表于 2016-9-6 11:56:48

好棒~~:)

智慧家居 发表于 2016-9-8 08:19:31

鼓励开源,共同学习

ZHW815 发表于 2016-9-8 12:51:27

很强大,支持
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【GoKit+STM32】 之智能家居云控制套件