用Arduino和ws2812拾音氛围灯

材料

1、ws2812环形灯带
请添加图片描述
2、声音传感器(带模拟量输出)
请添加图片描述
3、Arduino开发板(全系列可用)
请添加图片描述

功能

因为ws2812灯带全彩特性,可以实现很多效果,这里我实现了逐个点亮、逐个熄灭、呼吸灯、拾音氛围灯、炫彩光环的功能。这里控制RGB灯带所用到的库为Adafruit_NeoPixel库。

逐个点亮

void onebyl()  //逐个熄灭
{ 
  pixels.setBrightness(0);
  for(int i=0;i<=NUMPIXELS;i++)
  {
    pixels.setBrightness(lumm);//亮度
    pixels.setPixelColor(i, pixels.Color(0,200,200)); //颜色设置
    pixels.show(); // 更新灯带显示
    delay(500); 
  }
}

逐个熄灭

逐个熄灭就是逐个点亮反过来

void onebym()  //逐个熄灭
{ 
  pixels.setBrightness(lumm);//亮度
  for(int i=NUMPIXELS;i>=0;i--)
  {
    pixels.setPixelColor(i, pixels.Color(0,0,0)); //颜色设置
    pixels.show(); // 更新灯带显示
    delay(500);
  }
}

呼吸灯

void breathing()  //呼吸灯
{
  for(int i=1;i<=200;i=i+5)
  {
    pixels.setBrightness(i);
    pixels.show();
    delay(10);
  }
  for(int i=200;i>=10;i=i-5)
  {
    pixels.setBrightness(i);
    pixels.show();
    delay(10);
  }
}

拾音灯

void pickup()  //拾音灯
{
  pixels.setBrightness(0);
  fre=analogRead(ain);
  Serial.println(fre);
  int ix=map(fre,490,600,0,6);
  for(int i=-1;i<=ix;i++)
  {        
    int iz,iy;
    iz = i;
    iy = map(i,1,6,11,6);  
    if(i<=3)
    {
      pixels.setPixelColor(iz, pixels.Color(0,255,200));
      pixels.setPixelColor(iy, pixels.Color(0,255,200));
    }
    else if(i>3&&i<6)
    {
      pixels.setPixelColor(iz, pixels.Color(170,255,0));
      pixels.setPixelColor(iy, pixels.Color(170,255,0));
    }
    else if(i==6)
    {
      pixels.setPixelColor(iz, pixels.Color(255,0,0));
    }
    pixels.setBrightness(lumm);
    pixels.show();
    //delay(10);
  } 
}

这里需要调几个参数,我们通过读取声音传感器输出的模拟量来控制灯带显示,所以需要对声音传感器的输出量,也就是灵敏度进行设置,通过以下代码读取声音传感器数据:

int Din=2;   //DOUT接引脚2
int Ain=A0;  //AOUT接引脚A0
int value;
void setup()
{
  pinMode(Din,INPUT);
  pinMode(Ain,INPUT);
  Serial.begin(115200);
}
void loop()
{
  value=analogRead(Ain);
  Serial.println(value);
  delay(100);
}

打开串口根据安静环境与音乐环境对比结合波动得出最大值和最小值。
在这里插入图片描述

发现数据不稳定时可以适当的通过声音传感器上自带的旋钮更改灵敏度。
请添加图片描述
通过调节得到的数据在代码中更改

int ix=map(fre,490,600,0,6);

这里我做的是两边往中间靠的显示效果,所以映射的只有一半灯珠数量。

炫彩光环

void colorful()  //炫彩光效
{
  pixels.setBrightness(lumm);
  for(int i=1;i<=NUMPIXELS;i++)
  {
    //红
    pixels.setPixelColor( i , pixels.Color(255,0,0));
    pixels.setPixelColor(i+1, pixels.Color(255,0,0));
    //黄
    pixels.setPixelColor(i+2, pixels.Color(255,255,0));
    pixels.setPixelColor(i+3, pixels.Color(255,255,0));
    //绿
    pixels.setPixelColor(i+4, pixels.Color(0,255,0));
    pixels.setPixelColor(i+5, pixels.Color(0,255,0));
    //蓝
    pixels.setPixelColor(i+6, pixels.Color(0,0,255));
    pixels.setPixelColor(i+7, pixels.Color(0,0,255));
    //青
    pixels.setPixelColor(i+8, pixels.Color(0,255,255));
    pixels.setPixelColor(i+9, pixels.Color(0,255,255));
    //紫
    pixels.setPixelColor(i+10, pixels.Color(255,0,255));
    pixels.setPixelColor(i+11, pixels.Color(255,0,255));
    //紫
    pixels.setPixelColor(i-1, pixels.Color(255,0,255));
    pixels.setPixelColor(i-2, pixels.Color(255,0,255));
    //青
    pixels.setPixelColor(i-3, pixels.Color(0,255,255));
    pixels.setPixelColor(i-4, pixels.Color(0,255,255));
    //蓝
    pixels.setPixelColor(i-5, pixels.Color(0,0,255));
    pixels.setPixelColor(i-6, pixels.Color(0,0,255));
    //绿
    pixels.setPixelColor(i-7, pixels.Color(0,255,0));
    pixels.setPixelColor(i-8, pixels.Color(0,255,0));
    //黄
    pixels.setPixelColor(i-9, pixels.Color(255,255,0));
    pixels.setPixelColor(i-10, pixels.Color(255,255,0));
    //红
    pixels.setPixelColor(i-11, pixels.Color(255,0,0));
    //刷新颜色
    pixels.show();
    delay(60);
    }  
}

总代码

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

//引脚 5
#define PIN 5
//灯珠数量
#define NUMPIXELS  12
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
//
int din=2;
int ain=A1;
//
int lumm,fre;

void setup() 
{
  Serial.begin(115200);
  pixels.begin(); //初始化灯带

}

void loop() 
{ 
  lumsz(5);  //全局亮度设置

  
  pickup();  //拾音
 
  

   
}

void lumsz(int lum)  //全局亮度设置
{
  //lum=analogRead(A0);
  //Serial.println(lum);
  if(lum!=lumm)
  {
    pixels.setBrightness(lum);
    pixels.show();
    lumm=lum;
    
  }
}

void onebyl()  //逐个点亮
{
  pixels.setBrightness(0);
  for(int i=0;i<=NUMPIXELS;i++)
  {
    pixels.setBrightness(lumm);
    pixels.setPixelColor(i, pixels.Color(0,200,200)); //颜色设置
    pixels.show(); // 更新灯带显示
    delay(500); 
  }
}

void onebym()  //逐个熄灭
{
  pixels.setBrightness(lumm);
  for(int i=NUMPIXELS;i>=0;i--)
  {
    pixels.setPixelColor(i, pixels.Color(0,0,0)); //颜色设置
    pixels.show(); // 更新灯带显示
    delay(500);
  }
}

void breathing()  //呼吸灯
{
  for(int i=1;i<=200;i=i+5)
  {
    pixels.setBrightness(i);
    pixels.show();
    delay(10);
  }
  for(int i=200;i>=10;i=i-5)
  {
    pixels.setBrightness(i);
    pixels.show();
    delay(10);
  }
}

void pickup()  //拾音灯
{
  pixels.setBrightness(0);
  fre=analogRead(ain);
  Serial.println(fre);
  int ix=map(fre,490,600,0,6);
  for(int i=-1;i<=ix;i++)
  {        
    int iz,iy;
    iz = i;
    iy = map(i,1,6,11,6);  
    if(i<=3)
    {
      pixels.setPixelColor(iz, pixels.Color(0,255,200));
      pixels.setPixelColor(iy, pixels.Color(0,255,200));
    }
    else if(i>3&&i<6)
    {
      pixels.setPixelColor(iz, pixels.Color(170,255,0));
      pixels.setPixelColor(iy, pixels.Color(170,255,0));
    }
    else if(i==6)
    {
      pixels.setPixelColor(iz, pixels.Color(255,0,0));
    }
    pixels.setBrightness(lumm);
    pixels.show();
    //delay(10);
  }
  
}

void colorful()  //炫彩光效
{
  pixels.setBrightness(lumm);
  for(int i=1;i<=NUMPIXELS;i++)
  {
    //红
    pixels.setPixelColor( i , pixels.Color(255,0,0));
    pixels.setPixelColor(i+1, pixels.Color(255,0,0));
    //黄
    pixels.setPixelColor(i+2, pixels.Color(255,255,0));
    pixels.setPixelColor(i+3, pixels.Color(255,255,0));
    //绿
    pixels.setPixelColor(i+4, pixels.Color(0,255,0));
    pixels.setPixelColor(i+5, pixels.Color(0,255,0));
    //蓝
    pixels.setPixelColor(i+6, pixels.Color(0,0,255));
    pixels.setPixelColor(i+7, pixels.Color(0,0,255));
    //青
    pixels.setPixelColor(i+8, pixels.Color(0,255,255));
    pixels.setPixelColor(i+9, pixels.Color(0,255,255));
    //紫
    pixels.setPixelColor(i+10, pixels.Color(255,0,255));
    pixels.setPixelColor(i+11, pixels.Color(255,0,255));
    //紫
    pixels.setPixelColor(i-1, pixels.Color(255,0,255));
    pixels.setPixelColor(i-2, pixels.Color(255,0,255));
    //青
    pixels.setPixelColor(i-3, pixels.Color(0,255,255));
    pixels.setPixelColor(i-4, pixels.Color(0,255,255));
    //蓝
    pixels.setPixelColor(i-5, pixels.Color(0,0,255));
    pixels.setPixelColor(i-6, pixels.Color(0,0,255));
    //绿
    pixels.setPixelColor(i-7, pixels.Color(0,255,0));
    pixels.setPixelColor(i-8, pixels.Color(0,255,0));
    //黄
    pixels.setPixelColor(i-9, pixels.Color(255,255,0));
    pixels.setPixelColor(i-10, pixels.Color(255,255,0));
    //红
    pixels.setPixelColor(i-11, pixels.Color(255,0,0));
    //刷新颜色
    pixels.show();
    delay(60);
    }
    
  
}

由于后期我要将亮度单独用旋钮设置,并且加入手势识别以及用3D打印设计外壳,所以里面有些代码结构是为以后做准备的。
需要的功能可以在主函数中更改。

void loop() 
{ 
  lumsz(5);  //全局亮度设置  
  pickup();  //拾音   
}

版权声明:本文为CSDN博主「Gen.save」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50767257/article/details/119649645

生成海报
点赞 0

Gen.save

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

数码管轮播显示

硬件: 数码管10个引脚,8个控制二极管亮、灭,2个引脚为负极。1k欧电阻链接负极,接gnd。 将8个二极管引脚依次链接0-7号引脚。 软件: /*共阳极单数码管显示&