目录

1.ESP8266原理图及外设接法

2.下载工程和工程准备

3.编写LED及继电器控制代码

4.编写温湿度读取函数

5.设置开发版配网按键

6.调用初始化函数:

7.编写机智云事件处理函数

8.数据上报

9.下载到开发版验证

10.配网

11.机智云开发中心查看设备

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

源代码:


 简介:

这一篇博客是接着上一篇往下写的,地址:

当然也可以不需要自己开发安卓APP,这篇博客同样也能适用于APP对ESP8266的外设控制,因为机智云通用APP已经集成了和手机通信的功能了。

这个工程实现的功能有:灯的控制,门禁的控制,温湿度读取,人体红外检测,有毒气体检测、


1.ESP8266原理图及外设接法

智能家居ios安卓ble控制 安卓智能家居控制系统_#define

  • GPIO12-GPIO14用于驱动LED灯

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_02

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

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_03

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_04

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


2.下载工程和工程准备

在上一篇已经说明了如何去新建一个工程和数据点了,不赘述。

数据点如下:

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_05

2.生成工程

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_06

3.下载工程

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_07

下载完成后解压

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_08

4.打开工程

  • 使用一体化编译工具,如下所示:

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_09

环境搭建教程:点我查看

  • 导入工程

步骤:

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_10

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_11

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_12

5.修改Makefile

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_13

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_14

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

6.编译工程

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_15

编译通过:

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_16

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

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_17


3.编写LED及继电器控制代码

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

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_18

1.建立hal_led.c

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_19

2.新建hal_led.h

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_20

3.2.编写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_ */

3.3.编写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_ATTR
get_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_ATTR
relaygpio_init(void)
{
	//设置GPIO15为输出
	gpio16_output_conf();
	//关闭继电器
	gpio16_output_set(1);
}

4.编写温湿度读取函数

温湿度读取函数是直接采用机智云官方的源码,进入:https://download.gizwits.com/zh-cn/p/92/93

接着下载示例工程:

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_21

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_22

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

如下:

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_23


5.设置开发版配网按键

从原理图可知,配网按键是GPIO0

进入user_main.c函数:

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_24

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_25

5.2.修改配网按键

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

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_26

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

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_27

删除无用的代码:

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_28

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_29

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_30

修改后:

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_31


6.调用初始化函数:

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_32


7.编写机智云事件处理函数

打开gizwits_product.c文件

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_33

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_34

定位到gizwitsEventProcess函数。

7.1.修改数据点对应控制的函数

比如在云端: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; 
}

8.数据上报

数据上报到云端使用的是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);
}

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


9.下载到开发版验证

烧录软件:ESPFlashDownloadTool_v3.4.4

下载地址:

下载后解压打开:

步骤:

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_35

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_36

选择下载文件和地址

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_37

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

查看源文件生成的目录

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_38

烧录文件位置及说明: 

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_39

 

烧录

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_40


10.配网

下载完成之后对开发版进行复位。

步骤:

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

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_41

2.填写wifi信息

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_42

3.下一步

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_43

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

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_44

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

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_45

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


11.机智云开发中心查看设备

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

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_46


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

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

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

1.进入APP

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_47

2.查看已联网设备

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_48

3.进入控制界面

智能家居ios安卓ble控制 安卓智能家居控制系统_Data_49

智能家居ios安卓ble控制 安卓智能家居控制系统_#include_50

4.控制设备

智能家居ios安卓ble控制 安卓智能家居控制系统_#define_51

智能家居ios安卓ble控制 安卓智能家居控制系统_智能家居ios安卓ble控制_52