前言
本项目通过阐述基于ESP8266作为处理器(SoC模式开发)接入机智云,借助机智云安卓开源框架设计的APP,实现了灯的控制、门禁的控制、温湿度的读取、有毒气体的检测、人体红外检测等功能。
通过改造机智云开源框架,还实现了一个智能硬件系统支持多种控制方式,如:安卓APP控制、本地按键控制、红外遥控控制、天猫精灵控制,且每一种操作都能和APP同步显示。
本文是第三篇:ESP8266接入机智云,验证APP的功能。
1.ESP8266原理图及外设接法

GPIO12-GPIO14用于驱动LED灯

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

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

GPIO4和GPIO15分别用于人体红外检测和有毒气体检测。
在上一篇已经说明了如何去新建一个工程和数据点了,不赘述。
数据点如下:

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

2.3.下载工程

下载完成后解压

2.4.打开工程
使用一体化编译工具,如下所示:

环境教程搭建:https://club.gizwits.com/thread-6447-1-1.html
导入工程
步骤:



2.5.修改Makefile


备注:注意保存修改后的文件,CTRL + S简单粗暴。
2.6.编译工程

编译通过:

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

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

3.1.1建立hal_led.c

3.1.2.新建hal_led.h

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 #include #include #include
#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_ATTRledgpio_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_ATTRbody_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);}温湿度读取函数是直接采用机智云官方的源码,进入:https://download.gizwits.com/zh-cn/p/92/93
接着下载示例工程:

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

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

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

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

5.2.修改配网按键
在工程中默认是GPIO0和GPIO14两个按钮

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

删除无用的代码:


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

修改后:

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

打开gizwits_product.c文件

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

定位到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; }数据上报到云端使用的是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=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
下载地址:https://download.csdn.net/download/qq_36243942/11025638
下载后解压打开:
步骤:


选择下载文件和地址

在这里特别需要注意,如下:
查看源文件生成的目录

烧录文件位置及说明:

烧录

10.配网
下载完成之后对开发版进行复位。
步骤:
1.按开发版的SW1按键,绿色的LED亮起,进入SOFT_AP配网模式。
2.手机连接到需要连接的WIFI,打开机智云软件

2.填写wifi信息

3.下一步

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

5.连接完成后就可以使用手机进行控制了。
注意:如果你想远程控制设备是需要登陆账号的。
进入机智云开发中心的项目就可以看到设备在线。

12.使用安卓开源框架的APP控制
在上一篇使用开源框架写了APP,既然ESP8266的本地数据能够上报,那么我们写APP就能够去控制这个设备啦,而且是不需要登录的哦。因为我们已经把这个APP和云端绑定了。
那看一下界面吧,肯定是比自动生成的美观那么一丢丢啦。哈哈哈哈
1.进入APP

2.查看已联网设备

3.进入控制界面


4.控制设备


全部0条评论
快来发表一下你的评论吧 !