Advertisement
  1. Computer Skills

Cara Membuat LCD RGB Terkontrol

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

What You'll Be Creating

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

Persiapan

  1. Ikuti langkah-langkah di situs Adafruit untuk mengatur dan menguji LCD RGB Anda.
  2. 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.

Membuat permohonan kepada Twitter di situs web Twitter

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.

Karena Kunci dan Rahasia API unik, saya telah menghapus milik saya pada tangkapan layar ini

Gulir ke bawah dan klik Buat token akses saya :

Membuat Token Akses

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

Token selesai. Mereka juga dapat dibuat ulang, untuk membuat yang baru, atau dicabut

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

Tampilan Tweet

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:

  1. thread program utama yang menghubungkan ke Twitter dan menerima tweet, dan
  2. 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.


Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Computer Skills tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.