5.31 综合案例2.0 - 在线MP3音乐播放器

news2024/11/17 5:46:27

综合案例2.0 - 在线MP3音乐播放器

  • 一、案例说明
  • 二、准备器件
  • 三、案例连线
  • 四、代码
      • 代码说明
      • 复制
  • 五、测试

一、案例说明

在这里插入图片描述
本案例制作一个联网下载声音文件的MP3播放器。

  • 案例功能说明:
    • 案例使用一块IC035串口屏和两个按键
    • 通过按键可以切换音乐,下载播放或删除声音文件
    • 案例可以实时显示当前SD卡内的文件数量,可以直观看到文件是否下载完成
  • JC035串口屏使用请参考产品资料说明或者参考haas506 2.0开发教程-example-JC035串口屏饮料机
  • 案例使用M601开发板,中断引脚选择GPIO44,GPIO20。使用M320请注意IO口选择,M320部分IO口暂不支持中断。
  • 代码选择GB2312编码

二、准备器件

本案例需要的硬件

器材数量
HaaS506开发板1
JC025串口屏(480x320)1
触摸按键1
SIM卡1
喇叭1
SD卡1

三、案例连线

在这里插入图片描述

四、代码

代码说明

1.代码总共4个文件
在这里插入图片描述
2.如果要显示中文代码烧录时选择GB2312编码
在这里插入图片描述

复制

mian.py

import net_connect
import  mp3
import utime
from driver import UART
from driver import GPIO

#按键使能
key1=GPIO(10,10)
key2=GPIO(10,10)
key1.open("key1")
key2.open("key2")
#菜单目录
data = {'test1.mp3':'http://music.szyywdz.huntercat.cn/haas506.mp3','test2.mp3':'http://music.szyywdz.huntercat.cn/audio/m601test.mp3','test3.mp3':'http://music.szyywdz.huntercat.cn/audio/syserror.mp3'}
num = ['test1.mp3','test2.mp3','test3.mp3']
name = num[0]
#按键
buttons1 = 4
buttons2 = 0
buttons3 = 0
degree = 0
play_stop = True

#切换键
def key1_callback(args):
    global degree,play_stop,buttons1,buttons2,buttons3
    print('--------  切换  ---------')
    play_stop = True
    #设定按键次数
    degree += 1
    if degree > 2:
        degree = 0
    if degree == 0:
        buttons1 = 4
        buttons2 = 0
        buttons3 = 0
    if degree == 1:
        buttons1 = 0
        buttons2 = 4
        buttons3 = 0
    if degree == 2:
        buttons1 = 0
        buttons2 = 0
        buttons3 = 4
    #获取文件个数
    catalogue = mp3.search()
    UART_send("DCV32(120,5,'在线音乐播放器',1);BTN(40,50,400,60,%s,1,5,2,%d);BTN(40,110,400,60,%s,1,5,2,%d);BTN(40,170,400,60,%s,1,5,2,%d);BTN(60,230,360,40,'本地文件个数: %d',1,0,1,0);BTN(40,270,64,32,'下载播放',0,0,2,0);BTN(400,270,64,32,'切换',0,0,5,0);\r\n"%(num[0],buttons1,num[1],buttons2,num[2],buttons3,catalogue))
    utime.sleep_ms(100)
    key1.disableIrq()
    key1.clearIrq()

#播放&删除键
def key2_callback(args):
    global degree,play_stop,buttons1,buttons2,buttons3
    print('======= 播放 =========')
    if play_stop:    #播放
        print(data[num[degree]],num[degree],'----------------------------------------------')
        mp3.download(data[num[degree]],num[degree])
        catalogue = mp3.search()
        UART_send("DCV32(120,5,'在线音乐播放器',1);BTN(40,50,400,60,%s,1,5,2,%d);BTN(40,110,400,60,%s,1,5,2,%d);BTN(40,170,400,60,%s,1,5,2,%d);BTN(60,230,360,40,'本地文件个数: %d',1,0,1,0);BTN(40,270,64,32,'本地删除',0,0,1,0);BTN(400,270,64,32,'切换',0,0,5,0);\r\n"%(num[0],buttons1,num[1],buttons2,num[2],buttons3,catalogue))
        play_stop = False
        mp3.play(num[degree])
    else:            #删除
        mp3.delete(num[degree])
        play_stop = True
        catalogue = mp3.search()
        UART_send("DCV32(120,5,'在线音乐播放器',1);BTN(40,50,400,60,%s,1,5,2,%d);BTN(40,110,400,60,%s,1,5,2,%d);BTN(40,170,400,60,%s,1,5,2,%d);BTN(60,230,360,40,'本地文件个数: %d',1,0,1,0);BTN(40,270,64,32,'下载播放',0,0,2,0);BTN(400,270,64,32,'切换',0,0,5,0);\r\n"%(num[0],buttons1,num[1],buttons2,num[2],buttons3,catalogue))
    utime.sleep_ms(100)
    key2.disableIrq()
    key2.clearIrq()


def UART_send(data):
    writeBuf0=bytearray(data)
    uart0.write(writeBuf0)


if __name__ == '__main__':
    uart0=UART()
    uart0.open("serial1")
    utime.sleep_ms(1000)
    UART_send("CLR(0);DIR(3);\r\n")
    net_connect.connect_network()
    key1.enableIrq(key1_callback)
    key2.enableIrq(key2_callback) 
    catalogue = mp3.search()
    UART_send("DCV32(120,5,'在线音乐播放器',1);BTN(40,50,400,60,%s,1,5,2,%d);BTN(40,110,400,60,%s,1,5,2,%d);BTN(40,170,400,60,%s,1,5,2,%d);BTN(60,230,360,40,'本地文件个数: %d',1,0,1,0);BTN(40,270,64,32,'下载播放',0,0,2,0);BTN(400,270,64,32,'切换',0,0,5,0);\r\n"%(num[0],buttons1,num[1],buttons2,num[2],buttons3,catalogue))

    
    while True:
        utime.sleep_ms(10)

mp3.py

import  uos
import utime
import http
from audio import Audio


uos.mountsd()

def download(url,name):
    print('filename in directory:',uos.listdir('/sdcard0'))
    htp=http.client()
    htp.download(url,'/sdcard0/'+name)
    print('filename in directory:',uos.listdir('/sdcard0'))


catalogue = []
def search():
    global catalogue
    catalogue = uos.listdir('/sdcard0')
    return len(catalogue)-1

def delete(name):
    print('before removing files:',uos.listdir('/sdcard0'))
    uos.remove('/sdcard0/'+name)
    print('after removing files:',uos.listdir('/sdcard0'))

def play(name):
    print('------------------------Audio play start--------------------')
    aud=Audio()
    aud.set_pa()
    aud.setVolume(5)
    utime.sleep(1)
    aud.play('/sdcard0/'+name)
    # utime.sleep(3)
    # aud.stop()
    # print('------------------------Audio play done--------------------')

net_connect.py

import network
import utime


g_connect_status = False
def on_4g_cb(args):
    global g_connect_status
    pdp = args[0]
    netwk_sta = args[1]
    if netwk_sta == 1:
        g_connect_status = True
    else:
        g_connect_status = False

def connect_network():
    global net,on_4g_cb,g_connect_status
    net = network.NetWorkClient()
    g_register_network = False
    if net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:
        g_register_network = True
    else:
        g_register_network = False
    if g_register_network:
        net.on(1,on_4g_cb)
        net.connect(None)
    else:
        print('!!! connect_network  false !!!')
    while True:
        if g_connect_status:
            print('connect_network ok')
            break
        utime.sleep_ms(20)

board.json

{
    "name": "haas506",
   "version": "2.0.0",
   "io": {
     "key1": {
      "type": "GPIO",
      "port": 44,
      "dir": "irq",
      "pull": "pullup",
      "intMode":"falling"
      },
     "key2": {
      "type": "GPIO",
      "port": 20,
      "dir": "irq",
      "pull": "pullup",
      "intMode":"falling"
      },
     "serial1":{
       "type":"UART",
       "port":0,
       "dataWidth":8,
       "baudRate":115200,
       "stopBits":1,
       "flowControl":"disable",
       "parity":"none"
     },
     "serial2":{
       "type":"UART",
       "port":1,
       "dataWidth":8,
       "baudRate":115200,
       "stopBits":1,
       "flowControl":"disable",
       "parity":"none"
     },
     "serial3":{
       "type":"UART",
       "port":2,
       "dataWidth":8,
       "baudRate":115200,
       "stopBits":1,
       "flowControl":"disable",
       "parity":"none"
     }
   },
   "debugLevel": "ERROR",
   "repl":"enable",
   "replPort":0
   }

五、测试

1.上电后屏幕显示如下

  • 按开发板key1键可以切换文件
  • 按下触摸按键可以下载文件并播放,再次按下删除文件
  • 本地文件个数实时刷新
    在这里插入图片描述
    2.log测试
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

瑜岿科技综合能源管理系统助力企业节能降耗工作

能源是国民经济的基础,更是城市赖以发展的动力。优化能源结构、大力发展可再生能源、提高机房能效、实现建筑智慧节能是行业绿色发展重点。在国家碳达峰碳中和的重大战略决策背景下,我国能源体制改革深入推进,能源生产和消费发生重大变革&…

如今社交电商不可忽略的一个点——消费增值

消费增值是一个基于消费返利理论的全新商业消费生态,一个让用户从优惠消费—免单消费—挣钱消费,所突破的新消费、新业态模式—增值消费,一个从电商化的平台走向品牌化的平台,让平台脱离单打独斗的方式,通过商家联盟方…

编译原理 2 - 词法分析

第3章 词法分析3.1 词法分析器的功能和结构3.2 状态转换图3.3 正则文法 和 正则表达式3.4 有限自动机 DFA与NFA测试第3章 词法分析 重点:① 词法分析器的输入、输出;② 用于识别符号的状态转移图的构造;③ 根据状态转移图实现词法分析器 难点…

【MATLAB教程案例55】GoogleNet网络的MATLAB编程学习和实现,以步态识别为例进行仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.GoogleNet理论概述

基于Qt的桌面客户端组件化框架DT 开源啦

这个是本人在工作中基于QT开发的组件化桌面开发框架,目前打算开源出来提供给大家,节省大家的开发时间和效率,希望对大家的开发有所帮助,也欢迎提出意见和改进建议 1. 为什么开源DT框架 DT框架,本身就是基于QT为基础搭…

深度学习——含并行连接的网络(GoogLeNet)笔记

GoogLeNet中基本的卷积块是Inception块。 1.Inception块:4个路径从不同的层面抽取信息,然后在输出通道合并 ①1*1的卷积层,减少通道数,降低模型的复杂度 ② 1*1的卷积层,减少通道数,降低模型复杂度。然后…

volatile关键字和synchronized关键字

参考博客:https://www.cnblogs.com/cg-ww/p/14540450.html 1、volatile的作用:关键作用是使变量在多个线程之间可见 程序并没有因为我修改之后结束运行,因为线程对共享变量具有不可见性,main线程修改布尔值之后,子线…

【读点论文】MicroNet: Towards Image Recognition with Extremely Low FLOPs,在极高限制下的轻量化网络

MicroNet: Towards Image Recognition with Extremely Low FLOPs Abstract 这篇论文旨在以极低的计算成本解决性能大幅下降的问题。提出了微分解卷积,将卷积矩阵分解为低秩矩阵,将稀疏连接整合到卷积中。 提出了一个新的动态激活函数-- Dynamic Shift …

精准管控 | AIRIOT数字油库智能化解决方案

在油库管理的过程中,储油罐区普遍存在分布空间范围广、安全防爆要求高、监控点多、布线复杂、自动化系统集成难度大等问题,传统的油库管理手段相对落后、管理环境复杂,企业在监测监控、设备设施管理、日常运行等方面存在诸多难点:…

Openldap2.5.13编译安装

Openldap2.5.13编译安装 本篇文章没有很全面,采用的是编译安装,yum安装参考我的另外一篇文章 一、准备 openssl-1.1.1.tar.gz 下载地址:https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz openldap-2.5.13.tgz 下载地址&#…

APS计划排产软件在仪器仪表行业的应用

仪器仪表是指用以产生、测量精密量的设备和装置,包括对精密量的观察、监视、测定、验证、记录、传输、变换、显示、分析处理与控制。仪器仪表是仪器仪表的一个重要分支。伴随国家出台政策大力发展精密仪器仪表下游行业,下游应用领域对精密仪器仪表的需求…

React 学习笔记:组件生命周期

组件生命周期 生命周期一个事物从创建到最后消亡经历的过程,在这个过程中会有不同的状态(新生儿、少年),所以在 16.8 版本以前生命周期只有类组件才有,函数组件是没有这个概念的,因为它没有状态&#xff0…

Diffusion-LM Improves Controllable Text Generation 扩散语言模型改善可控文本生成

论文链接:https://arxiv.org/abs/2205.14217 代码链接:https://github.com/XiangLi1999/Diffusion-LM 一、简介 无需重训模型控制语言模型的表现是自然语言生成(NLG)的一个重要开放问题,近期工作已经在简单句子属性控…

解读小红书2022年母婴行业报告:心智种草的流量密码

母婴用户代际更迭,90后晋升为母婴消费主力军。新一代宝爸宝妈的关注点在哪里?品牌该如何通过小红书满足ta们的进阶需求,为母婴消费注入新活力? 本文将解读小红书官方发布的《2022年母婴行业人群洞察报告》,基于上千名用…

Ubuntu20运行SegNeXt代码提取道路水体(二)——SegNeXt源代码安装到测试环境配置全过程摸索

首先我们在第一篇里面已经下载了SegNeXt代码 打开源代码 查看readme文件 我们先安装一下里面提到的torchprofile 链接在这 其实只要这个语句就能安装 pip install torchprofile这一步没什么问题 很顺利 接下来继续按照他的教程走 我们在(一)已经安装了…

快手小程序怎么开发

快手小程序开发很简单,直接找一个快手小程序开发平台就可以。 大家可以按照下面这个步骤去完成,完成后就能开发出一个快手小程序啦。 操作像玩消消乐那么简单! 不过在开发快手小程序前,需要先检查以下这几样东西有没有准备好&a…

小白学流程引擎-FLowable(五) — BPMN2.0模型规范

前言: 不用到处百度BPMN2的博客了,本篇文章带你系统掌握BPMN2规范的核心知识点。全文2万字,全覆盖BPMN2知识点,图文并茂,泡杯咖啡,慢慢细品~ 一、BPMN是什么 BPMN(Business Proces…

ChatGPT的理解

参考 李宏毅老师讲解 思维导图 ChatGPT 对标 instruct GPT 本质 GPT的社会化 训练过程 1 学习文字接龙 无监督学习 大量的自我学习 生成的答案具有随机性 自己修炼 2 人类老师引导文字接龙的方向 监督学习 标注:(问题提示,答案)对,引导gpt生…

10万字208道Java经典面试题总结(附答案)一

11、String 类的常用方法都有那些? equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpty等等。 12、普通类和抽象类有哪些区别? 抽象类不能被实例化; 抽象类可以有抽象方法&…

分享米筐量化的使用方法

米筐量化都是量化金融分析经常会用到的数据提供平台,今天主要是来讲一下关于米筐量化的使用方法: 基本操作: 在这里把tushare和rqdatac是import为ts和rq,这import as会对之后的缩写产生影响。 例如: rq.get_price(o…