0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开发者作品:一款智能家居系统,实现了 4 种控制方式(三)

机智云 2022-05-19 17:16 次阅读

前言

本项目通过阐述基于ESP8266作为处理器(SoC模式开发)接入机智云,借助机智云安卓开源框架设计的APP,实现了灯的控制、门禁的控制、温湿度的读取、有毒气体的检测、人体红外检测等功能

通过改造机智云开源框架,还实现了一个智能硬件系统支持多种控制方式,如:安卓APP控制、本地按键控制、红外遥控控制、天猫精灵控制,且每一种操作都能和APP同步显示。

本文是第三篇:ESP8266接入机智云,验证APP的功能。


1.ESP8266原理图及外设接法

c96b258a-d214-11ec-8521-dac502259ad0.png

GPIO12-GPIO14用于驱动LED

c9854884-d214-11ec-8521-dac502259ad0.png

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

c9abad08-d214-11ec-8521-dac502259ad0.png

GPIO5用于温湿度传感器接口

c9c5be32-d214-11ec-8521-dac502259ad0.png

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


2.下载工程和工程准备

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

数据点如下:

c9ddeda4-d214-11ec-8521-dac502259ad0.png

2.2.生成工程

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

ca353ec4-d214-11ec-8521-dac502259ad0.png

2.3.下载工程

cab5af50-d214-11ec-8521-dac502259ad0.png

下载完成后解压

cace7558-d214-11ec-8521-dac502259ad0.png

2.4.打开工程

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

cafb48bc-d214-11ec-8521-dac502259ad0.png

环境教程搭建:https://club.gizwits.com/thread-6447-1-1.html

导入工程

步骤:

cb13bc30-d214-11ec-8521-dac502259ad0.png

cb215304-d214-11ec-8521-dac502259ad0.png

cb2ecce6-d214-11ec-8521-dac502259ad0.png

2.5.修改Makefile

cb7b6f60-d214-11ec-8521-dac502259ad0.png

cb962b5c-d214-11ec-8521-dac502259ad0.png

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

2.6.编译工程

cbe59c6e-d214-11ec-8521-dac502259ad0.png

编译通过:

cc124d0e-d214-11ec-8521-dac502259ad0.png

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

cc4359bc-d214-11ec-8521-dac502259ad0.png


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

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

cc518000-d214-11ec-8521-dac502259ad0.png

3.1.1建立hal_led.c

cc6d6568-d214-11ec-8521-dac502259ad0.png

3.1.2.新建hal_led.h

cce3f9e4-d214-11ec-8521-dac502259ad0.png

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

接着下载示例工程:

cd234950-d214-11ec-8521-dac502259ad0.png

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

cd3fdf3e-d214-11ec-8521-dac502259ad0.png

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

如下:

cd570c68-d214-11ec-8521-dac502259ad0.png


5.设置开发版配网按键

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

进入user_main.c函数:

cd8393a0-d214-11ec-8521-dac502259ad0.png

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

cdb5c302-d214-11ec-8521-dac502259ad0.png

5.2.修改配网按键

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

cdcf1672-d214-11ec-8521-dac502259ad0.png

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

cdff0b20-d214-11ec-8521-dac502259ad0.png

删除无用的代码:

ce150862-d214-11ec-8521-dac502259ad0.png

ce2c5652-d214-11ec-8521-dac502259ad0.png

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

ce59830c-d214-11ec-8521-dac502259ad0.png

修改后:

cea591fc-d214-11ec-8521-dac502259ad0.png


6.调用初始化函数:

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

ced7e80a-d214-11ec-8521-dac502259ad0.png


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

打开gizwits_product.c文件

cf26b458-d214-11ec-8521-dac502259ad0.png

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

cf3564c6-d214-11ec-8521-dac502259ad0.png

定位到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

下载后解压打开:

步骤:

cf469e4e-d214-11ec-8521-dac502259ad0.png

cf559458-d214-11ec-8521-dac502259ad0.png

选择下载文件和地址

cfa0c32e-d214-11ec-8521-dac502259ad0.png

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

查看源文件生成的目录

cfc6c236-d214-11ec-8521-dac502259ad0.png

烧录文件位置及说明:

cfe3cbc4-d214-11ec-8521-dac502259ad0.png

烧录

d014d6b0-d214-11ec-8521-dac502259ad0.png


10.配网

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

步骤:

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

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

d03c84d0-d214-11ec-8521-dac502259ad0.png

2.填写wifi信息

d06d1438-d214-11ec-8521-dac502259ad0.png

3.下一步

d0a4ad62-d214-11ec-8521-dac502259ad0.png

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

d0c0f508-d214-11ec-8521-dac502259ad0.png

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

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


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

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

d15fc78c-d214-11ec-8521-dac502259ad0.png

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

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

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

1.进入APP

d192aefe-d214-11ec-8521-dac502259ad0.png

2.查看已联网设备

d1db2d1e-d214-11ec-8521-dac502259ad0.png

3.进入控制界面

d1fc34f0-d214-11ec-8521-dac502259ad0.png

d224895a-d214-11ec-8521-dac502259ad0.png

4.控制设备

d243356c-d214-11ec-8521-dac502259ad0.png

d26a49f4-d214-11ec-8521-dac502259ad0.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 智能家居系统

    关注

    1

    文章

    101

    浏览量

    14280
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44816
收藏 人收藏

    评论

    相关推荐

    基于语音识别技术的智能家居控制系统

    于语音识别的智能控制系统智能家居的重要组成部分,相比传统的遥控或触控方式,基于语音识别控制智能家居
    的头像 发表于 11-19 17:25 220次阅读
    基于语音识别技术的<b class='flag-5'>智能家居</b><b class='flag-5'>控制系统</b>

    简述三种esp32的开发方式是什么

    ESP32是一款由乐鑫(Espressif)推出的低功耗、高性能的Wi-Fi和蓝牙双模无线通信芯片,广泛应用于物联网、智能家居智能硬件等领域。本文将详细介绍三种ESP32的
    的头像 发表于 08-20 09:11 2109次阅读

    智能家居控制系统如何设计

    智能家居控制系统设计是个复杂而细致的过程,它涉及到多个方面的考虑,包括需求分析、设备选型、系统架构设计、网络安全、用户交互以及后期维护等。以下是对
    的头像 发表于 07-23 14:45 1194次阅读

    智能家居控制方式有哪些

    智能家居控制方式多种多样,这些方式不仅提升了家居生活的便捷性,还使得家居环境更加
    的头像 发表于 07-23 14:30 999次阅读

    智能家居照明控制系统功能特点与应用

    随着科技的飞速发展,智能家居已成为现代家庭不可或缺的部分。其中,智能家居照明控制系统以其独特的优势,正在逐步改变我们传统的生活方式,使家庭
    的头像 发表于 07-08 16:13 375次阅读

    智能家居灯光控制系统功能特点

    智能照明是可以实现自动控制的先进照明方式智能家居灯光控制系统是现代
    的头像 发表于 04-25 16:21 1111次阅读

    OpenHarmony南向开发案例:【 智能家居中控】

    今天打造的这一款全新智能家庭控制系统,凸显应用在智能控制和用户体验的特点,开创国内智能家居
    的头像 发表于 04-23 15:50 938次阅读
    OpenHarmony南向<b class='flag-5'>开发</b>案例:【 <b class='flag-5'>智能家居</b>中控】

    智能家居控制系统解决方案功能

    化的居住环境。 所谓的智能家居控制系统解决方案,不再仅仅是传统的家具,而是被赋予“思想”,变得智能化。该方案依托物联网云平台,实现照明
    的头像 发表于 04-09 15:58 591次阅读

    东胜物联携多款智能网关亮相瑞芯微RK开发者大会

    东胜物联基于瑞芯微芯片的智能网关产品在RK开发者大会的智能家居区域进行展出。
    的头像 发表于 03-15 10:17 887次阅读
    东胜物联携多款<b class='flag-5'>智能</b>网关亮相瑞芯微RK<b class='flag-5'>开发者</b>大会

    智能家居控制方案功能与应用

    是以物联网作为核心技术支撑,利用网络通信手段,实现对住宅中各种设备与建筑设施进行自动控制与管理。集成开发智能家居控制方案,快速启动、多种人机
    的头像 发表于 02-29 16:18 696次阅读

    集中电源控制器在智能家居中的应用

    集中电源控制器在智能家居中也有广泛的应用。随着智能家居的普及,各种家电设备、照明系统、安防系统等都需要电源支持,而集中电源
    的头像 发表于 01-30 15:05 707次阅读
    集中电源<b class='flag-5'>控制</b>器在<b class='flag-5'>智能家居</b>中的应用

    Python智能家居系统代码介绍

    Python智能家居系统一种基于Python编程语言开发智能家居控制系统,在现代家庭中得到了
    的头像 发表于 01-25 09:46 1253次阅读

    智能家居控制系统原理与应用

    智能家居控制系统是指利用先进的计算机科学和通信技术,将各种家居设备和系统进行连接和集成,实现智能
    的头像 发表于 01-10 11:44 2675次阅读

    开源项目!教你如何复刻自平衡赛车机器人、智能家居中控、竞技机器人先进模糊控制器等

    三种不同的操控方式 经常翻车的朋友们都知道,能在翻车后快速摆正车身的车才是好车。 就像动画《四驱兄弟》中展现的那样,在比赛中需要跟着赛车起跑圈,而且赛车如果被撞翻还需要重新用手扶正
    发表于 12-26 09:17

    欢迎加入飞腾派开发者社区,感谢每开发者

    发烧友论坛起策划了飞腾派开发板测评活动,受到了广大开发者的喜爱。 通过这次活动,飞腾派成功地吸引众多高质量开发者的关注和参与,进
    发表于 12-11 16:11