前言
本項目通過闡述基于ESP8266作為處理器(SoC模式開發)接入機智云,借助機智云安卓開源框架設計的APP,實現了燈的控制、門禁的控制、溫濕度的讀取、有毒氣體的檢測、人體紅外檢測等功能。
通過改造機智云開源框架,還實現了一個智能硬件系統支持多種控制方式,如:安卓APP控制、本地按鍵控制、紅外遙控控制、天貓精靈控制,且每一種操作都能和APP同步顯示。
本文是第三篇:ESP8266接入機智云,驗證APP的功能。
1.ESP8266原理圖及外設接法
GPIO12-GPIO14用于驅動LED燈
GPIO16接到繼電器,用于控制門禁
GPIO4和GPIO15分別用于人體紅外檢測和有毒氣體檢測。
2.下載工程和工程準備
在上一篇已經說明了如何去新建一個工程和數據點了,不贅述。
數據點如下:
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.編寫LED及繼電器控制代碼
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_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
接著下載示例工程:
下載完成后解壓,復制出想要的文件:
把hal_temp_hum.c放在和hal_led.c同一個目錄,把hal_temp_hum.h放置在和hal_led.h同一級目錄下(工程中)
如下:
5.設置開發版配網按鍵
從原理圖可知,配網按鍵是GPIO0
進入user_main.c函數:
5.1.包含使用到文件,如溫度和led的頭文件
5.2.修改配網按鍵
在工程中默認是GPIO0和GPIO14兩個按鈕
現在我們只需要一個就是GPIO0,修改如下:
刪除無用的代碼:
修改key0按鍵的短按事件響應函數:
修改后:
6.調用初始化函數:
在user_init()函數中初始化各個設備:
7.編寫機智云事件處理函數
打開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;
}
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=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.連接完成后就可以使用手機進行控制了。
注意:如果你想遠程控制設備是需要登陸賬號的。
11.機智云開發中心查看設備
進入機智云開發中心的項目就可以看到設備在線。
12.使用安卓開源框架的APP控制
在上一篇使用開源框架寫了APP,既然ESP8266的本地數據能夠上報,那么我們寫APP就能夠去控制這個設備啦,而且是不需要登錄的哦。因為我們已經把這個APP和云端綁定了。
那看一下界面吧,肯定是比自動生成的美觀那么一丟丟啦。哈哈哈哈
1.進入APP
2.查看已聯網設備
3.進入控制界面
4.控制設備
-
智能家居系統
+關注
關注
1文章
101瀏覽量
14297 -
ESP8266
+關注
關注
50文章
962瀏覽量
44964
發布評論請先 登錄
相關推薦
評論