ESP8266控制ws2812灯带(SPI协议)按键切换模式

#include<SPI.h>
//LED 灯珠数量
#define LED_NUMBER 60
//模拟0码 1111 1100
uint8_t CODE0 = 0xFC;
//模拟1码 1100 0000
uint8_t CODE1 = 0XC0;

void setup() {
  Serial.begin(115200);
  SPI.begin();
  //设置大小端
  SPI.setBitOrder(LSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  pinMode(D2, INPUT_PULLUP);
  for (int i = 0; i < LED_NUMBER; i++) {
    black();
  }
}

void whiteAll() {
  for (int i = 0; i < LED_NUMBER; i++) {
    white();
  }
}
void blackAll() {
  for (int i = 0; i < LED_NUMBER; i++) {
    black();
  }
}
void white() {
  for (int j = 0; j < 3; j++) {
    for (int k = 0; k < 8; k++) {
      SPI.transfer(CODE0);
    }
  }
}
void black() {
  for (int j = 0; j < 3; j++) {
    for (int k = 0; k < 8; k++) {
      SPI.transfer(CODE1);
    }
  }
}

int o = 0;
int colorBuffer[LED_NUMBER] = {0x329E00, 0x47A700, 0x5BAF00, 0x70B700, 0x84C000, 0x99C800, 0xADD100,  0xD6E100, 0xEBEA00, 0xFFF200, 0xFFDC00, 0xFFC600, 0xFFB000, 0xFF9A00, 0xFF8400, 0xFF6E00, 0xFF5800, 0xFF4200, 0xFF2C00, 0xFF1600};
void drawMarquee() {
  o = o % LED_NUMBER;
  for (int i = 0; i < LED_NUMBER; i++) {
    setColor(colorBuffer[(i + o) % 20]);
  }
  o++;
  delay(50);
}

void voiceDance() {
  int audio = analogRead(A0);
  int result = audio - 43;
  //Serial.println(audio);
  //b r g
  if (result >= 2) {
    for (int i = 0; i < 2; i++) {
      setColor(0x1E9600);
    }
  }
  if (result >= 5) {
    for (int i = 0; i < 2; i++) {
      setColor(0x5EB000);
    }
  }
  if (result >= 13) {
    for (int i = 0; i < 6; i++) {
      setColor(0xAED100);
    }
  }
  if (result >= 20) {
    for (int i = 0; i < 10; i++) {
      setColor(0xFFF200);
    }
  }
  if (result >= 30) {
    for (int i = 0; i < 10; i++) {
      setColor(0xFFAA00);
    }
  }
  if (result >= 120) {
    for (int i = 0; i < 10; i++) {
      setColor(0xFF0000);
    }
  }
  if (result >= 45) {
    for (int i = 0; i < 10; i++) {
      setColor(0xFF4900);
    }
  }
  blackAll();
  //delay(1);
}


void setColor(int color) {
  int r = (color & 0xff0000) >> 8;
  int g = (color & 0xff00) << 8;
  int b = color & 0xff;
  int grb = g + r + b;

  //从高到低
  for (int k = 0; k < 24; k++) {
    if (grb >> 23 & 0x1 == 1) {
      //Serial.println(1);
      SPI.transfer(CODE0);
    } else {
      SPI.transfer(CODE1);

      //Serial.println(0);
    }
    grb <<= 1;
  }
  return;
}

void orange() {
  for (int i = 0; i < LED_NUMBER; i++) {
    //setColor(0xFFFF37);
    setColor(0xFFDC35);
    //setColor(0xFFFF6F);
    //setColor(0xFFE153);
    //setColor(0xFFFF93);
    //setColor(0xFFE66F);
    //setColor(0xFFFFAA);
    //setColor(0xFFED97);
    //setColor(0xFFFFB9);
    //setColor(0xFFF0AC);
  }
  delay(100);
}
uint8_t stat = 0;

void loop() {
  int buttonState = digitalRead(D2);
  if (buttonState == LOW) {
    delay(25);
    if (buttonState == LOW) {
      stat++;
      stat = stat % 4;
      delay(250);
    }
  }
  switch (stat) {
    case 0:
      whiteAll();
      break;
    case 1:
      orange();
      break;
    case 2:
      voiceDance();
      break;
    case 3:
      drawMarquee();
      break;
    default:
      whiteAll();
  }
}
好的,我会为您解答。首先,您需要准备以下材料: 1. ESP8266开发板 2. WS2812灯带 3. 电容(建议使用1000uf或以上) 4. 麦克风模块 接下来,您需要按照以下步骤进行操作: 1. 将ESP8266开发板连接到计算机,并打开Arduino IDE。 2. 在Arduino IDE中,选择正确的开发板和端口,并下载并安装ESP8266库。 3. 下载并安装Adafruit_NeoPixel库,这个库可以帮助我们控制WS2812灯带。 4. 连接WS2812灯带ESP8266开发板。将灯带的VCC引脚连接到ESP8266的3.3V引脚,将灯带的GND引脚连接到ESP8266的GND引脚,将灯带的数据引脚连接到ESP8266的D2引脚。 5. 连接电容到ESP8266的3.3V和GND引脚之间,这可以帮助稳定电压。 6. 连接麦克风模块到ESP8266开发板。将麦克风模块的VCC引脚连接到ESP8266的3.3V引脚,将麦克风模块的GND引脚连接到ESP8266的GND引脚,将麦克风模块的输出引脚连接到ESP8266的A0引脚。 7. 在Arduino IDE中打开示例程序“File->Examples->Adafruit_NeoPixel->strandtest”。 8. 将程序中的灯带引脚修改为D2引脚,并上传程序到ESP8266开发板。 9. 在Arduino IDE中打开示例程序“File->Examples->ESP8266->FFT”,这个程序可以帮助我们对声音进行处理。 10. 将程序中的麦克风引脚修改为A0引脚,并上传程序到ESP8266开发板。 11. 现在,您可以尝试用声音来控制WS2812灯带了。例如,您可以尝试在程序中添加一些代码,使得当检测到声音时,灯带会闪烁或者变换颜色。 希望这些步骤能够帮助您成功实现用ESP8266控制WS2812灯带的声控灯。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值