NodeMCU連接天貓精靈第二集——開發環境、運行條件、工作代碼(基於Blinker點燈科技)

NodeMCU連接天貓精靈第一集——硬件構架(基於Blinker點燈科技)
根據上面說的硬件部分已經搭建完成了,所以現在說一下軟件開發,首先要有一個共識,NodeMCU是可以用Arduino IDE開發的,只需要安裝完成Arduino IDE之後進行幾個步驟就OK了

1.開發環境

A.Arduino IDE

官方安裝地址:Arduino
直接下載即可,如果嫌棄官網速度慢的可以自己找資源下載,找不到的就基本告別搞開發了
安裝好Arduino IDE之後,打開軟件,找到菜單欄>文件>首選項,添加以下網址到 附加開發板管理器網址
http://arduino.esp8266.com/stable/package_esp8266com_index.json
操作如圖所示:
在這裏插入圖片描述
在這裏插入圖片描述

B.ESP8266模組

之後找到 菜單欄>工具>開發板>開發板管理器,搜索“esp8266”,並選擇最新版本安裝
在這裏插入圖片描述
在這裏插入圖片描述
等待安裝完成之後就可以在 菜單欄>工具>開發板>開發板管理器找到Generic ESP8266 Module選中Generic ESP8266 Module就可以開始開發了。

C.點燈科技的Arduino庫

下載並安裝點燈科技的Arduino庫:點擊下載

Windows:將下載好的blinker庫解壓到 我的電腦>文檔>Arduino>libraries 文件夾中
Mac OS:將下載好的blinker庫解壓到 文稿>Arduino>libraries 文件夾中

今後用到的庫文件都是放在上述目錄下。

2.運行條件

該設備要使用天貓精靈控制就必須聯網控制,接下來就是幾個必要條件:

  1. 有WiFi可以用
  2. 一臺不算太過老舊的智能手機
  3. 手機安裝點燈科技(blinker)圖標是一個藍色發光二極管
  4. 手機安裝天貓精靈APP

首先要在點燈科技APP內創建設備並獲取設備的專用密鑰,操作過程如圖所示APP操作過程
得到設備密鑰後先記下來,一會兒有用

然後就是測試一下自己的天貓精靈有沒有聯網了,確定連上網絡之後,就開始敲代碼

3.工作代碼

由於暫時在實驗階段,工作代碼就用來點亮NodeMCU上的LED爲目的;對於Arduino的基本操作和NodeMCU的GPIO和AD轉換我在之前的文章講過,下面附上鍊接
NodeMCU的基礎控制(GPIO)
NodeMCU的AD轉換
我就直接放代碼了:

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_ALIGENIE_OUTLET

#include <Blinker.h>

char auth[] = "***********";	//填上剛剛記下來的密鑰
char ssid[] = "***********";	//填上你家WiFi名字
char pswd[] = "***********";	//填上你家WiFi密碼

bool oState = false;			//記錄狀態量

void aligeniePowerState(const String & state)	//天貓精靈電源狀態函數
{
    BLINKER_LOG("need set power state: ", state);	//獲取電源狀態

    if (state == BLINKER_CMD_ON) 			//狀態爲開
    {			
        digitalWrite(LED_BUILTIN, HIGH);	//狀態爲開的對應動作
        BlinkerAliGenie.powerState("on");	//返回開狀態
        BlinkerAliGenie.print();
        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) 		//狀態爲關
    {	
        digitalWrite(LED_BUILTIN, LOW);		//狀態爲關的對應動作
        BlinkerAliGenie.powerState("off");	//返回關狀態
        BlinkerAliGenie.print();
        oState = false;
    }
}

void aligenieQuery(int32_t queryCode)		//天貓精靈查詢函數
{
    BLINKER_LOG("AliGenie Query codes: ", queryCode);	//天貓精靈狀態查詢
    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("AliGenie Query All");
            BlinkerAliGenie.powerState(oState ? "on" : "off");
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("AliGenie Query Power State");
            BlinkerAliGenie.powerState(oState ? "on" : "off");
            BlinkerAliGenie.print();
            break;
        default :
            BlinkerAliGenie.powerState(oState ? "on" : "off");
            BlinkerAliGenie.print();
            break;
    }
}

void dataRead(const String & data)	//點燈科技的數據讀取
{
    BLINKER_LOG("Blinker readString: ", data);
    Blinker.vibrate();
    uint32_t BlinkerTime = millis();
    Blinker.print(BlinkerTime);
    Blinker.print("millis", BlinkerTime);
}

void setup()	//初始化設備
{
    Serial.begin(115200);		//初始化串口
    #if defined(BLINKER_PRINT)
        BLINKER_DEBUG.stream(BLINKER_PRINT);
    #endif
    pinMode(LED_BUILTIN, OUTPUT);	//LED設定爲輸出模式
    digitalWrite(LED_BUILTIN, LOW);		//LED低電平
    Blinker.begin(auth, ssid, pswd);	//連接網絡並接入物聯網平臺
    Blinker.attachData(dataRead);	
    BlinkerAliGenie.attachPowerState(aligeniePowerState);	//啓動天貓精靈電源狀態函數
    BlinkerAliGenie.attachQuery(aligenieQuery);				//啓動天貓精靈查詢函數
}

void loop()		//進入主循環
{
    Blinker.run();		//Blinker狀態運行
}

將上述代碼複製到Arduino IDE的編輯界面,並連接好NodeMCU和電腦後點擊工具–>串口–>選擇NodeMCU對應的串口,點擊Arduino IDE的編輯界面左上角的右箭頭,直接編譯下載程序到NodeMCU上,等待下載完畢。

在這個時候就可以打開天貓精靈APP,在天貓精靈中綁定自己的Blinker賬號,剛剛下了點燈科技的肯定一個都有吧,綁定方式是點擊天貓精靈app右下角的我家–>添加設備–>搜索欄搜索blinker–>選擇中心的插座圖標就會跳出你剛剛在blinker創建的設備,點擊同步設備即可,流程如下:
天貓精靈操作流程
如果NodeMCU沒有上線的話是看不到第五步的內容哦,看不到就要檢查網絡狀態。
之後在天貓精靈APP內修改設備名稱就可以叫天貓精靈打開或者關閉設備了,具體操作示例在天貓精靈app裏點擊需要控制的設備後下方會有相應操作。

搞定上面的問題,如果可以用過天貓精靈把NodeMCU上的燈叫亮之後基本就沒有什麼問題了,下面我放上我的多個插座的代碼,祝大家玩的愉快!!!

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_ALIGENIE_MULTI_OUTLET

#include <Blinker.h>

BlinkerButton Button1("btn-lt1");     //設置blinkerapp內數據鍵名
BlinkerButton Button2("btn-lt2");   //這裏只用了其中三個
BlinkerButton Button3("btn-lt3");  
BlinkerButton Button4("btn-lt4");  
BlinkerText Text1("text_1");

char i;

char auth[] = "***********";	//填上剛剛記下來的密鑰
char ssid[] = "***********";	//填上你家WiFi名字
char pswd[] = "***********";	//填上你家WiFi密碼

bool oState[5] = { false };

void aligeniePowerState(const String & state, uint8_t num)
{
    BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
    
    if(num == 1){
      i=0;          //指定每一路開關對應在開發板上的通道接口
    }else if(num == 2){
      i=2;
    }else if(num == 3){
      i=4;
    }else if(num == 4){
      i=5;
    }
      
    if (state == BLINKER_CMD_ON) {
        digitalWrite(i, HIGH);
        Blinker.delay(200);
        digitalWrite(i, LOW);

        BlinkerAliGenie.powerState("on",num);
        BlinkerAliGenie.print();

        oState[num] = true;
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(i, HIGH);
        Blinker.delay(200);
        digitalWrite(i, LOW);

        BlinkerAliGenie.powerState("off",num);
        BlinkerAliGenie.print();

        oState[num] = false;
        
        if (num == 0)
        {
            for (uint8_t o_num = 0; o_num < 5; o_num++)
            {
                oState[o_num] = false;
            }
        }  
    }
}

void aligenieQuery(int32_t queryCode, uint8_t num)
{
    BLINKER_LOG("AliGenie Query outlet: ", num,", codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("AliGenie Query All");
            BlinkerAliGenie.powerState(oState[num] ? "on" : "off",num);
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("AliGenie Query Power State");
            BlinkerAliGenie.powerState(oState[num] ? "on" : "off",num);
            BlinkerAliGenie.print();
            break;
        default :
            BlinkerAliGenie.powerState(oState[num] ? "on" : "off",num);
            BlinkerAliGenie.print();
            break;
    }
}

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();

    uint32_t BlinkerTime = millis();
    Blinker.print(BlinkerTime);
    Blinker.print("millis", BlinkerTime);
}

void button1_callback(const String & state)     //點燈app內控制按鍵觸發
{
    BLINKER_LOG("get button state: ", state);
        digitalWrite(0, HIGH);
        Blinker.delay(200);
        digitalWrite(0, LOW);
        Blinker.print("燈具操作已處理");
        Text1.print("shuju");
        
}

void button2_callback(const String & state)     //點燈app內控制按鍵觸發
{
    BLINKER_LOG("get button state: ", state);
        digitalWrite(2, HIGH);
        Blinker.delay(400);
        Blinker.print("燈具操作已處理");
        digitalWrite(2, LOW);
}

void button3_callback(const String & state)     //點燈app內控制按鍵觸發
{
    BLINKER_LOG("get button state: ", state);
        digitalWrite(4, HIGH);
        Blinker.delay(300);
        Blinker.print("燈具操作已處理");
        digitalWrite(4, LOW);
}

void button4_callback(const String & state)     //點燈app內控制按鍵觸發
{
    BLINKER_LOG("get button state: ", state);
        digitalWrite(5, HIGH);
        Blinker.delay(300);
        Blinker.print("燈具操作已處理");
        digitalWrite(5, LOW);
}

void setup()
{
    Serial.begin(115200);

    #if defined(BLINKER_PRINT)
        BLINKER_DEBUG.stream(BLINKER_PRINT);
    #endif
    pinMode(0, OUTPUT);
    digitalWrite(0, LOW);
    pinMode(2, OUTPUT);
    digitalWrite(2, LOW);
    pinMode(4, OUTPUT);
    digitalWrite(4, LOW);
    pinMode(5, OUTPUT);
    digitalWrite(5, LOW);
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);

    BlinkerAliGenie.attachPowerState(aligeniePowerState);
    BlinkerAliGenie.attachQuery(aligenieQuery);
    Button1.attach(button1_callback); 
    Button2.attach(button2_callback); 
    Button3.attach(button3_callback);
    Button4.attach(button4_callback); 
}

void loop()
{
    Blinker.run();
}

注意填自己的設備信息,不然控不住哦!

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