01Studio

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8298|回复: 3

硬核音乐!用蜂鸣器演奏贝多芬的月光奏鸣曲

[复制链接]

2

主题

13

帖子

66

积分

注册会员

Rank: 2

积分
66
发表于 2021-1-25 20:23:11 | 显示全部楼层 |阅读模式
本帖最后由 jd30906 于 2021-1-25 20:24 编辑

感兴趣的小伙伴可以试下,直接粘贴到main.py即可,按pybase上的KEY键播放。


'''
实验名称:DAC-蜂鸣器-演奏月光奏鸣曲
版本:v1.0
日期:2021.1
作者:jd3096
说明:通过USER按键播放
'''

#导入相关模块
from pyb import DAC,Switch,Pin,ExtInt,LED
from machine import Pin,I2C
from ssd1306 import SSD1306_I2C
import time

#初始化相关模块
i2c = I2C(sda=Pin("Y8"), scl=Pin("Y6"))
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
dac = DAC(1)     #定义DAC对象名字为dac,输出引脚为X5

#事先写好的谱子,把音符转化为HZ
play1=[138, 208, 278, 330, 416, 278, 330, 416, 554, 330, 416, 554, 660, 416, 554, 660, 830, 554, 660, 830, 1108, 660, 830, 1108, 1318, 830, 1108, 1318, 1662, 1, 1662, 1]
play2=[131,208,262,311,415,262,311,415,523,311,415,523,622,415,523,622,831,523,622,831,1047,622,831,1047,1245,831,1047,1245,1662,1,1662,1]
play3=[123,227,349,415,554,349,415,554,698,415,554,698,831,554,698,831,1108,698,831,1108,1397,831,1108,1397,1661,1108,1397,1661,2218,1,2218,1]
play4=[110,277,370,440,554,554,740,880,1109,1109,1480,1760,2217,1,2217,1,110,277,330,392,554,554,659,784,1109,1109,1319,1568,2218,1,2218,1]
play5=[2094,1,831,1661,831,1661,923,1661,1047,1661,1109,1661,1245,1661,1109,1661,1245,1661,1109,1661,1480,1661,1319,1661,1245,1661,1109,1661,1047,1661,880,1568]
play6=[831,1661,831,1661,831,1661,923,1661,1047,1661,1109,1661,1245,1661,1109,1661,1245,1661,1109,1661,1480,1661,1319,1661,1245,1661,1109,1661,1047,1661,880,1568]
play7=[831,1661,880,1568,831,1661,880,1568,831,1661,880,1568,831,1661,880,1568,1661,1661,1661,1661,831,831,831,831,831,831,831,831,831,831,831,831,1]
playlist=play1+play2+play3+play4+play5+play6+play7
# 定义8位精度下方波的值。0、255分别对应输出0V、3.3V。需要定义成字节数组。
buf = bytearray(2)
buf[0]=0
buf[1]=255

tempo=0.1
# 定义了速度,0.1秒演奏一个音

def playstart():
    oled.fill(0)  # 清屏显示黑色背景
    oled.text('Moonlight Sonata', 0, 0)  
    oled.text('3rd', 0, 15)
    oled.text('Beethoven', 0, 30)  
    oled.text('Playing...', 0, 45)  
    oled.show()
    for num in playlist:
        pl(num)

def pl(hz):
    dac.write_timed(buf, hz*len(buf), mode=DAC.CIRCULAR)
    time.sleep(tempo)

##############################################
#  OLED初始显示
##############################################
oled.fill(0)  # 清屏显示黑色背景
oled.text('Moonlight Sonata', 0, 0)  
oled.text('3rd', 0, 15)
oled.text('Beethoven', 0, 30)  
oled.text('Press USER', 0, 45)  
oled.show()

callback=lambda e:playstart()  #中断用法
ext=ExtInt(Pin('Y1'),ExtInt.IRQ_FALLING,Pin.PULL_UP,callback)
有偿帮助解决micropython相关技术问题,加微:jd3096
回复

使用道具 举报

1

主题

2

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2021-2-17 22:32:14 | 显示全部楼层
我想请问一下我在main里面把中断函数最后那两行改成playstart()然后执行命令,我的蜂鸣器就可以发声,并且不需要按键,但是改成中断函数那两句按键之后就没有反应,请问是为什么呢?
回复

使用道具 举报

2

主题

13

帖子

66

积分

注册会员

Rank: 2

积分
66
 楼主| 发表于 2021-3-9 20:19:05 | 显示全部楼层
chenchen 发表于 2021-2-17 22:32
我想请问一下我在main里面把中断函数最后那两行改成playstart()然后执行命令,我的蜂鸣器就可以发声,并 ...

上一下具体代码,初步分析中断语句有问题,或者esp32和底板上的按键你都按一下试试
有偿帮助解决micropython相关技术问题,加微:jd3096
回复

使用道具 举报

0

主题

3

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2021-11-23 11:14:36 | 显示全部楼层
请问一下为什么澳洲幸运20在用DHT11温湿度传感器的时候不需要福彩双色球使能单总线,它不是单总线的幸运飞艇传感器吗?

回复

使用道具 举报

手机版|01Studio 在线交流

GMT+8, 2021-12-8 09:15 , Processed in 0.036344 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表