背景:入手天猫精灵后,一直觉得不能白白浪费这个“智慧大脑”,想把家里的电器变为智能家居(直接买智能家具的略过)。
思路:控制电器的开关其实就是控制家里220V电路火线的通断一样。
硬件:继电器(某宝:¥5上下)、ESP8266(某宝:¥5上下)、USB转TTL(调试工具¥10上下)、天猫精灵(双11,¥69上下)、排线若干
软件:Arduino、Blinker物联网
开始工作:
1、首先注册Blinker账户,下载APP,并在APP上添加设备,使用MQTT接入(天猫精灵只能使用此方法)。
2、在APP中查看设备密钥(12位)
3、打开Arduino,去该地址blinker库文件地址下载库文件,并放到Arduino的安装目录下的library目录下。
4、如果不想麻烦,直接在Arduino中打开示例Blinker-Aligenie,然后烧写进ESP8266中。
5、在Blinker的APP中,刷新设备,查看设备是否正在在线。
6、在天猫精灵的APP中,添加”智能家居“中找到Blinker,并登录blinker的账户,由此,在blinker中登录的设备也就在天猫精灵中可以看到了。
7、至此,可以用天猫精灵控制设备了。
附上我的测试代码:
#define BLINKER_PRINT Serial
#define BLINKER_MQTT
#define BLINKER_ALIGENIE_OUTLET
#include <Blinker.h>
char auth[] = "在blinker的APP中的设备密钥";
char ssid[] = "自己家的wifi";
char pswd[] = "wifi密钥";
bool oState = false;
void aligeniePowerState(const String & state)
{
BLINKER_LOG2("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
digitalWrite(2, HIGH);
BlinkerAliGenie.powerState("on");
BlinkerAliGenie.print();
oState = true;
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(2, LOW);
BlinkerAliGenie.powerState("off");
BlinkerAliGenie.print();
oState = false;
}
}
void aligenieQuery(int32_t queryCode)
{
BLINKER_LOG2("AliGenie Query codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_ALL_NUMBER :
BLINKER_LOG1("AliGenie Query All");
BlinkerAliGenie.powerState(oState ? "on" : "off");
BlinkerAliGenie.print();
break;
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG1("AliGenie Query Power State");
BlinkerAliGenie.powerState(oState ? "on" : "off");
BlinkerAliGenie.print();
break;
default :
BlinkerAliGenie.powerState(oState ? "on" : "off");
BlinkerAliGenie.print();
break;
}
}
void setup()
{
Serial.begin(115200);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
Blinker.begin(auth, ssid, pswd);
BlinkerAliGenie.attachPowerState(aligeniePowerState);
BlinkerAliGenie.attachQuery(aligenieQuery);
}
void loop()
{
Blinker.run();
// if (Blinker.available()) {
// BLINKER_LOG2("Blinker.readString(): ", Blinker.readString());
//
// uint32_t BlinkerTime = millis();
//
// Blinker.vibrate();
// Blinker.print("millis", BlinkerTime);
// }
}