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.運行條件
該設備要使用天貓精靈控制就必須聯網控制,接下來就是幾個必要條件:
- 有WiFi可以用
- 一臺不算太過老舊的智能手機
- 手機安裝點燈科技(blinker)圖標是一個藍色發光二極管
- 手機安裝天貓精靈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();
}
注意填自己的設備信息,不然控不住哦!