Cum se construiește un LCD RGB controlat

Ce veți crea

În acest tutorial vă voi arăta cum să utilizați un Raspberry Pi cu un RGB LCD pentru a monitoriza tweets. Tweets conținând cuvinte cheie specifice sunt afișate în culori definite. Veți învăța cum să creați o aplicație Twitter pentru a utiliza fluxul API pentru a împinge date către programul dvs., oferindu-vă posibilitatea de a afla mai multe despre programele Python cu mai multe fire.

Hardware necesar

  • Raspberry Pi Model B ($ 40)
  • Conexiune prin Internet prin cablu sau fără fir
  • Adafruit RGB Negative 16x2 LCD + Set de tastatură pentru Zmeura Pi ($ 25)

Înființat

  1. Urmați pașii de pe site-ul Adafruit pentru configurarea și testarea LCD-ului dvs. RGB.
  2. Instalați Tweepy așa:

sudo pip install tweepy

Creați o aplicație Twitter

Creați o aplicație Twitter, pe site-ul web Twitter, pentru a permite programului Raspberry Pi să se conecteze la flux. Pentru aceasta, navigați la https://apps.twitter.com și conectați-vă.

Creați o aplicație completând formularul, după cum se arată mai jos. Notă: puteți pune un substituent pentru site-ul dvs. - este un câmp obligatoriu, dar nu este necesar pentru acest proiect Raspberry Pi.

Crearea unei aplicații Twitter pe site-ul Twitter

Când trimiteți formularul, va fi creată o aplicație. Pe Taste API veți vedea o Cheia API și Secretul API-acestea sunt unice pentru tine și vor fi necesare mai târziu.

Deoarece cheia API și Secretul sunt unice, am redactat-o ​​pe această captură de ecran

Derulați în jos și faceți clic pe Creați indicativul meu de acces:

Crearea tokenului de acces

Actualizați pagina dacă doriți. Veți avea acum Jeton de acces și Accesul la secretul accesului. Din nou, acestea sunt unice pentru dvs. și vor fi necesare ulterior.

Token-urile au fost finalizate. Ele pot fi, de asemenea, regenerate, pentru a crea altele noi sau revocate

Aceasta este aplicația creată.

Codul

În codul pentru acest proiect, de mai jos, va trebui să editați pentru a edita pentru a vă introduce Cheia API, API Secret, Accesați cheia pentru Token și Accesați Secretul Token. De asemenea, este posibil să schimbați calea către Adafruit_CharLCDPlate așa că se potrivește cu locul în care l-ai instalat pe Pi.

Când rulați programul, Pi se va conecta la fluxul Twitter. În acest exemplu, orice tweet care conține cuvântul Jeremy va fi împins către Pi și afișat pe ecranul RGB. Acesta este orice tweet public de la oricine din lume - nimic de-a face cu cine urmărești - este oricine!

Amintiți-vă să utilizați sudo atunci când rulați Python script-root privilegiile sunt necesare pentru accesul i2c pe ecranul LCD. De exemplu:

 sudo python /path/to/script/script.py

Notă: Programul nu se va închide cu ușurință apăsând Control-C. În schimb, deschideți o altă coajă și utilizați ps ax și ucide pentru a termina programul.

Programul caută alte cuvinte din tweet pentru a seta culoarea luminii de fundal RGB. Dacă găsește lucrarea Clarkson se va seta culoarea roșie, perla este verde, dragoste este albastru.

În cele din urmă, dacă există timp între tweets, programul va derula textul înfășurat în cuvânt, astfel încât să puteți vedea totul. 

importați sys sys.path.append ('/ home / pi / py /' + Adafruit_CharLCDPlate) de la Adafruit_CharLCDPlate Adafruit_CharLCDPlate de la tweepy.streaming import StreamListener de la importul tweepy OAuthHandler de la tweepy import Stream import json import filet import import import textwrap subproces api_key = "###" api_secret = "###" access_token_key = "###" acces_token_secret = "###" clasa DisplayLoop (StreamListener): " un ascultător pentru datele de flux tweet.El este, de asemenea, apelabil, astfel încât să poată rula buclă de afișare principal pentru a actualiza afișarea. "" def __init __ (auto): self.lcd = Adafruit_CharLCDPlate () self.lcd.backlight (self.lcd. RED) auto.lcd.clear () auto.backlight_map = 'clarkson': self.lcd.RED, 'perla': self.lcd.GREEN, 'iubire': self.lcd.BLUE, 'ură': sine. lcd.YELLOW, 'kyle': self.lcd.TEAL, 'like': self.lcd.VIOLET self.msglist = [] self.pos = 0 self.tweet = 'Nimic încă' def set_backlight (self) = "" = "" "" "" "" "" w în cuvinte: dacă w în self.backlight_map: self.lcd.backlight (auto.backlight_map [w]) use_default = False break dacă use_default: self.lcd.backlight (self.lcd.WHITE) def on_data (auto, date) : tweet_data = json.loads (data) self.tweet = tweet_data ['text']. (self, self): self.scroll_message () return adevarata def on_error (auto, status): print status def write_message (auto, msg): self.lcd.home () auto.lcd.message (msg) def scroll_message (auto): "" "Afișează pagina de text și actualizează poziția de defilare pentru următorul apel" "" dacă len (auto.msglist) == 0: self.write_message (".ljust (16) + '\ n" + ".Ljust (16)) elif len (auto.msglist) == 1: self.write_message (self.msglist [0] +' \ n '+ (De exemplu: self.write_message (self.msglist [0] + '\ n' + self.msglist [1]) alt: dacă self.pos> = len (self. msglist) -1: self.pos = 0 altul: self.write_message (auto.msglist [self.pos] + '\ n' + self.msglist [self.pos + 1]) auto.pos + = 1 def get_ip_address (auto, interfață): "Returnează adresa IP pentru interfața dată, de ex. eth0 "încercați: s = subprocess.check_output ([" ip "," addr "," show ", interfață]) return s.split (' ] .split ('/') [0] cu excepția: return '?.?.?.?' __call __ (auto): în timp ce Adevărat: dacă self.lcd.buttonPressed (self.lcd.LEFT): self.write_message (self.get_ip_address ('eth0') ljust (16) + '\ n' + self.get_ip_address "wlan0") ljust (16)) altfel: self.scroll_message () time.sleep (1) display_loop_instance = DisplayLoop la twitter și la pornirea fluxului de urmărire auth = OAuthHandler (api_key, api_secret) auth.set_access_token (access_token_key, access_token_secret) stream = Stream (auth, display_loop_instance) stream.filter (track = ['jeremy']) 

Codul a fost explicat

Afișare pe Twitter

Există câteva chestiuni cheie care se întâmplă în cod. Puteți să vă adaptați codul pentru propriile scopuri și vă încurajez să experimentați. Există două fire:

  1. firul principal de program care se conectează la Twitter și primește mesajele tweet și
  2. firul de afișare care gestionează ecranul LCD - afișează și derulează textul.

Subiect principal

Există un exemplu simplu pe pagina tweepy github - aceasta se conectează la flux și imprimă orice tweet conținând cuvântul baschet. În acest exemplu puteți vedea mai clar cum a StreamListener clasa este definită și apoi trecută la Curent constructor. 

Am făcut același lucru în scenariul meu aici: stream = Stream (auth, display_loop_instance) cu display_loop_instance

Cazul lui StreamListener pot defini câteva metode de eveniment pentru Tweepy pentru a apela. Ca și exemplul, folosesc doar on_data și on_error. Odată ce conexiunea la Twitter este stabilită on_data se numește de fiecare dată când apare un tweet nou. Datele tweet-ul primite sunt un document JSON codat în UTF-8, astfel:

"created_at": "Sun 18 mai 11:07:53 +0000 2014", "id": 467984918237437952, "id_str": "467984918237437952", "text": " “, "sursă": "web", "trunchiate": fals, "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, "utilizator":  "id": 2413327915, "id_str": "2413327915", "nume": "ControlMyPi", "SCREEN_NAME": "ControlMyPi", "Locul de amplasare": "", "URL": null, "descriere": null, "protejate": 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 ": fals" verificat ": fals" statuses_count ": 7," lang ":" en " "contributors_enabled": fals "is_translator": fals" is_translation_enabled ":, fals" profile_background_color ":" C0DEED " "profile_background_image_url": "http: \ / \ / abs.twimg.com \ / imagini \ / teme \ / THEME1 \ /bg.png", "profile_background_image_url_https":" https : \ / \ / abs.twimg.c OM \ / imagini \ / teme \ / THEME1 \ /bg.png " "profile_background_tile": fals, "profile_image_url":" http: \ / \ / abs.twimg.com \ / lipicios \ / default_profile_images \ /default_profile_5_normal.png “, "profile_image_url_https": "https: \ / \ / abs.twimg.com \ / lipicios \ / 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, "următorul": null, "follow_request_sent": null, "notificări": nule, "geo": "coordonate" nule: null, "loc": null, "colaboratori": null, "retweet_count": 0, "FAVORITE_COUNT": 0, "entități":  "hashtaguri": [], "simboluri "," id_str ":" 106417803 "," "," indici ": [33,40]]" drept preferat ": fals" retweeted ": fals" filter_level ":" mediu“, "lang": "en" 

Sunt interesat doar de text atribut din acest document, așa că voi folosi biblioteca json a Python pentru a analiza obiectele json în Python. Pot să apuc textul și să îl codific ca ascii, astfel încât acesta să fie compatibil cu ecranul LCD. 

Într-o înțelegere a listei, am introdus cuvântul tweet într-o listă cu lățimea de 16 caractere, pregătită pentru a fi afișată pe ecran: [x.ljust (16) pentru x în textwrap.wrap (str (self.tweet), 16)]

Apoi, am sunatset_backlight-acest lucru caută un cuvânt secundar în textul tweet și stabilește culoarea RGB de fundal. Dacă nu găsește un cuvânt pe hartă, afișajul este implicit alb.

În cele din urmă am sunat scroll_message pentru a forța o actualizare imediată pe ecran.

Afișați firul

Există două lucruri independente care se întâmplă în program: primirea de tweete din flux și derularea acestora pe ecran. Firele de afișare au grijă de defilare și monitorizează de asemenea tastatura pentru o funcție secundară.

Cele două fire trebuie să funcționeze pe aceleași date, tweets, astfel încât să păstreze lucrurile simple thread-ul de afișare, de asemenea, apeluri metode de pe display_loop_instance

Python are o modalitate clară de a porni un fir care apelează o metodă pe un obiect. Trebuie doar să faceți clasa dvs. callabilă prin definirea unui __apel__ metodă. 

În cod, această metodă are o buclă fără sfârșit în timp ce are un somn de 1 secundă. Acest somn este vital, fără ca textul să se deruleze prea repede. De asemenea, firul trebuie să cedeze, astfel încât să nu utilizeze în mod inutil o mulțime de timp CPU.

Un lucru util aici și, eventual, un punct în care acest program ar putea fi extins, este monitorizarea tastaturii. Îmi place să rulez acest program de la boot-up pentru a putea să-l ducem la lucru sau undeva și să îl conectați la o rețea LAN pe DHCP și acesta funcționează. 

Uneori, totuși, trebuie să aflați adresa IP pe care ați fost alocată, astfel încât să o puteți înscrie. În firul de afișare cu buclă neterminată, am adăugat o simplă declarație pentru a verifica dacă butonul stânga al tastaturii este apăsat. Dacă este cazul, afișăm adresele IP cu fir și fără fir pe ecran. Puteți testa acest lucru apăsând tasta din stânga.

Pentru a rula automat programul la boot, trebuie doar să editați /etc/rc.local fișier și adăugați o linie pentru a rula programul:

python /home/pi/path/to/program/program.py &

Reporniți și ar trebui să înceapă automat.

Concluzie

În acest tutorial, v-am arătat cum să construiți un dispozitiv utilizând un Raspberry Pi și un LCD Adafruit RGB pentru a afișa tweets și a le afișa în anumite culori, în funcție de orice cuvinte cheie definite în tweet-ul în sine.

Dați-mi voie să știu dacă aveți idei deosebit de interesante pentru utilizarea acestui proiect sau modurile în care l-ați adaptat pentru propriile scopuri.