5.31 综合案例2.0 - 在线音乐盒

本教程介绍如何使用Python和Haas506开发板创建一个在线音乐播放器。该播放器支持从云端下载MP3文件并播放,同时具备基本的播放控制功能,如切换歌曲、删除文件等。案例涉及硬件连接、代码实现及测试步骤。

最新案例教程点击下方链接跳转,CSDN已停止更新

点击跳转HaaS506官方最新案例







一、案例说明

用python写一个在线音乐播放器,MP3云喇叭

本案例制作一个联网下载声音文件的MP3播放器。

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

二、准备器件

本案例需要的硬件

器材数量
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":2
   }

五、测试

1.上电后屏幕显示如下

  • 按开发板key1键可以切换文件
  • 按下触摸按键可以下载文件并播放,再次按下删除文件
  • 本地文件个数实时刷新
    在这里插入图片描述
    2.log测试
    默认串口TTL需连接串口屏,使用485读取log
    在这里插入图片描述
<think>嗯,用户遇到了在终端输入`vim ~/.bashrc`时提示“Command 'vim' not found”的问题。首先,我需要确定为什么会出现这个错误。通常,这种情况是因为系统中没有安装vim编辑器。用户可能使用的是新安装的Ubuntu系统,或者最小化安装,默认没有包含vim。 接下来,用户看到的提示给出了几个安装选项,包括vim的不同版本和neovim。这说明系统能够识别到vim包的存在,但当前并未安装。需要指导用户如何选择合适的包进行安装。 首先,我应该解释每个安装选项的区别。例如,vim-tiny是精简版,功能较少;vim-athena、vim-gtk3、vim-nox这些版本可能支持不同的GUI或特性;而neovim是vim的一个分支,更现代化。对于大多数用户来说,安装完整的vim可能更合适,即使用`sudo apt install vim`。但用户可能需要根据自身需求选择,比如是否需要图形界面支持。 然后,需要给出具体的安装步骤,确保用户能够顺利执行。比如使用sudo权限安装,之后再次尝试打开.bashrc文件。另外,如果用户不想安装vim,也可以建议使用已安装的编辑器如nano,但原命令是vim,所以用户可能更倾向于安装vim。 还需要考虑用户是否了解如何编辑.bashrc文件,可能需要简要说明该文件的作用,比如环境变量和别名设置的位置,编辑后需要source或者重启终端使更改生效。 此外,提醒用户在安装软件前最好先更新软件包列表,使用`sudo apt update`,这样可以避免因仓库信息过旧导致的安装问题。不过,用户的问题提示中已经列出了可安装的包,可能已经是最新的,但作为最佳实践,还是可以建议更新。 最后,确保回答结构清晰,分步骤说明,帮助用户逐步解决问题。同时检查是否有其他潜在问题,例如权限不足(需要使用sudo),或者拼写错误(比如vim拼写错误),但根据用户提供的信息,错误信息明确,应该是未安装导致。</think>你遇到的提示说明系统中尚未安装vim编辑器。这里分步骤说明解决方法: 一、问题诊断 1. 输入命令的意图:你想用vim编辑器修改用户配置文件`~/.bashrc` 2. 报错原因:当前系统未安装vim程序包 二、解决方案(任选其一) 1. 推荐安装完整版vim: ```bash sudo apt update # 先更新软件包列表(可选但推荐) sudo apt install vim # 安装标准vim版本 ``` 2. 备选安装方案(按需求选择): - `vim-tiny`:最小化版本(功能有限) - `vim-gtk3`:支持GUI界面 - `neovim`:vim的现代化分支版本 三、验证安装 安装完成后执行: ```bash vim ~/.bashrc # 现在应该能正常打开编辑器 ``` 四、补充说明 1. `.bashrc`文件作用:存储用户终端的个性化设置(别名、环境变量等) 2. 临时替代方案:可以使用已预装的`nano`编辑器 ```bash nano ~/.bashrc # 使用nano编辑器打开文件 ``` 建议优先选择`sudo apt install vim`安装完整版,这是最通用的解决方案。安装完成后你会看到一个分文本编辑器,按`i`进入编辑模式,修改完成后按`Esc`输入`:wq`保存退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值