查看: 1263|回复: 1

[Arduino物联网开发实战4]天猫精灵控制2

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2019-1-17 14:34 | 显示全部楼层 |阅读模式

    对于照明设备,除了可以查询其状态外,还可以改变其状态。
    详见:天猫精灵blinker接口文档

    可以修改各回调函数中的内容,以响应不同的指令。完整示例如下:

    #define BLINKER_WIFI
    #define BLINKER_ALIGENIE_LIGHT
    
    #include <Blinker.h>
    
    char auth[] = "Your Device Secret Key";
    char ssid[] = "Your WiFi network SSID or name";
    char pswd[] = "Your WiFi network WPA password or WEP key";
    
    #include <Adafruit_NeoPixel.h>
    
    #define PIN            13
    #define NUMPIXELS      24
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    
    #define RGB_1 "RGBKey"
    
    BlinkerRGB WS2812(RGB_1);
    
    uint8_t colorR, colorG, colorB, colorW;
    bool wsState;
    String wsMode = BLINKER_CMD_COMMON;
    
    void pixelShow()
    {
        pixels.setBrightness(colorW);
    
        for(int i = 0; i < NUMPIXELS; i++){
            pixels.setPixelColor(i, colorR, colorG, colorB);
        }
        pixels.show();
    }
    
    void ws2812_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)
    {
        digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
        BLINKER_LOG("R value: ", r_value);
        BLINKER_LOG("G value: ", g_value);
        BLINKER_LOG("B value: ", b_value);
        BLINKER_LOG("Rrightness value: ", bright_value);
    
        colorR = r_value;
        colorG = g_value;
        colorB = b_value;
        colorW = bright_value;
    
        pixelShow();
    }
    
    String getColor()
    {
        uint32_t color = colorR << 16 | colorG << 8 | colorB;
    
        switch (color)
        {
            case 0xFF0000 :
                return "Red";
            case 0xFFFF00 :
                return "Yellow";
            case 0x0000FF :
                return "Blue";
            case 0x00FF00 :
                return "Green";
            case 0xFFFFFF :
                return "White";
            case 0x000000 :
                return "Black";
            case 0x00FFFF :
                return "Cyan";
            case 0x800080 :
                return "Purple";
            case 0xFFA500 :
                return "Orange";
            default :
                return "White";
        }
    }
    
    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();
    
            wsState = true;
    
            if (colorW == 0) colorW = 255;
        }
        else if (state == BLINKER_CMD_OFF) {
            digitalWrite(LED_BUILTIN, LOW);
    
            BlinkerAliGenie.powerState("off");
            BlinkerAliGenie.print();
    
            wsState = false;
        }
    
        pixelShow();
    }
    
    void aligenieColor(const String & color)
    {
        BLINKER_LOG("need set color: ", color);
    
        if (color == "Red") {
            colorR = 255;
            colorG = 0;
            colorB = 0;
        }
        else if (color == "Yellow") {
            colorR = 255;
            colorG = 255;
            colorB = 0;
        }
        else if (color == "Blue") {
            colorR = 0;
            colorG = 0;
            colorB = 255;
        }
        else if (color == "Green") {
            colorR = 0;
            colorG = 255;
            colorB = 0;
        }
        else if (color == "White") {
            colorR = 255;
            colorG = 255;
            colorB = 255;
        }
        else if (color == "Black") {
            colorR = 0;
            colorG = 0;
            colorB = 0;
        }
        else if (color == "Cyan") {
            colorR = 0;
            colorG = 255;
            colorB = 255;
        }
        else if (color == "Purple") {
            colorR = 128;
            colorG = 0;
            colorB = 128;
        }
        else if (color == "Orange") {
            colorR = 255;
            colorG = 165;
            colorB = 0;
        }
    
        if (wsState == false) {
            wsState = true;
            colorW = 255;
        }
    
        if (colorW == 0) {
            colorW = 255;
        }
    
        pixelShow();
    
        BlinkerAliGenie.color(color);
        BlinkerAliGenie.print();
    }
    
    void aligenieMode(const String & mode)
    {
        BLINKER_LOG("need set mode: ", mode);
    
        if (mode == BLINKER_CMD_ALIGENIE_READING) {
            // Your mode function
        }
        else if (mode == BLINKER_CMD_ALIGENIE_MOVIE) {
            // Your mode function
        }
        else if (mode == BLINKER_CMD_ALIGENIE_SLEEP) {
            // Your mode function
        }
        else if (mode == BLINKER_CMD_ALIGENIE_HOLIDAY) {
            // Your mode function
        }
        else if (mode == BLINKER_CMD_ALIGENIE_MUSIC) {
            // Your mode function
        }
        else if (mode == BLINKER_CMD_ALIGENIE_COMMON) {
            // Your mode function
        }
    
        wsMode = mode;
    
        BlinkerAliGenie.mode(mode);
        BlinkerAliGenie.print();
    }
    
    void aligenieCancelMode(const String & cmode)
    {
        BLINKER_LOG("need cancel mode: ", cmode);
    
        if (cmode == BLINKER_CMD_ALIGENIE_READING) {
            // Your mode function
        }
        else if (cmode == BLINKER_ALIGENIE_CMD_MOVIE) {
            // Your mode function
        }
        else if (cmode == BLINKER_ALIGENIE_CMD_SLEEP) {
            // Your mode function
        }
        else if (cmode == BLINKER_ALIGENIE_CMD_HOLIDAY) {
            // Your mode function
        }
        else if (cmode == BLINKER_ALIGENIE_CMD_MUSIC) {
            // Your mode function
        }
        else if (cmode == BLINKER_ALIGENIE_CMD_COMMON) {
            // Your mode function
        }
    
        wsMode = BLINKER_CMD_COMMON; // new mode
    
        BlinkerAliGenie.mode(wsMode); // must response
        BlinkerAliGenie.print();
    }
    
    void aligenieBright(const String & bright)
    {
        BLINKER_LOG("need set brightness: ", bright);
    
        if (bright == BLINKER_CMD_MAX) {
            colorW = 255;
        }
        else if (bright == BLINKER_CMD_MIN) {
            colorW = 0;
        }
        else {
            colorW = bright.toInt();
        }
    
        BLINKER_LOG("now set brightness: ", colorW);
    
        pixelShow();
    
        BlinkerAliGenie.brightness(colorW);
        BlinkerAliGenie.print();
    }
    
    void aligenieRelativeBright(int32_t bright)
    {
        BLINKER_LOG("need set relative brightness: ", bright);
    
        if (colorW + bright < 255 && colorW + bright >= 0) {
            colorW += bright;
        }
    
        BLINKER_LOG("now set brightness: ", colorW);
    
        pixelShow();
    
        BlinkerAliGenie.brightness(bright);
        BlinkerAliGenie.print();
    }
    
    void aligenieColoTemp(int32_t colorTemp)
    {
        BLINKER_LOG("need set colorTemperature: ", colorTemp);
    
        BlinkerAliGenie.colorTemp(colorTemp);
        BlinkerAliGenie.print();
    }
    
    void aligenieRelativeColoTemp(int32_t colorTemp)
    {
        BLINKER_LOG("need set relative colorTemperature: ", colorTemp);
    
        BlinkerAliGenie.colorTemp(colorTemp);
        BlinkerAliGenie.print();
    }
    
    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(wsState ? "on" : "off");
                BlinkerAliGenie.color(getColor());
                BlinkerAliGenie.mode(wsMode);
                BlinkerAliGenie.colorTemp(50);
                BlinkerAliGenie.brightness(colorW);
                BlinkerAliGenie.print();
                break;
            case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
                BLINKER_LOG("AliGenie Query Power State");
                BlinkerAliGenie.powerState(wsState ? "on" : "off");
                BlinkerAliGenie.print();
                break;
            case BLINKER_CMD_QUERY_COLOR_NUMBER :
                BLINKER_LOG("AliGenie Query Color");
                BlinkerAliGenie.color(getColor());
                BlinkerAliGenie.print();
                break;
            case BLINKER_CMD_QUERY_MODE_NUMBER :
                BLINKER_LOG("AliGenie Query Mode");
                BlinkerAliGenie.mode(wsMode);
                BlinkerAliGenie.print();
                break;
            case BLINKER_CMD_QUERY_COLORTEMP_NUMBER :
                BLINKER_LOG("AliGenie Query ColorTemperature");
                BlinkerAliGenie.colorTemp(50);
                BlinkerAliGenie.print();
                break;
            case BLINKER_CMD_QUERY_BRIGHTNESS_NUMBER :
                BLINKER_LOG("AliGenie Query Brightness");
                BlinkerAliGenie.brightness(colorW);
                BlinkerAliGenie.print();
                break;
            default :
                BlinkerAliGenie.powerState(wsState ? "on" : "off");
                BlinkerAliGenie.color(getColor());
                BlinkerAliGenie.mode(wsMode);
                BlinkerAliGenie.colorTemp(50);
                BlinkerAliGenie.brightness(colorW);
                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);    
        BLINKER_DEBUG.stream(Serial);
    
        pinMode(LED_BUILTIN, OUTPUT);
        digitalWrite(LED_BUILTIN, LOW);
    
        Blinker.begin(auth, ssid, pswd);
        Blinker.attachData(dataRead);
    
        BlinkerAliGenie.attachPowerState(aligeniePowerState);
        BlinkerAliGenie.attachColor(aligenieColor);
        BlinkerAliGenie.attachMode(aligenieMode);
        BlinkerAliGenie.attachCancelMode(aligenieCancelMode);
        BlinkerAliGenie.attachBrightness(aligenieBright);
        BlinkerAliGenie.attachRelativeBrightness(aligenieRelativeBright);
        BlinkerAliGenie.attachColorTemperature(aligenieColoTemp);
        BlinkerAliGenie.attachRelativeColorTemperature(aligenieRelativeColoTemp);
        BlinkerAliGenie.attachQuery(aligenieQuery);
    
        pinMode(14, OUTPUT);
        digitalWrite(14, HIGH);
        pinMode(15, OUTPUT);
        digitalWrite(15, HIGH);
    
        colorR = 255;
        colorG = 255;
        colorB = 255;
        colorW = 0;
        wsState = true;
    
        pixels.begin();
        pixels.setBrightness(colorW);
        WS2812.attach(ws2812_callback);
        pixelShow();
    }
    
    void loop()
    {
        Blinker.run();
    
        for(int i = 0; i < NUMPIXELS; i++){
            pixels.setPixelColor(i, colorR, colorG, colorB);
        }
        pixels.show();
    }

    更详细的文档,可见
    https://doc.blinker.app/







    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    奋斗
    2019-2-7 13:25
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2019-1-17 21:57 | 显示全部楼层
    iiiiiiiiiiiiiiiiiiiiiiiiiiiiii
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    利用MICRO:BIT制作的飞机小游戏
    利用MICRO:BIT制作的飞机
    一.项目名称: 利用MICRO:BIT制作的飞机小游戏二.制作目的: 带孩子多了解micro:bit
    全过程展示:PWM自定义、测速、PID调速、PID自整定
    全过程展示:PWM自定义、
    有一天,电控小白在某宝上买来了一块Arduino Mega2560、一款直流电机。小白想:“这款
    OneNET之星再度闪耀 物联网创客马拉松大赛正式启动
    OneNET之星再度闪耀 物联
    4月9日,2019中国移动OneNET之星2.0物联网创客马拉松正式上线。大赛由中国移动集
    求助!!!!
    求助!!!!
    想借助数据上传工具将串口数据传到乐联网,结果一直上传失败,实在不知道怎么修
    BLE胸带+GPS墨水屏运动心率表(0421更新代码及原理图)
    BLE胸带+GPS墨水屏运动心
    0421了更新代码原理状语从句:打图产品板的PCB已经到达本市。 项目简介: 我喜欢
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表