关闭视频

机智云安卓开源框架3,实现简单智能家居系统之ESP8266控制

发表于:2021年07月08日 19:23更新于:2024年05月06日 20:26

本项目由机智云开发者分享,主要介绍了如何使用机智云开源框架开发了一个智能家居系统,具体来说实现了灯的控制、门禁的控制、温湿度的读取、有毒气体的检测、人体红外检测等功能。本项目分成三部分来叙述。

 

ESP8266接入机智云,实现验证APP的功能。本文不仅是验证APP功能,也能通过此参考案例,来了解ESP8266如何介入机智云,实现通信。其实,用机智云提供的公版APP(在应用商店搜索 机智云 即可下载),就能控制智能设备,因为机智云公版APP已经集成了云-手机-设备三端通信的功能了。但是个人有各自的使用习惯、审美,所以做了一款APP。

 

 

ESP8266原理图及外设接法

 

 

GPIO12-GPIO14用于驱动LED灯

 

GPIO16接到继电器,用于控制门禁

 

GPIO5用于温湿度传感器接口:

GPIO4和GPIO15分别用于人体红外检测和有毒气体检测。

 

 

下载工程和工程准备

 

♦ 新建一个工程和数据点

关于工程和数据点的创建在上一篇已经说明了,在此就不赘述,数据点如下:

 

生成工程

选择MCU开发->SOC方案->ESP8266硬件平台->生成代码包

 

下载工程

 

下载完成后解压

 

打开工程

使用一体化编译工具,如下所示,环境教程搭建

 

导入工程,步骤如下:

 

修改Makefile

备注:注意保存修改后的文件,CTRL + S简单粗暴。

 

编译工程

 

编译通过:

 

生成的bin文件在工程的bin目录下:

 

 

编写LED及继电器控制代码

 

♦ 新建一个hal_led.c和hal_led.h文件:

 

建立hal_led.c

 

新建hal_led.h

 

编写hal_led.h的代码

为了方便使用宏定义来设置IO的电平。

/* * hal_led.h

*

* Created on: 2019年3月16日

* Author: Yuan

*/

 

#ifndef APP_INCLUDE_DRIVER_HAL_LED_H_
#define APP_INCLUDE_DRIVER_HAL_LED_H_
#include <stdio.h>#include <c_types.h>
#include <gpio.h>#include <eagle_soc.h>

#define RGB_R  12
#define RGB_G  13
#define RGB_B  14
#define Beep  15

//LED灯的控制
#define RedOn()          GPIO_OUTPUT_SET(GPIO_ID_PIN(RGB_R),1)
#define RedOff()     GPIO_OUTPUT_SET(GPIO_ID_PIN(RGB_R),0)
#define GreenOn()     GPIO_OUTPUT_SET(GPIO_ID_PIN(RGB_G),1)
#define GreenOff()     GPIO_OUTPUT_SET(GPIO_ID_PIN(RGB_G),0)
#define BlueOn()     GPIO_OUTPUT_SET(GPIO_ID_PIN(RGB_B),1)
#define BlueOff()     GPIO_OUTPUT_SET(GPIO_ID_PIN(RGB_B),0)

//继电器控制#define RelayOn()     gpio16_output_set(0)
#define RelayOff()     gpio16_output_set(1)

//函数声明void ledgpio_init(void);
void relaygpio_init(void);
void get_motion_gas(bool *move,bool *gas);
void body_gas_gpio_init();

#endif /* APP_INCLUDE_DRIVER_HAL_LED_H_ */

 

♦ 编写hal_led.c文件

/*

* led_hal.c

*

* Created on: 2019年2月26日

* Author: Yuan

*/

#include "driver/hal_led.h"
#include "driver/hal_key.h"
#include "osapi.h"#include "eagle_soc.h"

void ICACHE_FLASH_ATTR
ledgpio_init(void)
{  
//初始化led用到的IO口设置为输出  
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);  
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);  
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);  
//默认输出为低电平,灭  
RedOff();  
GreenOff();  
BlueOff();
  
os_printf("GPIO_init_OK\n\r");
}

void ICACHE_FLASH_ATTR
body_gas_gpio_init(void)
{  
//设置GPIO15和GPIO4为输入  
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15);  
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);}//获取人体红外检测和有毒气体检测的电平
void ICACHE_FLASH_ATTRget_motion_gas(BOOL *move,BOOL *gas)
{
*move = GPIO_INPUT_GET(GPIO_ID_PIN(4));  
*gas  = GPIO_INPUT_GET(GPIO_ID_PIN(15));
}
//继电器初始化函数
void ICACHE_FLASH_ATTRrelaygpio_init(void)
{  
//设置GPIO15为输出  
gpio16_output_conf();  
//关闭继电器  
gpio16_output_set(1);
}

 

 

编写温湿度读取函数

 

温湿度读取函数是直接采用机智云官方的源码,进入

接着下载示例工程:

 

下载完成后解压,复制出想要的文件:

 

把hal_temp_hum.c放在和hal_led.c同一个目录,把hal_temp_hum.h放置在和hal_led.h同一级目录下(工程中)

如下:

 

 

设置开发版配网按键

 

从原理图可知,配网按键是GPIO0,进入user_main.c函数:

 

♦ 包含使用到文件,如温度和led的头文件

 

♦ 修改配网按键

在工程中默认是GPIO0和GPIO14两个按钮

 

现在我们只需要一个就是GPIO0,修改如下:

 

删除无用的代码:

 

修改key0按键的短按事件响应函数:

 

修改后:

 

 

调用初始化函数

 

在user_init()函数中初始化各个设备:

 

 

编写机智云事件处理函数

 

打开gizwits_product.c文件

 

添加头文件以及定时器时间间隔修改:

定位到gizwitsEventProcess函数。

 

♦ 修改数据点对应控制的函数

比如在云端:currentDataPoint.valueRed_OnOff这个点的值为真,则使ESP8266的第12引脚输出高电平(RedOn),反之输出低电平,其他的同理,修改后如下:

int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)
{    
uint8_t i = 0;    
dataPoint_t * dataPointPtr = (dataPoint_t *)data;    
moduleStatusInfo_t * wifiData = (moduleStatusInfo_t *)data;
    
if((NULL == info) || (NULL == data))    
{        
GIZWITS_LOG("!!! gizwitsEventProcess Error \n");        
return -1;    }
    
for(i = 0; i < info->num; i++)    
{        
switch(info->event[i])        
{        
case EVENT_Red_OnOff :           
currentDataPoint.valueRed_OnOff = dataPointPtr->valueRed_OnOff;            
GIZWITS_LOG("Evt: EVENT_Red_OnOff %d \n", currentDataPoint.valueRed_OnOff);            
if(0x01 == currentDataPoint.valueRed_OnOff)            
{             
 RedOn();                
//user handle            
}            
else            
{              
RedOff();                
//user handle           
}            
break;        
case EVENT_Green_OnOff :            
currentDataPoint.valueGreen_OnOff = dataPointPtr->valueGreen_OnOff;            
GIZWITS_LOG("Evt: EVENT_Green_OnOff %d \n", currentDataPoint.valueGreen_OnOff);            
if(0x01 == currentDataPoint.valueGreen_OnOff)            
{              
GreenOn();                
//user handle            
}            
else            
{             
 GreenOff();                /
/user handle            
}            
break;        
case EVENT_Blue_OnOff :            
currentDataPoint.valueBlue_OnOff = dataPointPtr->valueBlue_OnOff;            
GIZWITS_LOG("Evt: EVENT_Blue_OnOff %d \n", currentDataPoint.valueBlue_OnOff);            
if(0x01 == currentDataPoint.valueBlue_OnOff)            
{              
BlueOn();                
//user handle            
}            
else            
{              
BlueOff();                
//user handle           
 }            
break;        
case EVENT_Door_OnOff :            
currentDataPoint.valueDoor_OnOff = dataPointPtr->valueDoor_OnOff;            
GIZWITS_LOG("Evt: EVENT_Door_OnOff %d \n", currentDataPoint.valueDoor_OnOff);            
if(0x01 == currentDataPoint.valueDoor_OnOff)            
{              
RelayOn();                
//user handle            
}            
else            
{              
RelayOff();                
//user handle           
}            
break;

case WIFI_SOFTAP:            
break;        
case WIFI_AIRLINK:            
break;        
case WIFI_STATION:            
break;        
case WIFI_CON_ROUTER:            
GIZWITS_LOG("@@@@ connected router\n");
            
break;        
case WIFI_DISCON_ROUTER:            
GIZWITS_LOG("@@@@ disconnected router\n");
            
break;        
case WIFI_CON_M2M:            
GIZWITS_LOG("@@@@ connected m2m\n");      
setConnectM2MStatus(0x01);
            
break;        
case WIFI_DISCON_M2M:            
GIZWITS_LOG("@@@@ disconnected m2m\n");      
setConnectM2MStatus(0x00);
            
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 MODULE_INFO:            
GIZWITS_LOG("MODULE INFO ...\n");            
break;
        
default:            
break;        
}   
}    
system_os_post(USER_TASK_PRIO_2, SIG_UPGRADE_DATA, 0);

return 0;
}

 

 

数据上报

 

数据上报到云端使用的是userHandle函数,定时上报数据,代码如下:

void ICACHE_FLASH_ATTR userHandle(void)

{

/*

currentDataPoint.valueMove_Detection = ;//Add Sensor Data Collection

currentDataPoint.valueGas_Detection = ;//Add Sensor Data Collection

currentDataPoint.valuetemp = ;//Add Sensor Data Collection

currentDataPoint.valuehum = ;//Add Sensor Data Collection

*/

    
uint8_t ret=0;    
uint8_t curTemperature=0;    
uint8_t curHumidity=0;    
uint8_t curIr=0;    
static uint8_t thCtime=0,dection_timer=0;   
 static BOOL move=true,gas=true;  //默认为真,也就是高电平    
thCtime++;    
dection_timer++;  //定时器间隔为100ms    

/*新添加代码:温湿度传感器数据获取*/    
if(TH_TIMEOUT<thCtime)    
{        
thCtime=0;        
ret=dh11Read(&curTemperature,&curHumidity);
   
if(0==ret)        
{            
currentDataPoint.valuetemp=curTemperature;            
currentDataPoint.valuehum=curHumidity;        
}        
else        
{            
os_printf("@@@ dh11Read error! \n");        
}    
}    
get_motion_gas(&move,&gas);    
if(move == false)   //检测到电平    
{      
currentDataPoint.valueMove_Detection = true;//Add Sensor Data Collection   
 }    
else    
{      
currentDataPoint.valueMove_Detection = false;//Add Sensor Data Collection    
}    
if(gas == false)    
{      
currentDataPoint.valueGas_Detection = true;
//Add Sensor Data Collection    
}    
else    
{      
currentDataPoint.valueGas_Detection = false;
//Add Sensor Data Collection    
}
    
system_os_post(USER_TASK_PRIO_2, SIG_UPGRADE_DATA, 0);
}

支持所有的代码已经编写完成。 

 

 

下载到开发版验证

 

烧录软件:ESPFlashDownloadTool_v3.4.4,下载地址

 

下载后解压打开,步骤如下:

 

选择下载文件和地址

 

在这里特别需要注意,如下:

查看源文件生成的目录

 

烧录文件位置及说明: 

 

烧录

 

 

进入配网

 

下载完成之后对开发版进行复位。步骤如下:

♦ 按开发版的SW1按键,绿色的LED亮起,进入SOFT_AP配网模式。

♦ 手机连接到需要连接的WIFI,打开机智云软件

 

♦ 填写wifi信息

 

♦ 下一步

 

♦ 去连接ESP8266发射出来的热点,密码默认为:123456789

 

♦ 连接完成后就可以使用手机进行控制了。

注意:如果你想远程控制设备是需要登陆账号的。

 

 

机智云开发中心查看设备

 

进入机智云开发中心的项目就可以看到设备在线。

 

 

使用安卓开源框架的APP控制

 

在上一篇使用开源框架写了APP,既然ESP8266的本地数据能够上报,那么我们写APP就能够去控制这个设备啦,而且是不需要登录的哦。因为我们已经把这个APP和云端绑定了。

 

那看一下界面吧,肯定是比自动生成的美观那么一点啦。

♦ 进入APP

 

♦ 查看已联网设备

 

♦ 进入控制界面

 

♦ 控制设备