该项目主要参考了立创EDA开源广场的项目:

esp8285芯片ESP-01F模块为主控,MAX9814音频采集模块,WS2812 2020rgb灯珠,Arduino编程环境简单制作一个律动灯条。

因为正在学习硬件PCB,所以只能算是一个仿照。

硬件:

下面附上原理图和pcb:

相比原项目,我做的只是一个学习项目,为了能白嫖pcb打样,原来的30个ws2812我只用了20个,原项目的自动下载电路IMH3A因为太贵了淘宝还不包邮就换成了两个L8050Q,因为是后面画好pcb买材料时发现的,所以L8050Q没有位置放了,所以pcb就不是长条形状了。只能往外面扩展了。

为了板子好看所以把所有元件的丝印都去掉了,看的时候不是很方便。我第一次尝试很小的板子布线,过孔也不少,但还是学到些东西。

这个项目主要采用的一节锂电池就行,大概在4v左右,标的是3.7v。通过typeC充电,LED指示。

通过MAX9814进行音频采集模拟值。

上面标注了DC offset(直流偏移):1.2v。而esp8285或者8266的ADC采样只能接收1v,所以采集的ADC信号要进行串联电阻分压,具体咪头电路详解可以参照:

卓大大的咪头电路分析

所以电压信号是一个在不断变化的类似交流信号向上偏置的结果。

下面附上pcb和原理图资料:

EDA版本和AD版本的pcb和原理图

软件:

主要需要库有:

注意这个库的最新版本我的有错误,如果运行发现程序出错的显示库里面有错,建议下载旧版本试试。

ADC采样:

采集ADC的引脚是A0。

因为是关于1.25v上下波动的,所以把采集到的ADC减去1.25v即默认没有声音下采集到的电压值。(我测到的是480)

ws2812灯的点亮:

利用这个simple库可以轻松点亮灯以及改变颜色。

定义好引脚和灯的数量

用 RGB点亮第i个灯。

滤波:

我利用过均值滤波,冒泡排序取中值发现效果都不好,所以又去掉了,采用了十个值求平均值,这里可以再试试不滤波

下面把均值滤波+冒泡排序滤波和普通均值滤波两种最后调出的可行的代码附上:

均值滤波+冒泡排序滤波:

参考:

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library#include <Adafruit_NeoPixel.h>#define NOISE 5       //噪音底线#ifdef __AVR__#include <avr/power.h>
#endif// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            13// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      20// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);int delayval = 10; // delay for half a secondvoid setup() {// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif// End of trinket special codepixels.begin(); // This initializes the NeoPixel library.Serial.begin(115200);
}void loop() {int ADC_VALUE[100];int last_VALUE=0;int ADC_sort[10];int light_ADC=0;for(int i=0;i<100;i++){ADC_VALUE[i]=analogRead(A0);}for(int i=0;i<10;i++){int ADC_compute=0;for(int j=i*10;j<(i*10+10);j++){ADC_compute+=ADC_VALUE[j];}ADC_sort[i]=ADC_compute/10;}last_VALUE=last_VALUE/10;//平均值滤波,10个,上面//下面冒泡排序,优化版本int my_position = 9;for(int i=0;i<9;i++){boolean isSwap = false;int newPosition = 0;for(int j=0;j<my_position;j++){if(ADC_sort[j]>ADC_sort[j+1]){int temp=ADC_sort[j];ADC_sort[j]=ADC_sort[j+1];ADC_sort[j+1]=temp;isSwap = true;  newPosition = j;       }if(!isSwap){break;}my_position = newPosition;}}light_ADC=(ADC_sort[5]+ADC_sort[6])/2;light_ADC = abs(475 - light_ADC);//  Serial.println( light_ADC);light_ADC = (light_ADC <= NOISE) ? 0 : light_ADC; int num;if(light_ADC<12){num=light_ADC/2;}else{num=light_ADC/3;}if(num>=21){num=20;}   for(int i=0;i<num;i++){if(i<=10){pixels.setPixelColor(i, pixels.Color(50,255-i*25,0)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware.delay(7);}else{pixels.setPixelColor(i, pixels.Color(50,5,255-(i-10)*25)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware.delay(7);}}for(int i=num;i>=0;i--){pixels.setPixelColor(i, pixels.Color(0,0,0)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware.delay(7);}}// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

普通均值滤波:

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library#include <Adafruit_NeoPixel.h>#define NOISE 40       //噪音底线#ifdef __AVR__#include <avr/power.h>
#endif// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            13// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      20// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);void setup() {// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif// End of trinket special codepixels.begin(); // This initializes the NeoPixel library.Serial.begin(115200);
}void loop() {int ADC_VALUE[100];int last_VALUE=0;int ADC_sort[10];int light_ADC=0;int ADC_compute=0;for(int i=0;i<10;i++){ADC_compute+=analogRead(A0);}last_VALUE=ADC_compute/10;//平均值滤波,10个,上面light_ADC=last_VALUE;light_ADC=abs(last_VALUE-480);light_ADC = (light_ADC <= NOISE) ? 0 :(light_ADC-15); Serial.println(abs(last_VALUE-480));int num;num=light_ADC/8;if(num>=21){num=20;}   for(int i=0;i<num;i++){if(i<=10){pixels.setPixelColor(i, pixels.Color(50,255-i*25,0)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware.delay(10);}else{pixels.setPixelColor(i, pixels.Color(50,5,255-(i-10)*25)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware.delay(10);}}// delay(10);for(int i=num;i>=0;i--){pixels.setPixelColor(i, pixels.Color(0,0,0)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware.delay(1);}}// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

主要是把灯挨个点亮,再挨个熄灭,把采集到的ADC除以某个数计算点的个数。

附上实物图:

按键买错了,所以焊接成那样了

主要材料:

这个轻触开关我买错了,封装买大了:

不完善之处:这个灯感觉采集的值不是线性的,所以计算点亮灯的个数的计算方法还有待改进,按键啥的还没用到,网页啥的也没写,esp8266这些感觉开发不是很方便,库隐藏起来还需要到本地文件找,下载程序也比起keil要慢一些。

ESP8285+WS2812+MAX9814制作的音乐律动氛围灯相关推荐

  1. e300氛围灯哪里调节_保时捷macan内饰改装升级32色呼吸氛围灯

    保时捷MACAN虽然有着不俗的外表,豪华的内饰,但是车内氛围却总还是缺少了那么一丢丢,随着新车的更新,车友对汽车的内饰特别的着重,品味也在逐步提升,汽车氛围灯也随之诞生,目前新车系都几乎标配各种各种的 ...

  2. Arduino与Proteus仿真实例-WS2812实现音乐氛围灯仿真

    WS2812实现音乐氛围灯仿真 本文将使用WS2812实现一个音乐氛围灯.Arduino通过检测音频信号强度,然后转换成W2812灯带驱动信号,从而实现音乐氛围灯. WS2812的驱动和使用在前面的文 ...

  3. 驱动音乐律动(全局)

    文档索引 提示 1.点击进入音乐律动页面 2.音乐频谱显示器 3.开关 4.5.切换律动的灯效 6.调整驱动上的频谱跳动幅度 7.调整驱动上律动峰值点的停留时间 8.调整驱动上律动峰值点下落的速度 9 ...

  4. 用Arduino和ws2812拾音氛围灯

    用Arduino和ws2812拾音氛围灯 材料 功能 逐个点亮 逐个熄灭 呼吸灯 拾音灯 炫彩光环 总代码 材料 1.ws2812环形灯带 2.声音传感器(带模拟量输出) 3.Arduino开发板(全 ...

  5. 演练 制作百度音乐标签页面 0929

    演练 制作百度音乐标签页面 0929 期望效果 文字素材 全部歌手 A A Fine Frenzy Air Supply Akon Alan Silvestri Apink 安又琪 安在旭 安室奈美惠 ...

  6. 大班音乐机器人反思_幼儿园大班音乐律动教案《伦敦桥》含反思

    大班音乐律动教案<伦敦桥>含反思适用于大班的音乐主题教学活动当中,让幼儿在造型的基础上,探索"船"河"桥洞"不同方向随音乐律动的可能性,运用已有经验 ...

  7. 手机计算机dj音乐,教你如何用手机制作电子音乐

    随着手机性能的提高,在手机上制作电子音乐并不是什么难事,接下来就为大家介绍一些可以在手机上使用的合成器应用. Cakewalk Z3TA + Cakewalk Z3TA +与它的Mac和Windows ...

  8. 电子琴节奏包制作_MIDI音乐制作基础必备

    MIDI音乐制作基础必备 `) {; Y: y6 F; Y( |www.zgycgc.com  zgycgc.com) K2 p2 a1 U  b9 i3 u, P. B1 Z; `www.zgycg ...

  9. Android酷炫音乐律动动效部署到Maven仓库

    篇章目标要点 此前自行开发了2项音乐律动动效,分别是实现酷我音乐的流星雨动效和实现网易云音乐的粒子动效,为了便于开发和使用,将相应动效库部署到Gitee上,以公开库的形式提供给大家使用.本文记录了构建 ...

  10. 利用PyQt5制作本地音乐播放器

    介绍 本文是对之前的音乐播放器的一些改进和功能实现.只写了有变化的部分,具体部分请看上一篇博客. [利用PyQt5和QSS制作本地音乐播放器(初稿)](https://blog.csdn.net/we ...

最新文章

  1. iOS webview 点击按钮返回上一页面或者返回首页
  2. sketch如何做设计稿交互_交互设计师是做什么的——交互设计的历史、现状和未来...
  3. 深度剖析Zabbix Web scenarios数据表结构
  4. php java if_phpjava(二)
  5. (常用API)正则表达式邮箱地址验证
  6. Qt工作笔记-重写滚轮事件,实现界面的增加、减少(放大、缩小)
  7. Mac下安装virtualenvwrapper提示ERROR: No matching distribution found for pbr
  8. git 应用 rebase
  9. 选书不迷茫,国内原创佳作推荐,附赠神级优惠码༼⍤༽
  10. 4.3.8 使用模板
  11. Python安装word2vec环境依赖
  12. Linux中常见的ping不通百度问题
  13. 在浏览器中打开“只能用微信内置浏览器”打开的页面
  14. 微信支付证书如何部署在linux,微信支付平台证书更新指引
  15. 昆石VOS2009/VOS3000 2.1.6.00 Web接口说明书
  16. 基于Spring+SpringMVC+Beetl的权限管理框架源码分享
  17. 利用for语句,编程输出如下图形:* *** *****
  18. matlab画图总结——二维图plot函数、图形标注和坐标轴控制、饼图、条形图、排列图;三维图的绘制
  19. #174-D: expression has no effect报错解决方法
  20. 雷达有源干扰——噪声卷积干扰

热门文章

  1. 下载vc_redist运行库
  2. Java数组对象排序
  3. android studio 单元测试详解
  4. jmeter连接mysql并定义变量提供给后续接口使用
  5. java串口监控数据,怎样监听或者拦截串口上的数据
  6. 智能车制作——从元器件、机电系统、控制算法到完整的智能车设计|文末赠书
  7. angularjs select 下拉加载option 默认选中第一行为空格的解决办法
  8. Java 菜鸟入门 | Java中的静态变量、实例变量、局部变量和成员变量
  9. 前端微信小程序开发基础
  10. spring定时器的使用