第一步:所需材料
- 装了Raspbian镜像的树莓派B
- PiFace Control and Display
- 树莓派和piface CAD的外壳
- Wi-Pi
- 便携式扬声器
- 5V 1A Micro USB电源
第二步:所需软件
sudo apt-get upgrade
sudo apt-get update
- sudo raspi-config
- 选择 选项8 "Advanced options"
- 选择 选项A5: "SPI"
- 选择 "Yes"
- 选择 "Finish" 退出
- 安装mpd (music player daemon)和mpc (music player controller)应用程序
sudo apt-get install mpd mpc
第三步:Python脚本
从现在开始的每一件事都是通过Python来做的。
通过Python,我可以用PiFace CAD的按钮来控制mpc应用程序,并在LCD屏上显示状态。
我想在LCD上显示一些图标来说明当前的一些数值(例如亮度)或者说呈现当前的状态。发挥你艺术细胞的时候到了,设计简洁易懂的图标吧。(确保你在用PiFace CAD时选择了5x8)
定义并存储“自定义位图”:
def custom_bitmaps():
speaker = pifacecad.LCDBitmap([1,3,15,15,15,3,1,0])
play = pifacecad.LCDBitmap([0,8,12,14,12,8,0,0])
stop = pifacecad.LCDBitmap([0,31,31,31,31,31,0,0])
playlist = pifacecad.LCDBitmap([2,3,2,2,14,30,12,0])
cad.lcd.store_custom_bitmap(0, speaker)
cad.lcd.store_custom_bitmap(1, play)
cad.lcd.store_custom_bitmap(2, stop)
cad.lcd.store_custom_bitmap(3, playlist)
利用相应位图的ID,使自定义位图显示在LCD屏上:
cad.lcd.write_custom_bitmap(0)
为了在LCD上显示正确的信息(音量和播放列表的位置和大小),我使用来自MPC应用程序本身的信息。
会得到类似这样的输出:
pi@piRadio ~ $ mpc status
mms://streaming.q-music.be/QBE_HI
[playing] #1/2 1187:22/0:00 (0%)
volume:100% repeat: off random: off single: off consume: off
利用Python,可以执行这个命令、得到这个输出、解析这些有趣的信息。
1. 播放清单:
def display_playlist():
playlist = subprocess.check_output("mpc status | grep playing", shell=True, stderr=subprocess.STDOUT)
playlist = playlist[playlist.find("#")+1:playlist.find("/")+2]
cad.lcd.set_cursor(4, 1)
cad.lcd.write_custom_bitmap(3)
cad.lcd.write(playlist)
这段代码执行了"mpc status"命令并且只维持包含“playing”字样的输出部分。
然后,它会解析这个输出并且维持“#”之后的部分和“/”前的两个字符。这涵盖了播放列表99项
播放列表信息会被写入LCD,同时LCD还会显示一个说明相应数值的图标。
2. 音量:
def display_volume():
volume = subprocess.check_output("mpc status | grep volume", shell=True, stderr=subprocess.STDOUT)
volume = volume[7:volume.find("%")+1]
cad.lcd.set_cursor(12, 1)
cad.lcd.write(volume)
与播放列表解析相似,这段代码的输出中,"mpc status" 指令包含 "volume"字样。
然后音量信息就会被写入LCD
这个脚本需要知道什么时候PiFace CAD上的按钮被按下,然后激发应用程序相应动作。
我从一个PiFace 例程中复原了这段代码,并进行调整使之适合我的应用程序。
首先,要对侦听器进行定义,规定哪一个寄存器寄存哪一个按钮被按下时发出的指令:
listener = pifacecad.SwitchEventListener(chip=cad)
for i in range(8):
listener.register(i, pifacecad.IODIR_FALLING_EDGE, update_pin_text)
listener.activate()
当不同的按钮被按下时,这个侦听器可以执行相应的特定的功能:
def update_pin_text(event):
global channel_pos
global status
if(event.pin_num == 0):
status = "playing"
os.system('mpc play')
event.chip.lcd.set_cursor(0, 1)
event.chip.lcd.write_custom_bitmap(1)
event.chip.lcd.write(" ")
display_channel()
display_playlist()
elif(event.pin_num == 1):
status = "stopped"
os.system('mpc stop')
event.chip.lcd.set_cursor(0, 1)
event.chip.lcd.write_custom_bitmap(2)
event.chip.lcd.write(" ")
clear_channel()
elif(event.pin_num == 2 and status == "playing" and channel_pos > 1):
os.system('mpc prev')
clear_channel()
display_channel()
display_playlist()
elif(event.pin_num == 3 and status == "playing" and channel_pos < len(channelLink)):
os.system('mpc next')
clear_channel()
display_channel()
display_playlist()
elif(event.pin_num == 4):
global backlight
if(backlight == 1):
event.chip.lcd.backlight_off()
backlight = 0
else:
event.chip.lcd.backlight_on()
backlight = 1
elif(event.pin_num == 5):
sleep(1)
elif(event.pin_num == 6):
os.system('mpc volume -5')
display_volume()
elif(event.pin_num == 7):
os.system('mpc volume +5')
display_volume()
else:
sleep(1)
以上动作分别对应图中的按钮:
第三步:自动启动
该脚本需要在系统启动时自动启动。在文件/etc/rc.local 添加:
sudo python /home/pi/radio.py &
|