| 
  
   万物互联是近几年的热点问题,在智能云家居流行时代,需要考虑到如何通过增加一些传感器让老式家居,例如电风扇、电灯等,能够连接到互联网变得更加智能和人性化的问题。本教程设计了一种基于云端的智能云家居,该系统通过Gokit3.0与机智云物联网平台的服务器互联,使用智能家居系统远程控制解决老式家居联网问题。  
   本教程介绍的智能家居系统主要采用了Gokit3微信宠物屋(WiFi+STM32F103)作为主控芯片,由数据采集系统、数据处理系统、数据云传输系统以及智能家居智能调节系统构成;即可实现互联网远程控制电器设备,通过手机App实时操控,预约定时,远程控制开关,操作简单等特点,数据安全快速等优势可以最大限度地降低家居智能化成本。  
  
  
 
   现如今,人口老龄化越来越严重,人们越来越追求居家生活的舒适性,智能家居系统能够为有老年人家庭提供更加智能化的服务,因此智能家居系统有着较为广阔的应用前景。  
     一、教学内容  
 1:APP调节氛围灯光(可配置定时) 2:APP显示室内温湿度 3:APP控制风扇(可配置定时,也可以根据温湿度阈值来自动调节) 4:APP控制电暖炉工作(可配置定时,也可以根据温湿度阈值来自动调节) 5:APP显示人体红外感应情况(可根据人体存在的情况去处理其他内容,比如当感应到人体,自动开灯,自动调温等)  
 
 二、教学硬件准备  
 1.Gokit3微信宠物屋(WiFi+STM32F103底板)基于Gokit3微信宠物屋与机智云的物联网智能家居  
  
2.LED灯,代替加热装置展示加热情况  
  
三、云端部署  
  
 
2.根据需求选择选择产品类型  
 
 
3.数据点(数据点即设备产品的功能的抽象,用于描述产品功能及其参数。创建数据点后,设备与云端通讯的数据格式即可确定,设备、机智云可以相互识别设备与机智云互联互通的数据)可在产品信息页面进行添加数据点操作  
  
比如添加温度数据点,标识必须是英文,标识是需要写进程序的,显示名称为APP默认显示的名称。读写类型,app不需要控制的为只读,app需要开关和改变的为可写。  
  
创建如下数据点  
  
详细数据点如下表:  
  
到此数据点的创建就完成了。  
 4.单片机代码生成,在产品页面点击MCU开发,按照如下图步骤生成STM32的程序代码。  
  
 
5.在线APP创建于生成,在开发者中心首页移动页面右侧点击创建,创建移动应用  
  
此处我们创建一个安卓应用为例,需要苹果应用的可以再后面打钩。用户关联可以选择不关联。  
  
关联产品  
  
其余的LOG之内的可根据自己需求上传更改。  
  
APP控制页面修改,回到我们的产品里面,选择控制页面,选择通用模板。  
  
调整APP控制页面图标  
  
 启用配网操作  
  
 配置智能场景,后期可用之产品的智能化。比如当检测到人体并且环境温度低于10℃,自动启动加热等智能场景的应用。  
  
 生成安卓证书  
  
 
构建应用  
  
等待构建完成  
  
构建成功后扫描二维码下载  
 
 
 到此云端部署完成  
 四、单片机程序修改  
 1.CubeMX配置引脚初始化,软件安装之类的可参考网上教程,下载机智云 GoKit_MCU_STM32_V03010101测试固件及开发资源,在教程附件可以获取。  
  
 2.将STM32F103C8x.ioc复制到我们云端之前下载好的自动生成代码里面。  
  
3.打开生成代码目录下的STM32F103C8x.ioc,配置加热控制输出引脚  
  
4. 配置完成以后点击generate code生成代码  
  
 5.将驱动库代码文件拷贝到自动生成代码工程中的 MCU_STM32F103C8x_source\Hal 文件夹中。  
  
6.用keil打开项目,在工程项目中添加驱动代码的“.c”文件。  
 
 7. 在代码中添加相应的函数调用,在MCU_STM32F103C8x_source\Src\main.c 和 MCU_STM32F103C8x_source\Gizwits\gizwits_product.c 文件中添加以下驱动库的头文件 - #include "delay.h"
 
 - #include "hal_motor.h"
 
 - #include "hal_rgb_led.h"
 
 - #include "hal_temp_hum.h"
 
 - #include "hal_infrared.h"
 
  复制代码 
 
 
8. 在 MCU_STM32F103C8x_source\Gizwits\gizwits_product.c 文件的 userInit( ) 函数中添加各sensor的初始化和数据点初始化。  
- void userInit(void)
 
 - {
 
 -     memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));
 
 -     /** Warning !!! DataPoint Variables Init , Must Within The Data Range **/ 
 
 -     delay_init(72); // 延时 初始化
 
 -                 rgbLedInit(); // RGB LED 初始化
 
 -                 dht11Init(); // 温湿度初始化
 
 -                 irInit(); // 红外初始化
 
 -                 motorInit(); // 电机初始化
 
 -                 motorStatus(0); // 电机转速初始化
 
 -       currentDataPoint.valueHeat = 0;
 
 -       currentDataPoint.valueInfrared = 0;
 
 -       currentDataPoint.valueMotor_Speed = 0;
 
 -       currentDataPoint.valueTemperature = 0;
 
 -       currentDataPoint.valueHumidity = 0;
 
 -       currentDataPoint.valueLED_R = 0;
 
 -       currentDataPoint.valueLED_G = 0;
 
 -       currentDataPoint.valueLED_B = 0;
 
 - }
 
  复制代码 
 
9.利用定时器做一个定时上报数据点。  
  
 
 
10.在 MCU_STM32F103C8x_source\Gizwits\gizwits_product.c 文件的 userHandle( ) 函数中添加只读型传感器数据点相关的代码。  
  
11. 在 MCU_STM32F103C8x_source\User\main.c 文件的 key2ShortPress( ) 函数与 key2LongPress( ) 函数中添加长/短按key2时的LED点亮代码  
  
12.在MCU_STM32F103C8x_source\Gizwits\gizwits_product.c 文件的 gizwitsEventProcess( ) 函数中添加可写型传感器数据点相关的代码。  
- int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
 
 - {
 
 -   uint8_t i = 0;
 
 -   dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
 
 -   moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
 
 -   protocolTime_t *ptime = (protocolTime_t *)gizdata;
 
 -   
 
 - #if MODULE_TYPE
 
 -   gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
 
 - #else
 
 -   moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
 
 - #endif
 
  
-   if((NULL == info) || (NULL == gizdata))
 
 -   {
 
 -     return -1;
 
 -   }
 
  
-   for(i=0; i<info->num; i++)
 
 -   {
 
 -     switch(info->event[i])
 
 -     {
 
 -       case EVENT_Heat:
 
 -         currentDataPoint.valueHeat = dataPointPtr->valueHeat;
 
 -         GIZWITS_LOG("Evt: EVENT_Heat %d \n", currentDataPoint.valueHeat);
 
 -         if(0x01 == currentDataPoint.valueHeat)
 
 -         {
 
 -            HAL_GPIO_WritePin(heat_GPIO_Port, heat_Pin, GPIO_PIN_RESET);//加热开
 
 -         }
 
 -         else
 
 -         {
 
 -            HAL_GPIO_WritePin(heat_GPIO_Port, heat_Pin, GPIO_PIN_SET);    //加热关
 
 -         }
 
 -         break;
 
  
-       case EVENT_Motor_Speed:
 
 -         currentDataPoint.valueMotor_Speed = dataPointPtr->valueMotor_Speed;
 
 -         GIZWITS_LOG("Evt: EVENT_Motor_Speed %d\n", currentDataPoint.valueMotor_Speed);
 
 -         switch(currentDataPoint.valueMotor_Speed)
 
 -         {
 
 -           case Motor_Speed_VALUE0:
 
 -             motorStatus(0);//关闭
 
 -             break;
 
 -           case Motor_Speed_VALUE1:
 
 -             motorStatus(1);//低速
 
 -             break;
 
 -           case Motor_Speed_VALUE2:
 
 -             motorStatus(3);//中速
 
 -             break;
 
 -           case Motor_Speed_VALUE3:
 
 -             motorStatus(5);//高速
 
 -             break;
 
 -           default:
 
 -             break;
 
 -         }
 
 -         break;
 
  
-       case EVENT_LED_R:
 
 -         currentDataPoint.valueLED_R = dataPointPtr->valueLED_R;
 
 -         GIZWITS_LOG("Evt:EVENT_LED_R %d\n",currentDataPoint.valueLED_R);
 
 -         ledRgbControl(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
 
 -         break;
 
 -       case EVENT_LED_G:
 
 -         currentDataPoint.valueLED_G = dataPointPtr->valueLED_G;
 
 -         GIZWITS_LOG("Evt:EVENT_LED_G %d\n",currentDataPoint.valueLED_G);
 
 -         ledRgbControl(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
 
 -         break;
 
 -       case EVENT_LED_B:
 
 -         currentDataPoint.valueLED_B = dataPointPtr->valueLED_B;
 
 -         GIZWITS_LOG("Evt:EVENT_LED_B %d\n",currentDataPoint.valueLED_B);
 
 -         ledRgbControl(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
 
 -         break;
 
  
 
-       case WIFI_SOFTAP:
 
 -         break;
 
 -       case WIFI_AIRLINK:
 
 -         break;
 
 -       case WIFI_STATION:
 
 -         break;
 
 -       case WIFI_CON_ROUTER:
 
 -                                 ledRgbControl(0,0,0);//连接路由器过后关闭路由器
 
 -         break;
 
 -       case WIFI_DISCON_ROUTER:
 
 -  
 
 -         break;
 
 -       case WIFI_CON_M2M:
 
 -  
 
 -         break;
 
 -       case WIFI_DISCON_M2M:
 
 -         break;
 
 -       case WIFI_RSSI:
 
 -         GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
 
 -         break;
 
 -       case TRANSPARENT_DATA:
 
 -         GIZWITS_LOG("TRANSPARENT_DATA \n");
 
 -         //user handle , Fetch data from [data] , size is [len]
 
 -         break;
 
 -       case WIFI_NTP:
 
 -         GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
 
 -         break;
 
 -       case MODULE_INFO:
 
 -             GIZWITS_LOG("MODULE INFO ...\n");
 
 -       #if MODULE_TYPE
 
 -             GIZWITS_LOG("GPRS MODULE ...\n");
 
 -             //Format By gprsInfo_t
 
 -       #else
 
 -             GIZWITS_LOG("WIF MODULE ...\n");
 
 -             //Format By moduleInfo_t
 
 -             GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
 
 -       #endif
 
 -     break;
 
 -       default:
 
 -         break;
 
 -     }
 
 -   }
 
  
-   return 0;
 
 - }
 
  复制代码 
 
  
 
  
编译代码  
  
烧录代码带开发板  
  
 
五、硬件调试  
    |