CHIP OLED Radio Internet (versi 3) | Vlog

Ini masih membahas CHIP OLED Shield untuk C.H.I.P. Kali ini adalah contoh aplikasinya. Dan lagi-lagi saya membuat Radio. Bahkan ini berarti versi ke-3 untuk radio internet CHIP (baca: C.H.I.P Radio Internet versi 2). Ini karena saya menggunakan CHIP yang sama saat saya ngoprek radio internet sebelumnya.

Hanya saja, kali ini saya melakukan beberapa perbaikan, yaitu:

  1. Yang pertama sangat jelas, saya menggunakan CHIPOLED Shield. Yang berarti saya menggunakan display OLED mungil namun sangat jelas tampilannya dan hemat dayanya.
  2. Karena menggunakan CHIPOLED Shield, maka saya leluasa membuat kontrol untuk radio karena shield ini sudah dibekali dengan 5 buah tombol.
  3. Berbeda dengan sebelumnya yang menggunakan library vlc, untuk engine streaming kali ini saya menggunakan mpd/mpc. Terus terang saya mencontek cara yang digunakan oleh piradio.

Berikut adalah video-nya:

Di bawah ini adalah source code-nya. Jangan lupa menginstall beberapa yang diperlukan, yaitu: mpd/mpc, luma.OLED, PIL, CHIP_GPIO. Seperti biasa, source code ini open source. Anda bisa menggunakannya sesuai kebutuhan.

Nama script : chipoled_radio.py

#!/usr/bin/python

import os
import sys
import CHIP_IO.GPIO as GPIO
import time
import subprocess

from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306
from PIL import ImageFont

serial = i2c(port=1, address=0x3C)
device = ssd1306(serial, rotate=0)

#font_path = os.path.abspath(os.path.join(os.path.dirname(__file__),'fonts','FreePixel.ttf'))
font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf"
font_path_cnc = os.path.abspath(os.path.join(os.path.dirname(__file__),'fonts','C&C Red Alert [INET].ttf'))

font = ImageFont.truetype(font_path, 16)
font1 = ImageFont.truetype(font_path, 12)

_next = "XIO-P7"
_prev = "XIO-P4"
_up   = "XIO-P5"
_down = "XIO-P6"
_shut = "XIO-P3"

GPIO.setup(_next, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(_prev, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(_up,   GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(_down, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(_shut, GPIO.IN, pull_up_down=GPIO.PUD_UP)

vol = 50
channel_num = 0
channel_name = "OFF"

channel_file = os.path.abspath(os.path.join(os.path.dirname(__file__),"channel.txt"))
channel = open(channel_file,"r")
channel_arr = channel.readlines()
channel_count = len(channel_arr)

def show_radio() :
  global channel_name, channel_num
  with canvas(device) as draw:
    pos = 128 * vol / 100
    draw.rectangle((0, 55, 127, 63), outline="white", fill="black")
    draw.rectangle((0, 55, pos, 63), outline="white", fill="white")
    draw.text((0,0), "Channel : "+str(channel_num+1), font=font1, fill="white")
    draw.text((0,22), channel_name, font=font, fill="white")

def change_volume(nomor) :
  subprocess.Popen(["amixer","-c","0","sset","Power Amplifier",str(nomor)+"%"])
  show_radio()

def change_channel(nomor) :
    global channel_name, channel_detail, channel_num
    if not channel_arr[nomor].strip() :
      channel_num = 0
      change_channel(channel_num)
    else :
      channel_detail = channel_arr[nomor].split(";")
      print "Nama:", channel_detail[0]
      print "URL :", channel_detail[1]
      subprocess.Popen(["mpc", "stop"])
      subprocess.Popen(["mpc", "clear"])
      subprocess.Popen(["mpc", "add", channel_detail[1].strip()])
      subprocess.Popen(["mpc", "play"])
      channel_name = channel_detail[0].strip()
      show_radio()

change_volume(vol)
change_channel(0)

while True:
  if GPIO.input(_up) == 0 :
    vol += 10
    if vol > 100 :
      vol = 100
    change_volume(vol)

  if GPIO.input(_down) == 0 :
    vol -= 10
    if vol < 0 :
      vol = 0
    change_volume(vol)

  if GPIO.input(_prev) == 0 :
    channel_num -= 1
    if channel_num < 0 :
      channel_num = channel_count-1
    change_channel(channel_num)

  if GPIO.input(_next) == 0 :
    channel_num += 1
    if channel_num > channel_count-1 :
      channel_num = 0
    change_channel(channel_num)

  if GPIO.input(_shut) == 0 :
    with canvas(device) as draw:
      draw.text((0,0), "Shutting down...", font=font1, fill="white")
    subprocess.Popen(['mpc','stop'])
    subprocess.Popen(['mpc','clear'])
    GPIO.cleanup()
    #subprocess.call("sudo poweroff", shell=True)
    exit()

  time.sleep(0.05)
GPIO.cleanup()

Nama file : channel.txt

HardRock FM;http://streaming.mramedia.com:8000/hardrock
SmartFM JKT;http://101.50.0.77:8000/smartfm.aac
iRadio FM;http://streaming.mramedia.com:8000/iradio
RPK FM;http://rpkfm.indostreamserver.com:8030
HeartLine FM;http://202.129.186.43:7010
Sindo Trijaya;http://202.147.199.101:8000
Elshinta FM;http://202.137.4.147:8000
Cosmopolitan;http://61.8.70.166:8000/cosmo-aac
Trax FM Jkt;http://61.8.70.166:8000/trax-jkt
Sonora Classic Rock;http://46.105.122.141:6664

Saya menyimpan source code ini di github: CHIP OLED Radio Internet. Gerber untuk shield di github: CHIP OLED Shield

Jika ada masukan atau pertanyaan, silakan tuliskan di bagian komentar. Kalau sempat akan saya balas. Semoga artikel ini bermanfaat.

Iklan

Satu respons untuk “CHIP OLED Radio Internet (versi 3) | Vlog

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google+

You are commenting using your Google+ account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

w

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.