add code for rpi pirate radio
This commit is contained in:
parent
fd4e3444dd
commit
794210fea2
4 changed files with 157 additions and 0 deletions
15
Raspberry_Pi_PiPyPirate_Radio/freq_scan.py
Executable file
15
Raspberry_Pi_PiPyPirate_Radio/freq_scan.py
Executable file
|
|
@ -0,0 +1,15 @@
|
|||
import board
|
||||
import digitalio
|
||||
import adafruit_si4713
|
||||
|
||||
radio = adafruit_si4713.SI4713(
|
||||
board.I2C(),
|
||||
reset=digitalio.DigitalInOut(board.D26),
|
||||
timeout_s=0.5
|
||||
)
|
||||
|
||||
with open("freq_scan.dat", "w") as fp:
|
||||
for f_khz in range(87500, 108000, 50):
|
||||
noise = radio.received_noise_level(f_khz)
|
||||
fp.write("{},{}\n".format(f_khz/1000.0, noise))
|
||||
print('{0:0.3f} mhz = {1} dBuV'.format(f_khz/1000.0, noise))
|
||||
8
Raspberry_Pi_PiPyPirate_Radio/mpd.conf
Normal file
8
Raspberry_Pi_PiPyPirate_Radio/mpd.conf
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
music_directory "/home/pi/music"
|
||||
playlist_directory "/home/pi/playlists"
|
||||
|
||||
audio_output {
|
||||
type "alsa"
|
||||
name "USB Audio Adapter"
|
||||
device "hw:2,0"
|
||||
}
|
||||
134
Raspberry_Pi_PiPyPirate_Radio/radio.py
Executable file
134
Raspberry_Pi_PiPyPirate_Radio/radio.py
Executable file
|
|
@ -0,0 +1,134 @@
|
|||
import time
|
||||
import board
|
||||
import digitalio
|
||||
import adafruit_si4713
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
from adafruit_rgb_display import st7789
|
||||
import mpd
|
||||
|
||||
#--| User Config |-----------------------------------
|
||||
FREQ = 89.00
|
||||
PLAYLIST = "test"
|
||||
UPDATE_RATE = 0.5
|
||||
#----------------------------------------------------
|
||||
|
||||
#==| SETUP |=========================================================
|
||||
|
||||
# Display
|
||||
disp = st7789.ST7789(
|
||||
board.SPI(),
|
||||
height=240,
|
||||
y_offset=80,
|
||||
rotation=180,
|
||||
cs=digitalio.DigitalInOut(board.CE0),
|
||||
dc=digitalio.DigitalInOut(board.D25),
|
||||
rst=digitalio.DigitalInOut(board.D24),
|
||||
baudrate=64000000,
|
||||
)
|
||||
|
||||
backlight = digitalio.DigitalInOut(board.D22)
|
||||
backlight.switch_to_output()
|
||||
backlight.value = True
|
||||
|
||||
background = Image.open("radio_bg.png")
|
||||
STAT_FNT = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Bold.ttf", 55)
|
||||
STAT_CLR = (30, 100, 200)
|
||||
INFO_FNT = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 20)
|
||||
ARTS_CLR = (0, 100, 0)
|
||||
ALBM_CLR = (0, 100, 0)
|
||||
TITL_CLR = (0, 100, 0)
|
||||
PROG_CLR = (0, 100, 0)
|
||||
|
||||
# Buttons
|
||||
button1 = digitalio.DigitalInOut(board.D23)
|
||||
button1.switch_to_input(pull=digitalio.Pull.UP)
|
||||
button2 = digitalio.DigitalInOut(board.D24)
|
||||
button2.switch_to_input(pull=digitalio.Pull.UP)
|
||||
|
||||
# Radio
|
||||
radio = adafruit_si4713.SI4713(
|
||||
board.I2C(),
|
||||
reset=digitalio.DigitalInOut(board.D26),
|
||||
timeout_s = 0.5
|
||||
)
|
||||
radio.tx_frequency_khz = int(FREQ * 1000)
|
||||
radio.tx_power = 115
|
||||
|
||||
# MPD
|
||||
mpc = mpd.MPDClient()
|
||||
mpc.connect("localhost", 6600)
|
||||
mpc.stop()
|
||||
mpc.clear()
|
||||
mpc.load(PLAYLIST)
|
||||
mpc.play()
|
||||
mpc.repeat(1)
|
||||
#====================================================================
|
||||
|
||||
def button1_handler():
|
||||
if status['state'] == 'play':
|
||||
mpc.pause()
|
||||
else:
|
||||
mpc.play()
|
||||
|
||||
def button2_handler():
|
||||
mpc.next()
|
||||
|
||||
def update_display():
|
||||
image = background.copy()
|
||||
draw = ImageDraw.Draw(image)
|
||||
|
||||
draw.text(
|
||||
(150, 20),
|
||||
"{:>5.1f}".format(FREQ),
|
||||
anchor="mt",
|
||||
font=STAT_FNT,
|
||||
fill=STAT_CLR
|
||||
)
|
||||
|
||||
if status['state'] == 'play':
|
||||
r = 10 * (1 + int(time.monotonic() % 3))
|
||||
draw.arc( (30-r, 20-r, 30+r, 20+r),
|
||||
120, 60,
|
||||
fill = (0, 0, 0),
|
||||
width = 3
|
||||
)
|
||||
|
||||
info = mpc.currentsong()
|
||||
artist = info.get('artist', 'unknown')
|
||||
album = info.get('album', 'unknown')
|
||||
song = info.get('title', 'unknown')
|
||||
draw.text( (5, 150), artist, font=INFO_FNT, fill=ARTS_CLR )
|
||||
draw.text( (5, 170), album, font=INFO_FNT, fill=ALBM_CLR)
|
||||
draw.text( (5, 190), song, font=INFO_FNT, fill=TITL_CLR)
|
||||
|
||||
perc = float(status['elapsed']) / float(status['duration'])
|
||||
draw.rectangle( (5, 215, 235, 230), outline=PROG_CLR)
|
||||
draw.rectangle (
|
||||
(5, 215, 5 + int(230*perc), 230),
|
||||
fill=PROG_CLR
|
||||
)
|
||||
|
||||
disp.image(image)
|
||||
|
||||
last_update = time.monotonic()
|
||||
|
||||
while True:
|
||||
now = time.monotonic()
|
||||
try:
|
||||
status = mpc.status()
|
||||
except ConnectionError:
|
||||
mpc.connect("localhost", 6600)
|
||||
status = mpc.status()
|
||||
if not button1.value:
|
||||
button1_handler()
|
||||
while not button1.value:
|
||||
time.sleep(0.001)
|
||||
if not button2.value:
|
||||
button2_handler()
|
||||
while not button2.value:
|
||||
time.sleep(0.001)
|
||||
if now - last_update > UPDATE_RATE:
|
||||
update_display()
|
||||
last_update = now
|
||||
|
||||
|
||||
BIN
Raspberry_Pi_PiPyPirate_Radio/radio_bg.png
Executable file
BIN
Raspberry_Pi_PiPyPirate_Radio/radio_bg.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 9.3 KiB |
Loading…
Reference in a new issue