小愛同學脫離局域網遠程控制開關?
這是幾個月前做的一個小項目,也是從大佬那裏學來的,爲了防止忘記過程,自己做個記錄,同時分享給需要的人
這個項目需要用到的東西有:電腦端Arduino IDE,小米手機小愛同學,手機APP點燈·blinker,esp8266nodemcu,以及杜邦線麪包板小燈
1、Arduino IDE根據自己的系統安裝合適的版本 我目前用的是1.8.9版本
安裝esp8266拓展,這裏點燈科技提供了資源,需要的小夥伴去找官方開發文檔
以及下載安裝blinker-Arduino庫:
方法一:打開軟件IDE,在項目–》加載庫–》管理庫下搜索blinker進行安裝
安裝最新版本
方法二:找到點燈科技官方開發文檔,快速入門esp8266WiFi接入
點擊下載,根據要求安裝
到目前爲止,電腦端的配置就完成了
2、手機APP點燈下載
這樣獲取到secret Key,到時候代碼裏要用到
3、打開IDE 新建文件 輸入代碼
#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET //設置爲小愛多個插座的模式
#include <Blinker.h>
BlinkerButton Button1("btn-km"); //設置blinkerapp內數據鍵名
BlinkerButton Button2("btn-kckm"); //這裏只用了其中三個
BlinkerButton Button3("btn-gckm");
BlinkerText Text1("text_1");
char i;
char auth[] = "密鑰(secret Key)";
char ssid[] = "WiFi名稱";
char pswd[] = "WiFi密碼";
bool oState[5] = { false }; //設置5路開關控制
void miotPowerState(const String & state, uint8_t num) //小愛同學控制指令
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
if(num==1){
i=D1; //指定每一路開關對應在開發板上的通道接口
}else if(num==2){
i=D2;
}else if(num==3){
i=D5;
}
if (state == BLINKER_CMD_ON) {
digitalWrite(i, HIGH); //這裏控制模式都是點動模式
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
oState[num] = true;
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(i, LOW);
BlinkerMIOT.powerState("off", num);
BlinkerMIOT.print();
oState[num] = false;
if (num == 0)
{
for (uint8_t o_num = 0; o_num < 5; o_num++)
{
oState[o_num] = false;
}
}
}
}
void miotQuery(int32_t queryCode, uint8_t num)
{
BLINKER_LOG("AliGenie Query outlet: ", num,", codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_ALL_NUMBER :
BLINKER_LOG("MIOT Query All");
BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("MIOT Query Power State");
BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
default :
BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
}
}
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
void button1_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
digitalWrite(D1, HIGH);
Blinker.print("開門命令已經處理");
Text1.print("shuju");
}
void button2_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
digitalWrite(D2, HIGH);
}
void button3_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
digitalWrite(D5, HIGH);
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
pinMode(D1, OUTPUT);
digitalWrite(D1, LOW);
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW);
pinMode(D5, OUTPUT);
digitalWrite(D5, LOW);
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
BlinkerMIOT.attachPowerState(miotPowerState);
BlinkerMIOT.attachQuery(miotQuery);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
Button3.attach(button3_callback);
}
void loop()
{
Blinker.run();
}
我們的esp8266長這樣,在代碼中主要用了3路接口,如果有基礎的可以看出,分別是D1、D2和D5,看不懂的也沒有關係,主要是在這三處:
如果需要小改動的可以用其他端口代替,當然代碼中還有其他的地方需要替換
從這裏可以看出,在啓動後,三個端口的電平爲低電平,燈不亮
以及這裏可以看出,當小愛同接收到適當命令時,端口輸出高電平
廢話不多說了,我們將程序燒錄,接線
4、打開IDE,連接esp8266
選擇開發板,確定端口
在IDE上先驗證,再上傳
再進行硬件連接:
D1接紅燈正極,D2接藍燈正極,D5接綠燈正極,三個小燈的負極一起接到開發板的GND
5、打開點燈app可以看到設備在線
6、我們進入米家APP,在我的–》其他平臺設備–》添加點燈科技,關聯賬號,就可以看到我們有了5個插座開關,其中前面三個是我們三個小燈的開關:
7、我們再進入小愛同學APP新建訓練,假如我們D1燈泡是紅燈,我們就可以設置你對小愛說的話:打開我的紅燈,小愛的迴應就是設備控制,選擇小燈插座一,打開插座:
以此類推我們就有了打開三個燈泡的指令,關閉三個燈泡的指令
感興趣的小夥伴快來試試吧