收藏官网首页
查看: 2378|回复: 9

[经验分享] 大神分享 : 零基础实现WiFi远程插座

26

主题

38

帖子

318

积分

中级会员

Rank: 3Rank: 3

积分
318
发表于 2018-3-15 14:49:25 | 显示全部楼层 |阅读模式
校园创客福利
本次采用esp8266 SOC方案

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

话不多说,直入正题。
云端搭建大部分请参考上一篇帖子,【体验】+0基础实现GPRS远程插座,此处我只说明其中的差异部分。
产品创建和上篇文章一样,创建如下4个数据点

进入MCU开发,选择SOC方案,ESP8266_32M,输入Product Secret,在设备基本信息里面
点击生成代码包

下载生成的代码,解压文件,打开开发环境



这样项目就导入了,双击打开根目录下面的makefile

修改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个开关的状态,接线图我会在稍后发在下面。

接线图:
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 *)¤tDataPoint, 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);
}
到此为止所有代码都修改完成了


接下来是下载到ESP8266,下载方法官网有相关帖子,搞不懂的也可以来问我·QQ1083791810交流群438373554
打开下载软件,把便已生成的4个文件按照这些设置好之后就能下载了
[size=0.83em]昨天 11:57 上传
下载附件 [size=0.83em](146.56 KB)




下载过后接上线长按按键就能配网了。


本文转载:http://www.eeboard.com/bbs/thread-99625-1-1.html


0

主题

4

帖子

78

积分

注册会员

Rank: 2

积分
78
发表于 2018-3-19 15:35:34 | 显示全部楼层
谢谢楼主了,正准备用这个方法做一个十路的智能开关

1

主题

24

帖子

503

积分

高级会员

Rank: 4

积分
503
发表于 2018-4-22 15:30:01 | 显示全部楼层
APP里打开了开关,如果用按键关上了,APP里不会显示开关状态。

0

主题

35

帖子

338

积分

中级会员

Rank: 3Rank: 3

积分
338
发表于 2018-5-15 21:23:50 | 显示全部楼层
谢谢了,正在想弄状态反馈呢

1

主题

22

帖子

520

积分

高级会员

Rank: 4

积分
520
发表于 2018-5-31 14:26:47 | 显示全部楼层
免费使用STM32、APP自动代码生成工具
马云家找用的是什么情况==小黑板不理解啊,哈哈

2

主题

14

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
发表于 2018-6-11 22:49:38 | 显示全部楼层
上电瞬间GPIO15会输出低电平,会触发继电器一次,其他都正常,怎么修改

0

主题

2

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2018-6-15 18:07:54 | 显示全部楼层
能下载原程序吗?

0

主题

2

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2018-6-15 18:12:28 | 显示全部楼层
好像有错! STA[4]=!STA[4]; 应该是从0开始,STA[4]没有定义的.

12

主题

101

帖子

1179

积分

金牌会员

Rank: 6Rank: 6

积分
1179
发表于 2018-7-23 10:04:10 | 显示全部楼层
免费使用STM32、APP自动代码生成工具
HSGhxq 发表于 2018-6-11 22:49
上电瞬间GPIO15会输出低电平,会触发继电器一次,其他都正常,怎么修改

看看userInit函数里的初始值是多少,符合不符合你的要求与预期。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

© 2011-2017 Gizwits ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表