天猫精灵+ESP8266+WS2812远程氛围灯

天猫精灵+ESP8266+WS2812远程氛围灯

#define BLINKER_WIFI
#define BLINKER_ALIGENIE_LIGHT
#include <Blinker.h>
int moshi = 1;
int mo = 1;
char auth[] = "xxx";
char ssid[] = "xxx";
char pswd[] = "xxx";
#include <Adafruit_NeoPixel.h>

#define PIN            4  //引脚
#define NUMPIXELS      150  //灯数
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 = 50;
  }
  else if (state == BLINKER_CMD_OFF) {
    digitalWrite(LED_BUILTIN, LOW);

    BlinkerAliGenie.powerState("off");
    BlinkerAliGenie.print();
    colorW = 0;
    wsState = false;
  }

  pixelShow();
}

void aligenieColor(const String & color)
{
  BLINKER_LOG("need set color: ", color);
  moshi = 1;
  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 = 50;
  }

  if (colorW == 0) {
    colorW = 50;
  }

  pixelShow();

  BlinkerAliGenie.color(color);
  BlinkerAliGenie.print();
}

void aligenieMode(const String & mode)
{
  BLINKER_LOG("need set mode: ", mode);



  if (mode == BLINKER_CMD_READING) {
    // Your mode function
    moshi = 3;
  }
  else if (mode == BLINKER_CMD_MOVIE) {
    // Your mode function
    moshi = 2;
  }
  else if (mode == BLINKER_CMD_SLEEP) {

    moshi = 5;
  }
  else if (mode == BLINKER_CMD_COMMON) {
    // Your mode function
    moshi = 4;
  }
  else if (mode == BLINKER_CMD_MUSIC) {
    // Your mode function

  }
  else if (mode == BLINKER_CMD_HOLIDAY) {
    // 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_CMD_MOVIE) {
    // Your mode function
  }
  else if (cmode == BLINKER_CMD_SLEEP) {
    // Your mode function
  }
  else if (cmode == BLINKER_CMD_HOLIDAY) {
    // Your mode function
  }
  else if (cmode == BLINKER_CMD_MUSIC) {
    // Your mode function
  }
  else if (cmode == BLINKER_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 rainbow() {
  uint16_t i, j;

  for (j = 0; j < 256; j++) {
    for (i = 0; i < pixels.numPixels(); i++) {
      pixels.setPixelColor(i, Wheel((i + j) & 255));
    }
    pixels.show();
    Blinker.run();
    if (mo != moshi) {
      mo = moshi;
      return;
    }
    delay(20);
    //delay(wait);
  }
}
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void rainbowCycle() {
  uint16_t i, j;

  for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for (i = 0; i < pixels.numPixels(); i++) {
      pixels.setPixelColor(i, Wheel(((i * 256 / pixels.numPixels()) + j) & 255));
    }
    pixels.show();
    Blinker.run();
    if (mo != moshi) {
      mo = moshi;
      return;
    }
    delay(20);
    //delay(wait);
  }
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow() {
  for (int j = 0; j < 256; j++) {   // cycle all 256 colors in the wheel
    for (int q = 0; q < 3; q++) {
      for (uint16_t i = 0; i < pixels.numPixels(); i = i + 3) {
        pixels.setPixelColor(i + q, Wheel( (i + j) % 255)); //turn every third pixel on
      }
      pixels.show();
      Blinker.run();
      if (mo != moshi) {
        mo = moshi;
        return;
      }

      delay(50);
      //delay(wait);

      for (uint16_t i = 0; i < pixels.numPixels(); i = i + 3) {
        pixels.setPixelColor(i + q, 0);      //turn every third pixel off
      }
    }
  }
}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
    for (int q = 0; q < 3; q++) {
      for (uint16_t i = 0; i < pixels.numPixels(); i = i + 3) {
        pixels.setPixelColor(i + q, c);  //turn every third pixel on
      }
      pixels.show();
      Blinker.run();
      if (mo != moshi) {
        mo = moshi;
        return;
      }

      delay(wait);

      for (uint16_t i = 0; i < pixels.numPixels(); i = i + 3) {
        pixels.setPixelColor(i + q, 0);      //turn every third pixel off
      }
    }
  }
}
void colorWipe(uint32_t c, uint8_t wait) {
  for (uint16_t i = 0; i < pixels.numPixels(); i++) {
    pixels.setPixelColor(i, c);
    pixels.show();
    Blinker.run();
    if (mo != moshi) {
      mo = moshi;
      return;
    }
    delay(wait);
  }
}


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);

  colorR = 255;
  colorG = 165;
  colorB = 0;
  colorW = 50;
  wsState = true;

  pixels.begin();
  pixels.setBrightness(colorW);
  WS2812.attach(ws2812_callback);
  pixelShow();
}

void loop()
{
  Blinker.run();
  BLINKER_LOG("模式: ", moshi);
  switch (moshi)
  {
    case 2 ://影院
      theaterChaseRainbow();
      break;
    case 3 ://阅读
      rainbow();
      break;
    case 5 ://睡眠
      rainbowCycle();
      break;
  }
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值