Cara Membuat LCD RGB Terkontrol
() translation by (you can also view the original English article)
Dalam tutorial ini saya akan menunjukkan kepada Anda bagaimana menggunakan Raspberry Pi dengan LCD RGB untuk memantau tweet. Tweet yang berisi kata kunci spesifik ditampilkan dalam warna yang ditentukan. Anda akan belajar cara membuat aplikasi Twitter untuk menggunakan API untuk mendorong data ke program Anda, memberi Anda kesempatan untuk belajar tentang program Python multi-threaded.
Perangkat yang Diperlukan
- Raspberry Pi model B ($40)
- Koneksi internet kabel atau nirkabel
- Adafruit RGB Negative 16x2 LCD+Keypad Kit for Raspberry Pi ($25)
Persiapan
- Ikuti langkah-langkah di situs Adafruit untuk mengatur dan menguji LCD RGB Anda.
- Instal Tweepy seperti ini:
sudo pip install tweepy
Install Aplikasi Twitter
Buat sebuah permohonan Twitter, di situs web Twitter, untuk memungkinkan program Raspberry Pi terhubung ke aliran. Untuk melakukan ini, navigasikan ke https://apps.twitter.com dan masuk.
Buat permohonan dengan mengisi formulir, seperti yang ditunjukkan di bawah ini. Catatan: Anda dapat menempatkan placeholder untuk situs web – ini adalah bidang yang wajib diisi tetapi tidak diperlukan untuk proyek Raspberry Pi ini.



Saat Anda mengirimkan formulir, sebuah permohonan akan dibuat. Pada tab Kunci API Anda akan melihat Kunci API dan rahasia API – ini unik bagi Anda dan akan diminta nanti.



Gulir ke bawah dan klik Buat token akses saya :



Perbarui halaman jika perlu. Anda sekarang akan memiliki token akses dan rahasia token akses. Sekali lagi, ini unik untuk Anda dan akan diminta nanti.



Itu permohonan yang telah dibuat.
Kode
Dalam kode untuk proyek ini, di bawah ini, Anda harus mengedit untuk mengedit untuk memasukkan Kunci API, Rahasia API, Kunci Token Akses, dan Rahasia Token Akses Anda. Anda juga mungkin perlu mengubah jalur ke Adafruit_CharLCDPlate
sehingga cocok dengan tempat Anda menginstalnya pada Pi Anda.
Saat Anda menjalankan program, Pi akan terhubung ke Twitter. Dalam contoh ini, setiap tweet yang berisi kata Jeremy akan didorong ke Pi dan ditampilkan pada LCD RGB. Ini adalah tweet publik dari siapa pun di dunia ini — tidak ada hubungannya dengan siapa yang Anda ikuti — siapa pun itu!
Ingatlah untuk menggunakan sudo
ketika menjalankan skrip Python - root diperlukan untuk akses i2c ke LCD. Sebagai contoh:
sudo python /path/to/script/script.py
Catatan: Program tidak akan ditutup dengan benar dengan menekan Control-C. Sebagai gantinya, buka shell lain dan gunakan ps ax
dan kill
untuk menghentikan program.
Program mencari kata-kata lain dalam tweet untuk mengatur warna lampu latar RGB. Jika ia menemukan karya Clarkson, ia akan mengatur warna menjadi merah, pearl adalah hijau, love adalah biru.
Terakhir, jika ada waktu di antara Tweet, program akan menggulirkan teks yang dibungkus kata sehingga Anda bisa melihat semuanya.
1 |
import sys |
2 |
sys.path.append('/home/pi/py/'+ |
3 |
'Adafruit-Raspberry-Pi-Python-Code/Adafruit_CharLCDPlate') |
4 |
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate |
5 |
from tweepy.streaming import StreamListener |
6 |
from tweepy import OAuthHandler |
7 |
from tweepy import Stream |
8 |
import json |
9 |
import threading |
10 |
import time |
11 |
import textwrap |
12 |
import subprocess |
13 |
|
14 |
api_key='###' |
15 |
api_secret='###' |
16 |
|
17 |
access_token_key='###' |
18 |
access_token_secret='###' |
19 |
|
20 |
|
21 |
class DisplayLoop(StreamListener): |
22 |
"""
|
23 |
This class is a listener for tweet stream data.
|
24 |
It's also callable so it can run the main display
|
25 |
thread loop to update the display.
|
26 |
"""
|
27 |
def __init__(self): |
28 |
self.lcd = Adafruit_CharLCDPlate() |
29 |
self.lcd.backlight(self.lcd.RED) |
30 |
self.lcd.clear() |
31 |
self.backlight_map = {'clarkson':self.lcd.RED, |
32 |
'pearl':self.lcd.GREEN, |
33 |
'love':self.lcd.BLUE, |
34 |
'hate':self.lcd.YELLOW, |
35 |
'kyle':self.lcd.TEAL, |
36 |
'like':self.lcd.VIOLET} |
37 |
self.msglist = [] |
38 |
self.pos = 0 |
39 |
self.tweet = 'Nothing yet' |
40 |
|
41 |
def set_backlight(self): |
42 |
words = self.tweet.lower().split(' ') |
43 |
use_default = True |
44 |
for w in words: |
45 |
if w in self.backlight_map: |
46 |
self.lcd.backlight(self.backlight_map[w]) |
47 |
use_default = False |
48 |
break
|
49 |
if use_default: |
50 |
self.lcd.backlight(self.lcd.WHITE) |
51 |
|
52 |
def on_data(self, data): |
53 |
tweet_data = json.loads(data) |
54 |
self.tweet = tweet_data['text'].encode('ascii', |
55 |
errors='backslashreplace') |
56 |
self.msglist = [x.ljust(16) for x in |
57 |
textwrap.wrap(str(self.tweet),16)] |
58 |
self.pos = 0 |
59 |
self.set_backlight() |
60 |
self.scroll_message() |
61 |
return True |
62 |
|
63 |
def on_error(self, status): |
64 |
print status |
65 |
|
66 |
def write_message(self,msg): |
67 |
self.lcd.home() |
68 |
self.lcd.message(msg) |
69 |
|
70 |
def scroll_message(self): |
71 |
"""
|
72 |
Displays the page of text and updates
|
73 |
the scroll position for the next call
|
74 |
"""
|
75 |
if len(self.msglist) == 0: |
76 |
self.write_message(''.ljust(16)+'\n'+''.ljust(16)) |
77 |
elif len(self.msglist) == 1: |
78 |
self.write_message(self.msglist[0]+'\n'+''.ljust(16)) |
79 |
elif len(self.msglist) == 2: |
80 |
self.write_message(self.msglist[0]+'\n'+ |
81 |
self.msglist[1]) |
82 |
else: |
83 |
if self.pos >= len(self.msglist)-1: |
84 |
self.pos = 0 |
85 |
else: |
86 |
self.write_message(self.msglist[self.pos]+'\n'+ |
87 |
self.msglist[self.pos+1]) |
88 |
self.pos+=1 |
89 |
|
90 |
def get_ip_address(self,interface): |
91 |
"Returns the IP address for the given interface e.g. eth0"
|
92 |
try: |
93 |
s = subprocess.check_output( |
94 |
["ip","addr","show",interface]) |
95 |
return s.split('\n')[2].strip().split( |
96 |
' ')[1].split('/')[0] |
97 |
except: |
98 |
return '?.?.?.?' |
99 |
|
100 |
def __call__(self): |
101 |
while True: |
102 |
if self.lcd.buttonPressed(self.lcd.LEFT): |
103 |
self.write_message( |
104 |
self.get_ip_address('eth0').ljust(16)+'\n'+ |
105 |
self.get_ip_address('wlan0').ljust(16)) |
106 |
else: |
107 |
self.scroll_message() |
108 |
time.sleep(1) |
109 |
|
110 |
display_loop_instance = DisplayLoop() |
111 |
|
112 |
# Start the thread running the callable
|
113 |
threading.Thread(target=display_loop_instance).start() |
114 |
|
115 |
# Log in to twitter and start the tracking stream
|
116 |
auth = OAuthHandler(api_key, api_secret) |
117 |
auth.set_access_token(access_token_key, access_token_secret) |
118 |
stream = Stream(auth, display_loop_instance) |
119 |
stream.filter(track=['jeremy']) |
Kode Penjelasan



Ada beberapa hal penting yang terjadi dalam kode. Anda dapat menyesuaikan kode untuk tujuan Anda sendiri, dan saya mendorong Anda untuk bereksperimen. Ada dua threads:
- thread program utama yang menghubungkan ke Twitter dan menerima tweet, dan
- thread tampilan yang mengelola layar LCD – ini akan menampilkan dan menggulir teks.
Thread Utama
Ada contoh sederhana di halaman github Tweepy - ini terhubung ke sungai dan mencetak tweet yang berisi kata basket. Anda bisa melihat dalam contoh itu, lebih jelas, bagaimana kelas StreamListener
didefinisikan dan kemudian diteruskan ke konstruktor Stream
.
Saya telah melakukan hal yang sama dalam skrip saya di sini: stream = Stream (auth, display_loop_instance)
dengan display_loop_instance
.
Instance dari StreamListener
dapat didefinisikan beberapa metode acara untuk memanggil Tweepy. Seperti contohnya, saya hanya menggunakan on_data
dan on_error
. Setelah koneksi ke Twitter dibuat, on_data
dipanggil kapan pun tweet baru masuk. Data tweet yang diterima adalah dokumen JSON yang disandikan UTF-8 seperti ini:
1 |
{"created_at":"Sun May 18 11:07:53 +0000 2014","id":467984918237437952,"id_str":"467984918237437952","text":"Here's a test message to Jeremy (@jerbly) from controlmypi","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2413327915,"id_str":"2413327915","name":"ControlMyPi","screen_name":"ControlMyPi","location":"","url":null,"description":null,"protected":false,"followers_count":0,"friends_count":0,"listed_count":0,"created_at":"Wed Mar 26 23:39:27 +0000 2014","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":7,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/abs.twimg.com\/sticky\/default_profile_images\/default_profile_5_normal.png","profile_image_url_https":"https:\/\/abs.twimg.com\/sticky\/default_profile_images\/default_profile_5_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":true,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[{"screen_name":"jerbly","name":"Jeremy Blythe","id":106417803,"id_str":"106417803","indices":[33,40]}]},"favorited":false,"retweeted":false,"filter_level":"medium","lang":"en"} |
Saya hanya tertarik pada atribut teks
dari dokumen ini jadi saya akan menggunakan library json Python untuk mengurai json ke objek Python. Saya kemudian dapat mengambil teks dan menyandikannya sebagai ascii sehingga kompatibel dengan layar LCD.
Dalam pemahaman daftar saya sudah kata membungkus tweet menjadi daftar lebar 16 karakter empuk ruang, siap untuk ditampilkan di layar: [x.ljust (16) untuk x dalam textwrap.wrap (str (self.tweet), 16) ]
Selanjutnya, saya telah memanggil set_backlight
– ini mencari kata sekunder dalam teks tweet dan menetapkan warna lampu latar RGB. Jika tidak menemukan kata di peta maka tampilan default menjadi putih.
Akhirnya saya telah memanggil scroll_message
untuk memaksa pembaruan segera pada tampilan.
Tampilkan thread
Ada dua hal yang terjadi dalam program: menerima tweet dari thread dan menggulirnya di layar. Thread tampilan menangani pengguliran dan juga memonitor keypad untuk fungsi sekunder.
Dua utas perlu bekerja di atas data yang sama, tweet, jadi untuk mempermudah, utas tampilan juga memanggil metode pada display_loop_instance
.
Python memiliki cara yang rapi untuk memulai utas yang memanggil metode pada objek. Anda hanya perlu membuat kelas callable dengan mendefinisikan metode __call__
.
Dalam kode metode ini memiliki perulangan yang tidak pernah berakhir dengan jarak 1 detik. Jarak ini sangat penting, tanpa itu teks akan menggulir terlalu cepat. Juga thread harus menghasilkan sehingga tidak perlu banyak menggunakan waktu CPU.
Suatu hal yang sangat berguna di sini, dan mungkin titik di mana program ini dapat diperluas, adalah pemantauan tombol. Saya suka menjalankan program ini dari boot-up sehingga Anda dapat membawanya ke tempat kerja atau di suatu tempat dan tancapkan ke LAN di DHCP dan berfungsi.
Namun kadang-kadang, Anda perlu mencari tahu alamat IP yang telah Anda tetapkan agar Anda dapat menggunakannya. Pada loop tampilan tidak pernah berakhir, saya telah menambahkan pernyataan sederhana untuk memeriksa apakah tombol keypad kiri ditekan. Jika ya, saya menampilkan alamat IP kabel dan nirkabel di layar. Anda dapat menguji ini dengan menekan tombol kiri.
Untuk menjalankan program secara otomatis saat boot, cukup edit file /etc/rc.local
dan tambahkan baris untuk menjalankan program Anda:
python /home/pi/path/to/program/program.py &
.
Mulai ulang dan itu akan mulai secara otomatis.
Kesimpulan
Dalam tutorial ini, saya telah menunjukkan kepada Anda bagaimana membangun perangkat, menggunakan Raspberry Pi dan Adafruit RGB LCD, untuk menampilkan tweet dan menampilkannya dalam warna tertentu tergantung pada kata kunci yang ditentukan dalam tweet itu sendiri.
Beri tahu saya jika Anda punya ide yang menarik untuk penggunaan proyek ini atau cara Anda menyesuaikannya untuk tujuan Anda sendiri.