esp8266SOC方案对接机智云实现温湿度采集和四路LED开关和机智云配网失败解决方式

第一次在这里记录这些东西,有点小激动。。。此次做的这个ESP8266的机智云的SOC方案,确实废了我三天的功夫,因为对这些东西接触的不久,尤其是SOC方案的这个,所以从0到出来,我确实废了不少的周折,其次就是要记录一下这里的操作流程和踩过的坑。废话不多说,先上一张图看看效果;在这用的里插入图片描述
这里用的是某多花了7块大洋买的(这里老有人问我链接,不用想了,已经涨价啦)这款nodemcu的初衷是做lua的,闲来无事才做了个这个,SOC方案我是直接用的机智云的官方的IDE生成的代码,一开始比较懵逼,后来发现很方便的,但是学生开发者还是不推荐,不如阿多诺的好用;机智云的创建过程非常的简单,我就不多介绍了,网上有很多介绍,我也是参考着网上的大神们的教程一步一步来的,;我就把代码的修改过程贴出来吧

修改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);
}
到此为止所有代码都修改完成了

下面我要说的才是浪费了我两天没解决的事情;非常的难受;网上一般给出的烧录过程是这样的:在这里插入图片描述
但是不知道有没有朋友遇见想我一样的问题,按照这个方式下载进去就是不能配网成功,我在网上找了很多的教程,代码什么的都是大同小异,但是我就是不能配网,最后在网上发现了一个不同的烧录方式,才是成功的配网,下面我把截图贴出来,有两中方式:
一:在这里插入图片描述
先焼写机智云固件:这里我把机智云固件的地址贴出来,可以对应着自己8266的flash型号进行下载:添加链接描述
下载地址:https://www.espressif.com/sites/default/files/tools/flash_download_tools_v3.6.4.rar

这个固件下载进去之后再去下载上面的IDE生成的BIN文件,一般就会成功配网。如果实在不成功的话,可以尝试一下。(谨记最好每次下载之前最好先擦除),如果还不成功的话,还有第二种方案
在这里插入图片描述
初次之外我就是在记录一下,我用ch340的下载注意点,接线图如下所示;
RX-TX
TX-RX
电源-电源
GPIO0-GND(烧录的时候要拉低,工作的时候要拔掉)
最后在贴上一张nodemcu的GPIO图:中国加油!武汉加油!
在这里插入图片描述

发布了1 篇原创文章 · 获赞 1 · 访问量 68

猜你喜欢

转载自blog.csdn.net/zgr1379747458/article/details/104400229