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
操作如图所示:
NodeMCU连接天猫精灵第二集——开发环境、运行条件、工作代码(基于Blinker点灯科技)_第1张图片
NodeMCU连接天猫精灵第二集——开发环境、运行条件、工作代码(基于Blinker点灯科技)_第2张图片

B.ESP8266模组

之后找到 菜单栏>工具>开发板>开发板管理器,搜索“esp8266”,并选择最新版本安装
NodeMCU连接天猫精灵第二集——开发环境、运行条件、工作代码(基于Blinker点灯科技)_第3张图片
NodeMCU连接天猫精灵第二集——开发环境、运行条件、工作代码(基于Blinker点灯科技)_第4张图片
等待安装完成之后就可以在 菜单栏>工具>开发板>开发板管理器找到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内创建设备并获取设备的专用密钥,操作过程如图所示NodeMCU连接天猫精灵第二集——开发环境、运行条件、工作代码(基于Blinker点灯科技)_第5张图片
得到设备密钥后先记下来,一会儿有用

然后就是测试一下自己的天猫精灵有没有联网了,确定连上网络之后,就开始敲代码

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连接天猫精灵第二集——开发环境、运行条件、工作代码(基于Blinker点灯科技)_第6张图片
如果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();
}

注意填自己的设备信息,不然控不住哦!

你可能感兴趣的:(Arduino,嵌入式,物联网)