2021-12-18 22:43:31 [显示全部楼层]
486浏览
查看: 486|回复: 2

Mind+Python声控炫彩灯

[复制链接]
本帖最后由 云天 于 2021-12-18 22:58 编辑

IMG_20211218_193302.jpg
【项目设计】
见过网络上的声控炫灯,多数需要使用模拟拾音模块。本项目使用Python来播放和分析音频,再通过Pinpong库,让Arduino控制LED根据音乐亮灯。
【设计分析】
1、使用WAV格式的音乐文件,从网络上下载的MP3音乐文件,可通过在线转换成WAV格式:https://convertio.co/zh/audio-converter/
2、使用“wave”库对音频数据进行分析
3、使用“pyaudio”库播放音频
【程序设计】使用Mind+Python模式
SatDecember-202112184326..png

程序代码:

  1. import warnings
  2. warnings.simplefilter("ignore", DeprecationWarning)#防止报警告
  3. import pyaudio
  4. import wave
  5. import numpy as np
  6. import pygame,random
  7. from pygame.locals import *
  8. from pinpong.board import Board,Pin,NeoPixel
  9. NEOPIXEL_PIN = Pin.D2
  10. PIXELS_NUM = 60 #灯数
  11. Board("uno").begin()  #初始化,选择板型和端口号,不输入端口号则进行自动识别
  12. npy = NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM)
  13. CHUNK = 2048#我把它理解为缓冲流
  14. wf = wave.open("ydy.wav", 'rb')#以只读的方式打开"1qom8-vi8uq.wav"文件
  15. #创建播放器
  16. p = pyaudio.PyAudio()
  17. #打开数据流  output=True表示音频输出
  18. stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
  19.                 channels=wf.getnchannels(),#设置声道数
  20.                 rate=wf.getframerate(),#设置流的频率
  21.                 output=True)
  22. data = wf.readframes(CHUNK)#音频数据初始化
  23. while data != '':#直到音频放完
  24.     stream.write(data)#播放缓冲流的音频
  25.     data = wf.readframes(CHUNK)#更新data
  26.     numpydata = np.fromstring(data, dtype=np.int16)#把data由字符串以十六进制的方式转变为数组
  27.     transforamed=np.real(np.fft.fft(numpydata))#傅里叶变换获取实数部分
  28.    
  29.     count=64#设置间隔区
  30.     max_data=0
  31.     for n in range(0,transforamed.size,count):#从频域中的2048个数据中每隔count个数据中选取一条
  32.         hight=abs(int(transforamed[n]/10000))#对这么多数据取整和绝对值
  33.         if hight>max_data:
  34.             max_data=hight
  35.     print(max_data)
  36.     if max_data>255:
  37.         max_data=255
  38.     max_data1=0
  39.     max_data2=0
  40.     max_data3=0
  41.     i=random.randint(1, 12)
  42.     if i<4:
  43.       max_data1=max_data
  44.     elif i<8:
  45.       max_data2=max_data
  46.     else:
  47.       max_data3=max_data   
  48.     npy.range_color(0,60,(max_data1,max_data2,max_data3))
  49.    
  50. stream.stop_stream()
  51. stream.close()
  52. #关闭流
  53. p.terminate()
复制代码
【修改库文件】
因NeoPixel 的range_color第三个参数默认的是十六制颜色,形式如“#0xFF0000”,我想使用元组表示颜色,如“(255,0,0)”。找到pymata4.py(C:\Program Files (x86)\Mind+\Arduino\python\site-packages\pinpong\base)
SatDecember-202112184144..png
【组装硬件】
硬件使用的是“Mind+Python流光溢彩灯https://mc.dfrobot.com.cn/thread-311681-1-1.html
IMG_20211217_193821.jpg
【效果图】
IMG_20211218_193301.jpg IMG_20211218_193313.jpg IMG_20211218_193256.jpg IMG_20211218_193248.jpg IMG_20211218_193316.jpg IMG_20211218_193318.jpg


【演示视频】



界面视频只用演示用,歌曲由Python播放。

创客达闻西  中级技师

发表于 2021-12-23 11:11:25

这个光太炫彩了  顶不住一直看啊
回复

使用道具 举报

木子呢  NPC

发表于 2022-1-7 10:48:14

Mind+Python快被宋老师玩出 花 来了,太棒了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail