查看: 8399|回复: 11

【体验】+0基础实现WiFi远程插座

  [复制链接]
  • TA的每日心情

    2018-7-12 13:58
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2018-3-14 12:01:43 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 冯俊波 于 2018-3-14 12:01 编辑

    本次采用ESP8266 SOC方案

    材料准备
    1.4个微动开关(用于配网和本地开关插座)
    2.8266一块(可以去马云家用找现成的,比如小黑板)
    3.1个4位继电器(用于4路控制)
    4.能上网的无线路由器一台(2.4G频段wifi,不支持5G频段)
    5.IDE环境搭建可以去官网看,不懂的地方可以问我

    话不多说,直入正题。
    云端搭建大部分请参考上一篇帖子,【体验】+0基础实现GPRS远程插座,此处我只说明其中的差异部分。
    产品创建和上篇文章一样,创建如下4个数据点
    1.jpg
    进入MCU开发,选择SOC方案,ESP8266_32M,输入Product Secret,在设备基本信息里面
    点击生成代码包
    2.jpg
    下载生成的代码,解压文件,打开开发环境
    3.png
    4.jpg
    5.png
    这样项目就导入了,双击打开根目录下面的makefile
    6.jpg
    修改23排开始代码:
    BOOT?=none
    APP?=0
    SPI_SPEED?=40
    SPI_MODE?=QIO
    SPI_SIZE_MAP?=0
    修改为:
    BOOT?=new
    APP?=1
    SPI_SPEED?=40
    SPI_MODE?=QIO
    SPI_SIZE_MAP?=6
    保存并关闭Makefile,记住一定要是根目录下面的Makefile。
    打开APP目录下面的user,找到main函数并打开,在APP目录下找到gizwits目录,然后gizwits_product.c和gizwits_product.h,打开着3个文件之后我们一个一个的来修改,由于要上报数据,一会儿我们需要创建一个布尔数组存放4个开关的状态,接线图我会在稍后发在下面。
    7.jpg
    接线图:
    4个按键分别接在:
    GPIO2  GPIO0  GPIO4  GPIO5
    4个继电器分别接在:
    GPIO15 GPIO13 GPIO12 GPIO14
    接下来我们先修改gizwits_product.h
    在头文件下面新增,然后保存数据
    #define ON                 1#define OFF                 0
    extern bool STA[4];
    修改gizwits_product.c
    在头文件下面新增
    bool STA[4]={0}; //用于存储状态
    然后往下面gizwitsEventProcess函数
    修改里面的数据点内容部分,
    switch(info->event)
            {
            case EVENT_sw1 :
                currentDataPoint.valuesw1 = dataPointPtr->valuesw1;
                GIZWITS_LOG("Evt: EVENT_sw1 %d \n", currentDataPoint.valuesw1);
                if(0x01 == currentDataPoint.valuesw1)
                {
                        STA[0]= ON; //user handle
                }
                else
                {
                        STA[0]= OFF;//user handle
                }
                break;
            case EVENT_sw2 :
                currentDataPoint.valuesw2 = dataPointPtr->valuesw2;
                GIZWITS_LOG("Evt: EVENT_sw2 %d \n", currentDataPoint.valuesw2);
                if(0x01 == currentDataPoint.valuesw2)
                {
                        STA[1]= ON;//user handle
                }
                else
                {
                        STA[1]= OFF; //user handle
                }
                break;
            case EVENT_sw3 :
                currentDataPoint.valuesw3 = dataPointPtr->valuesw3;
                GIZWITS_LOG("Evt: EVENT_sw3 %d \n", currentDataPoint.valuesw3);
                if(0x01 == currentDataPoint.valuesw3)
                {
                        STA[2]= ON;//user handle
                }
                else
                {
                        STA[2]= OFF;//user handle
                }
                break;
            case EVENT_sw4 :
                currentDataPoint.valuesw4 = dataPointPtr->valuesw4;
                GIZWITS_LOG("Evt: EVENT_sw4 %d \n", currentDataPoint.valuesw4);
                if(0x01 == currentDataPoint.valuesw4)
                {
                        STA[3]= ON;//user handle
                }
                else
                {
                        STA[3]= OFF;//user handle
                }
                break;
    找到void ICACHE_FLASH_ATTR userInit(void)函数
    修改内容为:
    void ICACHE_FLASH_ATTR userInit(void)
    {
        gizMemset((uint8_t *)&currentDataPoint, 0, sizeof(dataPoint_t));
            /** Warning !!! DataPoint Variables Init , Must Within The Data Range **/
            currentDataPoint.valuesw1 = STA[0];
            currentDataPoint.valuesw2 = STA[1];
            currentDataPoint.valuesw3 = STA[2];
            currentDataPoint.valuesw4 = STA[3];
    }
    找到void ICACHE_FLASH_ATTR userHandle(void)函数,修改其内容为:
    void ICACHE_FLASH_ATTR userHandle(void)
    {
            GPIO_OUTPUT_SET(GPIO_ID_PIN(12), !STA[0]);
            GPIO_OUTPUT_SET(GPIO_ID_PIN(13), !STA[1]);
            GPIO_OUTPUT_SET(GPIO_ID_PIN(14), !STA[2]);
            GPIO_OUTPUT_SET(GPIO_ID_PIN(15), !STA[3]);
            currentDataPoint.valuesw1 = STA[0];
            currentDataPoint.valuesw2 = STA[1];
            currentDataPoint.valuesw3 = STA[2];
            currentDataPoint.valuesw4 = STA[3];
        system_os_post(USER_TASK_PRIO_2, SIG_UPGRADE_DATA, 0);
    }
    到此为止云端数据就处理完成了,接下来修改main函数:首先是修改按键,其次是初始化,
    4个按键功能为:短按分别控制4个继电器取反,并上报云端,实时显示开关状态,所有按键长按都进入SOFTAP配网模式,也就是热点模式。你也可以设置成2个按键SOFTAP,2个按键AIRLINK。
    修改下面函数内容:
    #define GPIO_KEY_NUM                            2                           ///< Defines the total number of key members
    #define KEY_0_IO_MUX                            PERIPHS_IO_MUX_GPIO0_U      ///< ESP8266 GPIO function
    #define KEY_0_IO_NUM                            0                           ///< ESP8266 GPIO number
    #define KEY_0_IO_FUNC                           FUNC_GPIO0                  ///< ESP8266 GPIO name
    #define KEY_1_IO_MUX                            PERIPHS_IO_MUX_MTMS_U       ///< ESP8266 GPIO function
    #define KEY_1_IO_NUM                            14                          ///< ESP8266 GPIO number
    #define KEY_1_IO_FUNC                           FUNC_GPIO14                 ///< ESP8266 GPIO name
    改为:
    #define GPIO_KEY_NUM                            4                           ///< Defines the total number of key members
    #define KEY_0_IO_MUX                            PERIPHS_IO_MUX_GPIO2_U      ///< ESP8266 GPIO function
    #define KEY_0_IO_NUM                            2                           ///< ESP8266 GPIO number
    #define KEY_0_IO_FUNC                           FUNC_GPIO2                  ///< ESP8266 GPIO name
    #define KEY_1_IO_MUX                            PERIPHS_IO_MUX_GPIO0_U       ///< ESP8266 GPIO function
    #define KEY_1_IO_NUM                            0                          ///< ESP8266 GPIO number
    #define KEY_1_IO_FUNC                           FUNC_GPIO0                 ///< ESP8266 GPIO name
    #define KEY_2_IO_MUX                            PERIPHS_IO_MUX_GPIO4_U      ///< ESP8266 GPIO function
    #define KEY_2_IO_NUM                            4                           ///< ESP8266 GPIO number
    #define KEY_2_IO_FUNC                           FUNC_GPIO4                  ///< ESP8266 GPIO name
    #define KEY_3_IO_MUX                            PERIPHS_IO_MUX_GPIO5_U       ///< ESP8266 GPIO function
    #define KEY_3_IO_NUM                            5                          ///< ESP8266 GPIO number
    #define KEY_3_IO_FUNC                           FUNC_GPIO5                 ///< ESP8266 GPIO name

    找到2个长短按键处理函数

    /**
    * Key1 key short press processing
    * @param none
    * @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key1ShortPress(void)
    {
        GIZWITS_LOG("#### KEY1 short press ,Production Mode\n");
       
        gizwitsSetMode(WIFI_PRODUCTION_TEST);
    }


    /**
    * Key1 key presses a long press
    * @param none
    * @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key1LongPress(void)
    {
        GIZWITS_LOG("#### key1 long press, default setup\n");
       
        gizwitsSetMode(WIFI_RESET_MODE);
    }


    /**
    * Key2 key to short press processing
    * @param none
    * @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key2ShortPress(void)
    {
        GIZWITS_LOG("#### key2 short press, soft ap mode \n");


        gizwitsSetMode(WIFI_SOFTAP_MODE);
    }


    /**
    * Key2 button long press
    * @param none
    * @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key2LongPress(void)
    {
        GIZWITS_LOG("#### key2 long press, airlink mode\n");
       
        gizwitsSetMode(WIFI_AIRLINK_MODE);
    }

    修改成:

    /*key1按键短按处理*/
    LOCAL void ICACHE_FLASH_ATTR key1ShortPress(void)
    {
            STA[1]=!STA[1];
    }
    /*key1按键长按处理*/
    LOCAL void ICACHE_FLASH_ATTR key1LongPress(void)
    {
            gizwitsSetMode(WIFI_SOFTAP_MODE);
    }
    /*key2按键短按处理*/
    LOCAL void ICACHE_FLASH_ATTR key2ShortPress(void)
    {
            STA[2]=!STA[2];
    }
    /* key2按键长按处理*/
    LOCAL void ICACHE_FLASH_ATTR key2LongPress(void)
    {
            gizwitsSetMode(WIFI_SOFTAP_MODE);
    }
    /*key3按键短按处理*/
    LOCAL void ICACHE_FLASH_ATTR key3ShortPress(void)
    {
            STA[3]=!STA[3];
    }
    /*key3按键长按处理*/
    LOCAL void ICACHE_FLASH_ATTR key3LongPress(void)
    {
            gizwitsSetMode(WIFI_SOFTAP_MODE);
    }
    //key4按键短按处理*
    LOCAL void ICACHE_FLASH_ATTR key4ShortPress(void)
    {
            STA[4]=!STA[4];
    }
    //key4按键长按处理*
    LOCAL void ICACHE_FLASH_ATTR key4LongPress(void)
    {
            gizwitsSetMode(WIFI_SOFTAP_MODE);
    }
    然后对按键和继电器的GPIO进行初始化,修改在LOCAL void ICACHE_FLASH_ATTR keyInit(void)函数位:
    LOCAL void ICACHE_FLASH_ATTR keyInit(void)
    {
        singleKey[0] = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC,
                                    key1LongPress, key1ShortPress);
        singleKey[1] = keyInitOne(KEY_1_IO_NUM, KEY_1_IO_MUX, KEY_1_IO_FUNC,
                                    key2LongPress, key2ShortPress);
        singleKey[2] = keyInitOne(KEY_2_IO_NUM, KEY_2_IO_MUX, KEY_2_IO_FUNC,
                                                                key3LongPress, key3ShortPress);
        singleKey[3] = keyInitOne(KEY_3_IO_NUM, KEY_3_IO_MUX, KEY_3_IO_FUNC,
                                                                key4LongPress, key4ShortPress);   
        keys.singleKey = singleKey;
        keyParaInit(&keys);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
    }
    到此为止所有代码都修改完成了
    8.png
    9.jpg
    接下来是下载到ESP8266,下载方法官网有相关帖子,搞不懂的也可以来问我·QQ1083791810交流群438373554
    打开下载软件,把便已生成的4个文件按照这些设置好之后就能下载了
    99.jpg
    下载过后接上线长按按键就能配网了。
    SoC_ESP8266.7z (7.69 MB, 下载次数: 1014)
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-8-9 00:29
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2018-3-14 12:20:18 | 显示全部楼层
    很不错,萌新虫虫前来学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-10-1 12:54
  • 签到天数: 313 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2018-3-14 15:53:55 | 显示全部楼层
    本帖最后由 可乐丸子 于 2018-3-14 16:23 编辑

    你这个是定长还是变长WiFI?试过ESP-01吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-7-12 13:58
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

     楼主| 发表于 2018-3-15 09:17:33 | 显示全部楼层
    可乐丸子 发表于 2018-3-14 15:53
    你这个是定长还是变长WiFI?试过ESP-01吗

    数据传输方式使用定长或者变长,定长就是每次上传数据需要把所有的数据点上传,变长就是可以一次只上传部分数据点,数据量大或者通讯频繁为了节约流量可以选变长,数据量不大可以选定长,然而只有GSM才回去考虑定长,因为物联网卡流量有限,wifi直接选变长即可。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-7-12 13:58
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

     楼主| 发表于 2018-3-15 09:20:41 | 显示全部楼层
    可乐丸子 发表于 2018-3-14 15:53
    你这个是定长还是变长WiFI?试过ESP-01吗

    至于ESP-01下载的时候选择8M的,生成代码的时候选8M
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-16 10:25
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-3-15 09:56:01 | 显示全部楼层
    好教程 学习学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-16 10:27
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-3-15 13:08:38 | 显示全部楼层
    好教程,详细,收藏
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-16 10:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-3-15 14:01:49 | 显示全部楼层
    谢谢楼主的分享,很实用
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    1521167670
  • 签到天数: 1 天

    连续签到: 1 天

    发表于 2018-3-15 14:05:33 | 显示全部楼层
    写得仔细,很好一看就懂
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-10-1 12:54
  • 签到天数: 313 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2018-3-16 11:44:33 | 显示全部楼层
    可以加个定时打开、定时关闭、延时关闭功能
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|电路城

    GMT+8, 2021-6-24 14:29 , Processed in 0.152195 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.