ESP8266 NodeMcu機智雲SOC方案控制4路繼電器+DHT11溫溼度上報

一、實現功能

該方案可以實現物理按鍵KEY和遠程APP同步控制四路LED,其中KEY1長按進入SOFTAP模式,KEY1短按控制LED1,KEY2長按進入AIRLINK模式,KEY2短按控制LED2,KEY3短按控制LED3,KEY4短按控制LED4。GPIO5端口用於讀取DHT11溫溼度傳感器的值(這裏有個坑需要跟大家講下)。(原計劃通過長按KEY3控制LED全開,長按KEY4控制LED全關,嘗試了很多辦法會出錯,如果找到比較穩定的好辦法會給大家分享。LED本來是4路繼電器,還沒到所以就湊合下,反正原理都一樣,哈哈)

二、電路圖

1、電路原理圖

在這裏插入圖片描述

2.實物連接圖

在這裏插入圖片描述

三、數據點及代碼修改

1.數據點

LED_1		LED_2		LED_3		LED_4
數據點1 LED_1
數據點2 LED_2
數據點3 LED_3
數據點4 LED_4
數據點5 temperature
數據點6 humidity
下面是大家喜聞樂見的乾貨部分,哈哈。

首先是把DHT11的驅動配置好
hal_temp_hum.h放到/app/include/driver文件夾內
hal_temp_hum.c放到/app/driver文件夾內
沒有這個驅動文件可以到機智雲下載中心,找到GoKit MCU示例工程,在對應的文件夾內有相應的驅動文件。

2.代碼修改

(1)gizwits_protocol.h

在這裏插入圖片描述
如果有朋友懶得改程序,想直接看到效果,最簡單的辦法就是數據點和我上面的設置的一樣,然後直接改上面覆蓋的兩個地方,我的程序會給大家鏈接,可供參考。但是不建議這麼做,這不利於理解程序的功能,運行機制。

(2)gizwits_protocol.h

下面紅框中的值最好改成100或者50,不改的話控制延時有1s,我感覺延時太大挺彆扭的。
在這裏插入圖片描述

(3)gizwits_product.h

定義一個數組用於儲存4個LED的狀態
extern bool statu[4];
在這裏插入圖片描述

(4)gizwits_product.c

首先加入DHT11的頭文件(userhand()需要調用),然後是定義的數組statu[4]初始化
#include “driver/hal_temp_hum.h”
bool statu[4] = {0};
LED狀態掃描、DHT11數值讀取 定義掃描、讀取時間間隔
#define USER_TIME_MS 100
#define LED_TIMEOUT (100/USER_TIME_MS 100) // LED狀態掃描,100ms掃描一次
#define DHT_TIMEOUT (1000/USER_TIME_MS 100) // DHT11數值讀取,1s掃描一次
(掃描、讀取其實是一個意思,可能用詞不準,見諒)
在這裏插入圖片描述
改gizwitsEventProcess()程序
先說下數組statu[ ]和LED數據點的對應關係
statu[0]=LED_1
statu[1]=LED_2
statu[2]=LED_3
statu[3]=LED_4
也就是說statu[0]=1是LED_1就開
以下面gizwitsEventProcess()裏的程序爲例
case EVENT_LED_1 : //LED_1爲數據點
currentDataPoint.valueLED_1 = dataPointPtr->valueLED_1;
GIZWITS_LOG(“Evt: EVENT_LED_1 %d \n”, currentDataPoint.valueLED_1);
if(0x01 == currentDataPoint.valueLED_1)
{
statu[0]=1;// 開燈
}
else
{
statu[0]=0;//關燈
}
break;
以此類推

數據點LED_1
在這裏插入圖片描述
數據點LED_4
在這裏插入圖片描述
由於程序太長,數據點LED_2、LED_3就不截圖了。

最後改userHandle()程序
首先添加以下代碼,這裏的代碼是將軟件世界和硬件世界連接的橋樑,將ESP8266的引腳和數組statu[ ]關聯,數組statu[ ]就是這個橋。個人理解,不喜勿噴,哈哈。
GPIO_OUTPUT_SET(GPIO_ID_PIN(14),!statu[0]);
GPIO_OUTPUT_SET(GPIO_ID_PIN(12),!statu[1]);
GPIO_OUTPUT_SET(GPIO_ID_PIN(13),!statu[2]);
GPIO_OUTPUT_SET(GPIO_ID_PIN(15),!statu[3]);
在這裏插入圖片描述

實現定時LED狀態掃描、DHT11數值讀取
下面的是C語言基礎,應該比較容易看懂
uint8_t ret=0;
uint8_t curTemperature=0;
uint8_t curHumidity=0;
static uint8_t dhttime=0;
static uint8_t ledtime=0;
dhttime++;
ledtime++;
if(DHT_TIMEOUT<dhttime)
{
dhttime=0;
ret=dh11Read(&curTemperature,&curHumidity);
if(0==ret)
{
currentDataPoint.valuetemperature=curTemperature;
currentDataPoint.valuehumidity=curHumidity;
}
else
{
os_printf("@@@ dh11Read error! \n");
}
}
if(LED_TIMEOUT<ledtime)
{
ledtime=0;
currentDataPoint.valueLED_1=statu[0];
currentDataPoint.valueLED_2=statu[1];
currentDataPoint.valueLED_3=statu[2];
currentDataPoint.valueLED_4=statu[3];
}
在這裏插入圖片描述
在這裏插入圖片描述
最後就是數據點的初始化程序userInit()
這個會自動生成,把註釋去掉,把值都改爲0
currentDataPoint.valueLED_1 = 0;
currentDataPoint.valueLED_2 = 0;
currentDataPoint.valueLED_3 = 0;
currentDataPoint.valueLED_4 = 0;
currentDataPoint.valuetemperature = 0;
currentDataPoint.valuehumidity = 0;
在這裏插入圖片描述

(5)user_main.c

首先填DHT11的頭文件
#include “driver/hal_temp_hum.h”

接下來是4個按鍵的定義
#define GPIO_KEY_NUM 4 ///< 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_GPIO2_U ///< ESP8266 GPIO function
#define KEY_1_IO_NUM 2 ///< ESP8266 GPIO number
#define KEY_1_IO_FUNC FUNC_GPIO2 ///< ESP8266 GPIO name

#define KEY_2_IO_MUX PERIPHS_IO_MUX_U0RXD_U ///< ESP8266 GPIO function
#define KEY_2_IO_NUM 3 ///< ESP8266 GPIO number
#define KEY_2_IO_FUNC FUNC_GPIO3 ///< ESP8266 GPIO name

#define KEY_3_IO_MUX PERIPHS_IO_MUX_U0TXD_U ///< ESP8266 GPIO function
#define KEY_3_IO_NUM 1 ///< ESP8266 GPIO number
#define KEY_3_IO_FUNC FUNC_GPIO1 ///< ESP8266 GPIO name
在這裏插入圖片描述
定義按鍵的功能(長按、短按)
/**

  • Key1 key short press processing
  • @param none
  • @return none
    */

LOCAL void ICACHE_FLASH_ATTR key1ShortPress(void)
{
if(statu[0]=!statu[0])
GIZWITS_LOG("#### KEY1 short press ,LED_1 ON/OFF \n");

}

/**

  • Key1 key presses a long press

  • @param none

  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key1LongPress(void)
    {

    GIZWITS_LOG("#### key1 long press, SOFTAP MODE\n");

    gizwitsSetMode(WIFI_SOFTAP_MODE);
    }

/**

  • Key2 key to short press processing
  • @param none
  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key2ShortPress(void)
    {
    if(statu[1]=!statu[1])
    GIZWITS_LOG("#### key2 short press, LED_2 ON/OFF \n");

}

/**

  • 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);
    }

/**

  • Key3 key to short press processing
  • @param none
  • @return none
    */

LOCAL void ICACHE_FLASH_ATTR key3ShortPress(void)
{
if(statu[2]=!statu[2])
GIZWITS_LOG("#### key3 short press, LED_3 ON/OFF \n");

}

/**

  • Key3 button long press
  • @param none
  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key3LongPress(void)
    {
    GIZWITS_LOG("#### key3 long press, ALL_LED ON \n");

}

/**

  • Key4 key to short press processing
  • @param none
  • @return none
    */

LOCAL void ICACHE_FLASH_ATTR key4ShortPress(void)
{
if(statu[3]=!statu[3])
GIZWITS_LOG("#### key4 short press, LED_4 ON/OFF \n");

}

/**

  • Key4 button long press
  • @param none
  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key4LongPress(void)
    {
    GIZWITS_LOG("#### key4 long press, ALL_LED OFF \n");

}
由於程序太長,且全部代碼都給出,就只做一個截圖
在這裏插入圖片描述
再就是按鍵初始化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_MTMS_U,FUNC_GPIO14);// 配置lED_1引腳輸出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(14));

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);// 配置LED_2引腳輸出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);// 配置lED_1引腳輸出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(13));

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15);// 配置lED_1引腳輸出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(15));
GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 0);//輸出高電平 LED_1 OFF
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);//輸出高電平 LED_2 OFF
GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0);//輸出高電平 LED_3 OFF
GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 0);//輸出高電平 LED_4 OFF
}
完整的程序都給出,所以不做截圖了
最後在user_init(void)裏添加DHT11初始化程序
dh11Init( );
在這裏插入圖片描述
接下來的操作就不用說了吧!如果不會請看我的第一篇稿子,第一次總是潦草的,見諒。地址:esp8266 NodeMcu機智雲SOC方案開發經驗分享
大功告成!並沒有完,哈哈。
那個DHT11的坑沒有講,現在補充下
右擊dh11Init( );選擇下圖紅框
在這裏插入圖片描述
發現了沒有,當你要定義其他引腳作爲DHT11的數據接口時,改頭文件是不夠的,紅框裏也要改
在這裏插入圖片描述
需要代碼的話可以回覆我

That’all .thans for your reading.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章