Skip to content

Commit 794210f

Browse files
committed
add code for rpi pirate radio
1 parent fd4e344 commit 794210f

File tree

4 files changed

+157
-0
lines changed

4 files changed

+157
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import board
2+
import digitalio
3+
import adafruit_si4713
4+
5+
radio = adafruit_si4713.SI4713(
6+
board.I2C(),
7+
reset=digitalio.DigitalInOut(board.D26),
8+
timeout_s=0.5
9+
)
10+
11+
with open("freq_scan.dat", "w") as fp:
12+
for f_khz in range(87500, 108000, 50):
13+
noise = radio.received_noise_level(f_khz)
14+
fp.write("{},{}\n".format(f_khz/1000.0, noise))
15+
print('{0:0.3f} mhz = {1} dBuV'.format(f_khz/1000.0, noise))
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
music_directory "/home/pi/music"
2+
playlist_directory "/home/pi/playlists"
3+
4+
audio_output {
5+
type "alsa"
6+
name "USB Audio Adapter"
7+
device "hw:2,0"
8+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import time
2+
import board
3+
import digitalio
4+
import adafruit_si4713
5+
from PIL import Image, ImageDraw, ImageFont
6+
from adafruit_rgb_display import st7789
7+
import mpd
8+
9+
#--| User Config |-----------------------------------
10+
FREQ = 89.00
11+
PLAYLIST = "test"
12+
UPDATE_RATE = 0.5
13+
#----------------------------------------------------
14+
15+
#==| SETUP |=========================================================
16+
17+
# Display
18+
disp = st7789.ST7789(
19+
board.SPI(),
20+
height=240,
21+
y_offset=80,
22+
rotation=180,
23+
cs=digitalio.DigitalInOut(board.CE0),
24+
dc=digitalio.DigitalInOut(board.D25),
25+
rst=digitalio.DigitalInOut(board.D24),
26+
baudrate=64000000,
27+
)
28+
29+
backlight = digitalio.DigitalInOut(board.D22)
30+
backlight.switch_to_output()
31+
backlight.value = True
32+
33+
background = Image.open("radio_bg.png")
34+
STAT_FNT = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Bold.ttf", 55)
35+
STAT_CLR = (30, 100, 200)
36+
INFO_FNT = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 20)
37+
ARTS_CLR = (0, 100, 0)
38+
ALBM_CLR = (0, 100, 0)
39+
TITL_CLR = (0, 100, 0)
40+
PROG_CLR = (0, 100, 0)
41+
42+
# Buttons
43+
button1 = digitalio.DigitalInOut(board.D23)
44+
button1.switch_to_input(pull=digitalio.Pull.UP)
45+
button2 = digitalio.DigitalInOut(board.D24)
46+
button2.switch_to_input(pull=digitalio.Pull.UP)
47+
48+
# Radio
49+
radio = adafruit_si4713.SI4713(
50+
board.I2C(),
51+
reset=digitalio.DigitalInOut(board.D26),
52+
timeout_s = 0.5
53+
)
54+
radio.tx_frequency_khz = int(FREQ * 1000)
55+
radio.tx_power = 115
56+
57+
# MPD
58+
mpc = mpd.MPDClient()
59+
mpc.connect("localhost", 6600)
60+
mpc.stop()
61+
mpc.clear()
62+
mpc.load(PLAYLIST)
63+
mpc.play()
64+
mpc.repeat(1)
65+
#====================================================================
66+
67+
def button1_handler():
68+
if status['state'] == 'play':
69+
mpc.pause()
70+
else:
71+
mpc.play()
72+
73+
def button2_handler():
74+
mpc.next()
75+
76+
def update_display():
77+
image = background.copy()
78+
draw = ImageDraw.Draw(image)
79+
80+
draw.text(
81+
(150, 20),
82+
"{:>5.1f}".format(FREQ),
83+
anchor="mt",
84+
font=STAT_FNT,
85+
fill=STAT_CLR
86+
)
87+
88+
if status['state'] == 'play':
89+
r = 10 * (1 + int(time.monotonic() % 3))
90+
draw.arc( (30-r, 20-r, 30+r, 20+r),
91+
120, 60,
92+
fill = (0, 0, 0),
93+
width = 3
94+
)
95+
96+
info = mpc.currentsong()
97+
artist = info.get('artist', 'unknown')
98+
album = info.get('album', 'unknown')
99+
song = info.get('title', 'unknown')
100+
draw.text( (5, 150), artist, font=INFO_FNT, fill=ARTS_CLR )
101+
draw.text( (5, 170), album, font=INFO_FNT, fill=ALBM_CLR)
102+
draw.text( (5, 190), song, font=INFO_FNT, fill=TITL_CLR)
103+
104+
perc = float(status['elapsed']) / float(status['duration'])
105+
draw.rectangle( (5, 215, 235, 230), outline=PROG_CLR)
106+
draw.rectangle (
107+
(5, 215, 5 + int(230*perc), 230),
108+
fill=PROG_CLR
109+
)
110+
111+
disp.image(image)
112+
113+
last_update = time.monotonic()
114+
115+
while True:
116+
now = time.monotonic()
117+
try:
118+
status = mpc.status()
119+
except ConnectionError:
120+
mpc.connect("localhost", 6600)
121+
status = mpc.status()
122+
if not button1.value:
123+
button1_handler()
124+
while not button1.value:
125+
time.sleep(0.001)
126+
if not button2.value:
127+
button2_handler()
128+
while not button2.value:
129+
time.sleep(0.001)
130+
if now - last_update > UPDATE_RATE:
131+
update_display()
132+
last_update = now
133+
134+
9.3 KB
Loading

0 commit comments

Comments
 (0)