站内搜索
更多
【训练营】MOLUN炫彩灯
标准版

【训练营】MOLUN炫彩灯

简介

1.基于涂鸦WB3S模块制作的智能炫彩灯,支持外接红外控制!可以查看@gpdi的项目 2.基于ESP-12S控制WS2812B炫彩灯,通过点灯blinker接入小爱同学,可以APP和小爱同学语音控制!

简介:1.基于涂鸦WB3S模块制作的智能炫彩灯,支持外接红外控制!可以查看@gpdi的项目 2.基于ESP-12S控制WS2812B炫彩灯,通过点灯blinker接入小爱同学,可以APP和小爱同学语音控制!

开源协议

GPL 3.0

创建时间:2020-11-24 21:00:52更新时间:2021-07-01 11:54:11

描述

涂鸦WB3S方案炫彩灯

主控采用涂鸦智能WB3S模块,USB供电,两段式拨动开关,采用AMS1117 3.3 线性稳压器(LDO) 降压至3.3V给模组供电,LED1为Red电源指示灯。
IR + -为外接红外接收模组,可以焊接排母插入模组,也可以直接焊接红外接收模组,可选操作(手里有就可以利用起来)(注意需要根据遥控在涂鸦平台设置固件时设置遥控键值)
电路板背面预留3颗 5050 RGB共阳灯珠,方便单板使用。R G B 5V为外接灯带排针,直排、弯针随意,可以外接灯带或者另做灯板用于级联延长(增加)RGB灯。
002.jpg
微信图片_20201126140408.jpg

ESP8266炫彩灯方案

基于ESP-12S控制WS2812B炫彩灯,通过点灯blinker接入小爱同学,可以APP和小爱同学语音控制!
ESP-12S GPIO13 控制WS2812B RGB灯,可以实现APP、小爱语音控制炫彩灯开关、调整颜色、定时开关、切换显示模式。
微信图片_20201206001311.jpg
微信图片_20201206001307.jpg
微信图片_20201206001316.jpg
微信图片_20201206001325.jpg微信图片_20201206002904.jpg

实例代码

通过Arduino编写程序,接入点灯科技,并对接小爱同学!

/*代码源于网络,源地址找不到了,进行了二次修改,采用SMARTCONFIG进行配网:
* 灯光效果目前的循环模式是,每循环一次效果检测一下blinker的新命令,所以会有blinker app按键不能及时同步的情况,同样语音助手也
* 可能迟钝。blinker有频次限制暂时做不到随时中断灯效下的循环。
*
* 这次的代码新增了fastled示例中的cylon,同时也有之前adafruit_nexopixel中的示例。大家可以看自己的喜好添加效果。
*
* 具体的流程:blinker app设置控件--关联智能家具--编译、上传代码到开发板  相关教程参考电灯科技的官方开发文档与教程,也欢迎交流。
*
* 预设五种模式+调色盘 除按键1外,默认都是先用调色盘调亮度物种模式才能正常显示。大家可以更改预设哈。

*/

#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#define BLINKER_ESP_SMARTCONFIG

#include <Blinker.h>
#include <FastLED.h>

/////////////////////////////////////blinker设备的授权码
char auth[] = "1e650860bd51";
////////////////////////////////////////五个开关按键 一个滑条 一个调色盘
BlinkerButton Button1("ButtonKey1");
BlinkerButton Button2("ButtonKey2");
BlinkerButton Button3("ButtonKey3");
BlinkerButton Button4("ButtonKey4");
BlinkerButton Button5("ButtonKey5");
BlinkerSlider Slider1("SliderKey");
BlinkerRGB RGBWS2812("RGBKey");


int openState = 0;/////////////////////////////灯效模式,默认关灯
int freq_flash = 25;/////////////////////////灯效节奏
uint8_t colorR, colorG, colorB, colorW;
bool wsState;
uint8_t wsMode = BLINKER_CMD_MIOT_DAY;


#include <Adafruit_NeoPixel.h>

#define PIN            13                               /////ws2812 DAT 接的引脚编号,注意开发板不同,请更改
#define NUMPIXELS      32                                ////ws2812 灯数
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);//////////////////////Adafruit_NeoPixel


CRGB leds[NUMPIXELS];//////////////FASTLED

//////////////////////////////////////颜色写入
void pixelShow()
{
  pixels.setBrightness(colorW);

  for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, colorR, colorG, colorB);
  }
  pixels.show();
}

/////////////////////////////////////////频率读取
void tip_led()
{
  digitalWrite(2, HIGH);
  delay(50);
  digitalWrite(2, LOW);
  Blinker.vibrate();
}

void slider1_callback(int32_t value)
{
  tip_led();
  Blinker.vibrate();///震动
  BLINKER_LOG("get slider value: ", value);
  freq_flash = value;
}


////////////////////////////////////////////////调色盘

void ws2812_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)
{
  tip_led();
  button_clear();
  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;
  openState = 6;
  //Text1.print("灯光模式:" , "单颜色");
}

void button_clear()
{
  Button1.print("off");
  Button2.print("off");
  Button3.print("off");
  Button4.print("off");
  Button5.print("off");
  Button1.color("#008000");
  Button2.color("#008000");
  Button3.color("#008000");
  Button4.color("#008000");
  Button5.color("#008000");
}

//////////////////////////////////////////////////////////btn1
void button1_callback(const String & state)
{
  tip_led();
  BLINKER_LOG("get button state: ", state);

  if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("日光 music 模式开启");
    tip_led();
    button_clear();
    Button1.color("#DC143C");
    Button1.print("on");
    openState = 1;
  }
  else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("日光 music 模式关闭!");
    tip_led();
    button_clear();
    Button1.color("#008000");
    openState = 0;
  }

}

//////////////////////////////////////////////////////////btn2
void button2_callback(const String & state)
{
  tip_led();
  BLINKER_LOG("get button state: ", state);

  if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("月光模式开启");
    tip_led();
    button_clear();
    Button2.print("on");
    Button2.color("#DC143C");
    openState = 2;
  }
  else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("月光模式关闭!");
    tip_led();
    button_clear();
    openState = 0;
  }

}

//////////////////////////////////////////////////////////btn3
void button3_callback(const String & state)
{
  tip_led();
  BLINKER_LOG("get button state: ", state);

  if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("温馨模式开启");
    tip_led();
    button_clear();
    Button3.print("on");
    Button3.color("#DC143C");
    openState = 3;
  }
  else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("温馨模式关闭!");
    tip_led();
    button_clear();
    openState = 0;
  }

}

//////////////////////////////////////////////////////////btn4
void button4_callback(const String & state)
{
  tip_led();
  BLINKER_LOG("get button state: ", state);

  if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("电脑模式开启");
    tip_led();
    button_clear();
    Button4.print("on");
    Button4.color("#DC143C");
    openState = 4;
  }
  else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("电脑模式关闭!");
    tip_led();
    button_clear();
    openState = 0;
  }

}

//////////////////////////////////////////////////////////btn5
void button5_callback(const String & state)
{
  tip_led();
  BLINKER_LOG("get button state: ", state);

  if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("电视模式开启");
    tip_led();
    button_clear();
    Button5.print("on");
    Button5.color("#DC143C");
    openState = 5;
  }
  else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("电视模式关闭!");
    tip_led();
    button_clear();
    openState = 0;

  }

}

void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);

  Blinker.vibrate();

  uint32_t BlinkerTime = millis();

  Blinker.print("millis", BlinkerTime);
}

uint32_t getColor()
{
  uint32_t color = colorR << 16 | colorG << 8 | colorB;

  return color;
}


void miotPowerState(const String & state)
{
  BLINKER_LOG("need set power state: ", state);

  if (state == BLINKER_CMD_ON) {
    tip_led();
    BlinkerMIOT.powerState("on");
    BlinkerMIOT.print();

    wsState = true;

    if (colorW == 0) colorW = 255;
    openState = 6;
  }
  else if (state == BLINKER_CMD_OFF) {
    tip_led();

    BlinkerMIOT.powerState("off");
    BlinkerMIOT.print();

    wsState = false;
    openState = 0;
  }
}

void miotColor(int32_t color)
{
  BLINKER_LOG("need set color: ", color);

  colorR = color >> 16 & 0xFF;
  colorG = color >>  8 & 0xFF;
  colorB = color       & 0xFF;

  BLINKER_LOG("colorR: ", colorR, ", colorG: ", colorG, ", colorB: ", colorB);
  openState = 6;
  //pixelShow();

  BlinkerMIOT.color(color);
  BlinkerMIOT.print();
}

void miotMode(uint8_t mode)
{
  BLINKER_LOG("need set mode: ", mode);

  if (mode == BLINKER_CMD_MIOT_DAY) {
    // Your mode function
    button_clear();
    Button1.print("on");
    Button1.color("#DC143C");
    openState = 1;
  }
  else if (mode == BLINKER_CMD_MIOT_NIGHT) {
    // Your mode function
    button_clear();
    Button2.print("on");
    Button2.color("#DC143C");
    openState = 2;
  }
  else if (mode == BLINKER_CMD_MIOT_COLOR) {
    // Your mode function
    button_clear();
    openState = 6;
  }
  else if (mode == BLINKER_CMD_MIOT_WARMTH) {
    // Your mode function
    button_clear();
    Button3.print("on");
    Button3.color("#DC143C");
    openState = 3;
  }
  else if (mode == BLINKER_CMD_MIOT_TV) {
    // Your mode function
    button_clear();
    Button5.print("on");
    Button5.color("#DC143C");
    openState = 5;
  }
  else if (mode == BLINKER_CMD_MIOT_READING) {
    // Your mode function
  }
  else if (mode == BLINKER_CMD_MIOT_COMPUTER) {
    // Your mode function
    button_clear();
    Button4.print("on");
    Button4.color("#DC143C");
    openState = 4;
  }

  wsMode = mode;

  BlinkerMIOT.mode(mode);
  BlinkerMIOT.print();
}

void miotBright(const String & bright)
{
  BLINKER_LOG("need set brightness: ", bright);

  colorW = bright.toInt();

  BLINKER_LOG("now set brightness: ", colorW);

  pixelShow();

  BlinkerMIOT.brightness(colorW);
  BlinkerMIOT.print();
  openState = 6;
}

void miotColoTemp(int32_t colorTemp)
{
  BLINKER_LOG("need set colorTemperature: ", colorTemp);

  BlinkerMIOT.colorTemp(colorTemp);
  BlinkerMIOT.print();
}

void miotQuery(int32_t queryCode)
{
  BLINKER_LOG("MIOT Query codes: ", queryCode);

  switch (queryCode)
  {
    case BLINKER_CMD_QUERY_ALL_NUMBER :
      BLINKER_LOG("MIOT Query All");
      BlinkerMIOT.powerState(wsState ? "on" : "off");
      BlinkerMIOT.color(0);
      BlinkerMIOT.mode(0);
      BlinkerMIOT.colorTemp(1000);
      BlinkerMIOT.brightness(1);
      BlinkerMIOT.print();
      break;
    case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
      BLINKER_LOG("MIOT Query Power State");
      BlinkerMIOT.powerState(wsState ? "on" : "off");
      BlinkerMIOT.print();
      break;
    case BLINKER_CMD_QUERY_COLOR_NUMBER :
      BLINKER_LOG("MIOT Query Color");
      BlinkerMIOT.color(0);
      BlinkerMIOT.print();
      break;
    case BLINKER_CMD_QUERY_MODE_NUMBER :
      BLINKER_LOG("MIOT Query Mode");
      BlinkerMIOT.mode(0);
      BlinkerMIOT.print();
      break;
    case BLINKER_CMD_QUERY_COLORTEMP_NUMBER :
      BLINKER_LOG("MIOT Query ColorTemperature");
      BlinkerMIOT.colorTemp(1000);
      BlinkerMIOT.print();
      break;
    case BLINKER_CMD_QUERY_BRIGHTNESS_NUMBER :
      BLINKER_LOG("MIOT Query Brightness");
      BlinkerMIOT.brightness(1);
      BlinkerMIOT.print();
      break;
    default :
      BlinkerMIOT.powerState(wsState ? "on" : "off");
      BlinkerMIOT.color(0);
      BlinkerMIOT.mode(0);
      BlinkerMIOT.colorTemp(1000);
      BlinkerMIOT.brightness(1);
      BlinkerMIOT.print();
      break;
  }
}


/**************************灯光效果程序**************************
* **************************************************
* **************************************************/

////////////////////////////////////////////////彩虹灯
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 rainbow(uint8_t wait) {
  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();
    delay(freq_flash);
  }
}


////////////////////////////////////////////////////////////////
void colorWipe(uint32_t c, uint8_t wait) {
  for (uint16_t i = 0; i < pixels.numPixels(); i++) {
    pixels.setPixelColor(i, c);
    pixels.show();
    delay(wait);
  }
}

void colorScan()
{
  colorWipe(pixels.Color(255, 0, 0), freq_flash); // Red
  colorWipe(pixels.Color(0, 255, 0), freq_flash); // Green
  colorWipe(pixels.Color(0, 0, 255), freq_flash);
  colorWipe(pixels.Color(0, 255, 255), freq_flash);
  colorWipe(pixels.Color(255, 0, 255), freq_flash);
  colorWipe(pixels.Color(255, 0, 0), freq_flash);

}

///////////////////////////////////FASTLEDS的示例效果
void fadeall() {
  for (int i = 0; i < NUMPIXELS; i++) {
    leds[i].nscale8(250);
  }
}

void cylon() {
  static uint8_t hue = 0;

  // First slide the led in one direction
  for (int i = 0; i < NUMPIXELS; i++) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(freq_flash);
  }

  // Now go in the other direction.
  for (int i = (NUMPIXELS) - 1; i >= 0; i--) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(freq_flash);
  }
}

void setup()
{
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);

  LEDS.addLeds<WS2812, PIN, RGB>(leds, NUMPIXELS);
  LEDS.setBrightness(84);

  Blinker.begin(auth);
  pixels.begin();
  Blinker.attachData(dataRead);

  BlinkerMIOT.attachPowerState(miotPowerState);
  BlinkerMIOT.attachColor(miotColor);
  BlinkerMIOT.attachMode(miotMode);
  BlinkerMIOT.attachBrightness(miotBright);
  BlinkerMIOT.attachColorTemperature(miotColoTemp);
  BlinkerMIOT.attachQuery(miotQuery);

  pinMode(14, OUTPUT);
  digitalWrite(14, HIGH);
  pinMode(15, OUTPUT);
  digitalWrite(15, HIGH);

  Button1.attach(button1_callback);
  Button2.attach(button2_callback);
  Button3.attach(button3_callback);
  Button4.attach(button4_callback);
  Button5.attach(button5_callback);
  Slider1.attach(slider1_callback);
  RGBWS2812.attach(ws2812_callback);
  pixels.setBrightness(0);
  button_clear();
}

////////////////////以下是灯光效果模式,请自行更改

void mode_1()
{
cylon();
}

void mode_2()
{
  colorR = 25;
  colorG = 0;
  colorB = 240;
  colorW = 50;
  wsState = true;
  pixelShow();
}

void mode_3()
{
  colorR = 128;
  colorG = 0;
  colorB = 128;
  colorW = 50;
  wsState = true;
  pixelShow();
}

void mode_4()
{
  rainbow(freq_flash);
  colorW = 50;
}

void mode_5()
{
  colorW = 50;
  colorScan();
}

void loop()
{

  Blinker.run();

  switch (openState)
  {
    case 0:
      wsState = false;
      openState = 0;
      colorR = 255;
      colorG = 255;
      colorB = 255;
      colorW = 0;
      pixelShow();
      break;
    case 1:
      mode_1();
      break;
    case 2:
      mode_2();
      break;
    case 3:
      mode_3();
      break;
    case 4:
      mode_4();
      break;
    case 5:
      mode_5();
      break;
    case 6:
      pixelShow();
      break;
    default:
      break;
  }
}

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
WeChat_20201206001331.mp4
154
2
WeChat_20201208114440.mp4
75
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航