收藏官网首页

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

查看数: 401674 | 评论数: 659 | 收藏 21
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-8-17 01:18

正文摘要:

replyreload += ',' + 12076; 本帖最后由 Genius 于 2016-9-2 11:30 编辑 机智云智能硬件创新大赛作品 希望大家多多支持! 项目名称:【gokit+STM32】之智能家居云控制套件 作品适用环境:适用类似于学生宿舍这种 ...

回复

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进行求余运算。对数据包命令进行分类处理的函数为:

  1. /*****************************************************
  2. * Function Name  : MessageHandle
  3. * Description    : 串口有数据发生了,先检查数据是否合法,再解析数据帧,做相应处理
  4. * Input          : None
  5. * Output         : None
  6. * Return         : None
  7. * Attention                   : None
  8. *****************************************************/
  9. void MessageHandle(void)
  10. {
  11.         Pro_HeadPartTypeDef   Recv_HeadPart;
  12.         memset(&Recv_HeadPart, 0, sizeof(Recv_HeadPart));  //初始化结构体Recv_HeadPart        memset(&UART_HandleStruct.Message_Buf, 0, sizeof(16));  //Message_Buf为数组缓冲区
  13.         if(UART_HandleStruct.Package_Flag) //接收到完成串口数据包标志位
  14.         {
  15.                
  16.         UART_HandleStruct.Message_Len = UART_HandleStruct.UART_Cmd_len + 4;       
  17.         memcpy(&UART_HandleStruct.Message_Buf, UART_HandleStruct.UART_Buf,
  18.                UART_HandleStruct.Message_Len );                       
  19.        memcpy(&Recv_HeadPart, UART_HandleStruct.Message_Buf, sizeof(Recv_HeadPart));                memset(&UART_HandleStruct.UART_Buf, 0, sizeof(UART_HandleStruct.Message_Buf));               
  20.         UART_HandleStruct.Package_Flag = 0; //完整串口数组接收标志位清零
  21.         UART_HandleStruct.UART_Count = 0;
  22.                
  23.         if(CheckSum(UART_HandleStruct.Message_Buf, UART_HandleStruct.Message_Len) !=
  24.          UART_HandleStruct.Message_Buf[UART_HandleStruct.Message_Len - 1]) //检验和
  25.                 {
  26.                         Pro_W2D_ErrorCmdHandle();  //WIFI非法通知,MCU返回
  27.                         return ;               
  28.                 }
  29.                 switch (Recv_HeadPart.Cmd)  //Cmd, 串口命令分类处理
  30.                 {
  31.                         case Pro_W2D_GetDeviceInfo_Cmd: //0x01,wifi模组请求MCU信息
  32.                                 Pro_W2D_GetMcuInfo();   //mcu返回设备信息
  33.                                 break;
  34.                         case Pro_W2D_P0_Cmd:  //0x03,wifi模块下发的控制命令
  35.                                 Pro_W2D_P0CmdHandle();                 
  36.                                 break;
  37.                         case Pro_W2D_Heartbeat_Cmd:        //0x07,WIFI模块发送的 心跳                                               
  38.                                 Pro_W2D_CommonCmdHandle();
  39.                                 printf("Pro_W2D_Heartbeat ...\r\n");       
  40.                                 break;                                               
  41.                         case Pro_W2D_ReportWifiStatus_Cmd: //0x0d,WiFi状态变化通知
  42.                                 Pro_D2W_ReportDevStatusHandle(); //返回MCU设备各个状态变量
  43.                                 break;
  44.                         case Pro_W2D_ErrorPackage_Cmd:   //0x11,非法通知
  45.                                 Pro_W2D_ErrorCmdHandle();   // WiFi发送收到非法信息通知,
  46.                                 break;
  47.                         default:
  48.                                 break;
  49.                 }       
  50.         }
  51.                
  52. }       
复制代码

给设备发送命令的处理函数:

  1. *****************************************************
  2. * Function Name  : Pro_W2D_Control_DevceHandle
  3. * Description    : WiFi 使用P0协议给设备发送命令处理函数
  4. * Input          : uint8_t *Buf:接收到的指令
  5. * Output         : None
  6. * Return         : None
  7. * Attention                   : None
  8. *****************************************************/
  9. extern uint8_t Switch_Sta;
  10. extern u8 tmp_buf[30];
  11. void Pro_W2D_Control_DevceHandle(void)
  12. {
  13.         Pro_P0_ControlTypeDef      Pro_P0_ControlStruct;  //4WiFi模组控制设备
  14.         Pro_W2D_CommonCmdHandle();
  15.         memcpy(&Pro_P0_ControlStruct, UART_HandleStruct.Message_Buf,
  16.                sizeof(Pro_P0_ControlStruct));
  17.         switch (Pro_P0_ControlStruct.Attr_Flags1)
  18.         {
  19.                 case Socket_Power: //0x01 插座开关信号
  20.                   if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x01)   //
  21.                   {tmp_buf[8]=1;}      //把单独的位信号,放入自己定义的寄存器Switch_Sta中,                        else                                                                                      {tmp_buf[8]=0;}                        
  22.                         break;                       
  23.                 case Socket_Timing:         //0x02 插座定时器开关信号                               
  24.                   if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x02)
  25.                   {tmp_buf[5]=1;}
  26.                   else
  27.                  {tmp_buf[5]=0;}
  28.                  break;
  29.                 case Lamp_Power:    //0x04 电灯开关信号
  30.                   if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x04)
  31.                   {        tmp_buf[12]=1;}
  32.                         else
  33.                         {        tmp_buf[12]=0;}
  34.                         Device_WirteStruct.Power_Switch = Switch_Sta ;
  35.                         break;
  36.                 case Lamp_Timing: //0x08  电灯定时器开关信号
  37.                   if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x08)
  38.                   {tmp_buf[9]=1;}
  39.                         else
  40.                         {tmp_buf[9]=0;}
  41.                         Device_WirteStruct.Power_Switch = Switch_Sta ;
  42.         break;
  43.                 case Gree_Power:  //0x10 格力空调开关
  44.                   if(Pro_P0_ControlStruct.Device_Wirte.Power_Switch==0x10)
  45.                   { tmp_buf[17]=1; }
  46.                         else
  47.                   { tmp_buf[17]=0;}
  48.                         Device_WirteStruct.Power_Switch = Switch_Sta ;
  49.                        
  50.                         break;/******/
  51.                        
  52.                 case Socket_Hour: //0x20 插座定时器时数据
  53.          Device_WirteStruct.Socket_Hour = Pro_P0_ControlStruct.Device_Wirte.Socket_Hour;
  54.          tmp_buf[6]=Pro_P0_ControlStruct.Device_Wirte.Socket_Hour;
  55.                         break;
  56.                case Socket_Minute: //0x40 插座定时器分数据
  57.         Device_WirteStruct.Socket_Minute = Pro_P0_ControlStruct.Device_Wirte.Socket_Minute;
  58.        tmp_buf[7]=Pro_P0_ControlStruct.Device_Wirte.Socket_Minute;
  59.                         break;
  60.                 case Lamp_Hour: //0x80  电灯定时器时数据
  61.         Device_WirteStruct.Lamp_Hour = Pro_P0_ControlStruct.Device_Wirte.Lamp_Hour;
  62.         tmp_buf[10]=Pro_P0_ControlStruct.Device_Wirte.Lamp_Hour;
  63.                         break;
  64.        
  65. /*************************添加更多可写设备*******************************/


  66. /******************************************************************/                               
  67.                 default:
  68.                         break;
  69.         }
  70.         switch (Pro_P0_ControlStruct.Attr_Flags2)
  71.         {
  72.                 case Lamp_Minute: //0x01 电灯定时器分数据
  73.                 Device_WirteStruct.Lamp_Minute = Pro_P0_ControlStruct.Device_Wirte.Lamp_Minute ;
  74.                   tmp_buf[11]=Pro_P0_ControlStruct.Device_Wirte.Lamp_Minute ;
  75.                         break;                       
  76.                 case Gree_Temp:         //0x02 格力空调温度值
  77.                Device_WirteStruct.Gree_Temp = Pro_P0_ControlStruct.Device_Wirte.Gree_Temp ;
  78.                   tmp_buf[18]=Pro_P0_ControlStruct.Device_Wirte.Gree_Temp;
  79.                         break;
  80.                 default:
  81.                         break;
  82.         }
  83.         Pro_D2W_ReportDevStatusHandle();
  84.         memset(&Pro_P0_ControlStruct, 0, sizeof(Pro_P0_ControlStruct));
  85. }
复制代码






gd333888 发表于 2024-5-1 17:25:53
看看ffffffffffffffffffffffffffffffff
ljk 发表于 2024-3-25 18:13:37

mark,鼓励开源,期待楼主跟新
npc 发表于 2024-3-21 08:32:57
支持一下
suibian丶 发表于 2024-3-5 03:55:06
感谢分享
过儿 发表于 2023-12-21 15:21:12
厉害!学习了!
过儿 发表于 2023-12-21 15:20:23
厉害!学习了!!!!!!!!!!!!!
chenwancong 发表于 2023-11-4 16:19:10
你好我想要智能家居控制套件
长青o 发表于 2023-10-29 14:54:25
怎么可以下载这个文件阿,求解
侠客 发表于 2023-6-29 00:30:51
学习一下
Cx330 发表于 2023-4-30 15:20:14
期待,希望楼主有更新与开源
zeroQAQ 发表于 2023-4-13 15:11:47
感谢分享
5430km 发表于 2023-4-7 20:41:51
向大佬看齐,向大佬学习
遗失的世界 发表于 2023-4-7 11:18:44
作者好厉害
lxyinhexi 发表于 2023-3-11 17:43:31
xuexi
xuexi
xuexile
hunan28 发表于 2023-3-10 09:52:04
工程文件的原理图能发上来吗,那个原理图太零散了 不好理解
hunan28 发表于 2023-3-10 09:30:53
好资料,学习学习了
小半 发表于 2023-3-8 15:10:36
感谢开源,共同学习
主函数 发表于 2023-1-28 14:15:57
感谢楼主,学习学习
主函数 发表于 2023-1-28 14:14:57
感谢楼主付出,学习一下
主函数 发表于 2023-1-28 14:11:13
感谢楼主,学习一下
加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

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