NodeMCU连接天猫精灵第一集——硬件构架(基于Blinker点灯科技)
根据上面说的硬件部分已经搭建完成了,所以现在说一下软件开发,首先要有一个共识,NodeMCU是可以用Arduino IDE开发的,只需要安装完成Arduino IDE之后进行几个步骤就OK了
官方安装地址:Arduino
直接下载即可,如果嫌弃官网速度慢的可以自己找资源下载,找不到的就基本告别搞开发了
安装好Arduino IDE之后,打开软件,找到菜单栏>文件>首选项,添加以下网址到 附加开发板管理器网址
http://arduino.esp8266.com/stable/package_esp8266com_index.json
操作如图所示:
之后找到 菜单栏>工具>开发板>开发板管理器,搜索“esp8266”,并选择最新版本安装
等待安装完成之后就可以在 菜单栏>工具>开发板>开发板管理器找到Generic ESP8266 Module选中Generic ESP8266 Module就可以开始开发了。
下载并安装点灯科技的Arduino库:点击下载
Windows:将下载好的blinker库解压到 我的电脑>文档>Arduino>libraries 文件夹中
Mac OS:将下载好的blinker库解压到 文稿>Arduino>libraries 文件夹中
今后用到的库文件都是放在上述目录下。
该设备要使用天猫精灵控制就必须联网控制,接下来就是几个必要条件:
有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
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
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();
}
注意填自己的设备信息,不然控不住哦!