Come costruire un LCD RGB controllato da Tweet

Cosa starai creando

In questo tutorial ti mostrerò come utilizzare un Raspberry Pi con un LCD RGB per monitorare i tweet. I tweet contenenti parole chiave specifiche vengono visualizzati in colori definiti. Imparerai come creare un'applicazione Twitter per utilizzare l'API di streaming per inviare dati al tuo programma, offrendoti l'opportunità di conoscere i programmi Python multi-threaded.

Hardware richiesto

  • Raspberry Pi model B ($ 40)
  • Connessione Internet cablata o wireless
  • Adafruit RGB Negative 16x2 LCD + Kit tastiera per Raspberry Pi ($ 25)

Impostare

  1. Segui i passaggi sul sito di Adafruit per configurare e testare il tuo LCD RGB.
  2. Installa Tweepy in questo modo:

sudo pip installa tweepy

Crea un'applicazione Twitter

Creare un'applicazione Twitter, sul sito Web di Twitter, per consentire al programma Raspberry Pi di connettersi allo stream. Per farlo, vai su https://apps.twitter.com e accedi.

Creare un'applicazione completando il modulo, come mostrato di seguito. Nota: è possibile inserire un segnaposto per il sito Web: si tratta di un campo obbligatorio ma non richiesto per questo progetto Raspberry Pi.

Creazione di un'applicazione Twitter sul sito web di Twitter

Quando invii il modulo verrà creata un'applicazione. Sul Chiavi API scheda vedrai un Chiave API e Segreto dell'API-questi sono unici per te e saranno richiesti in seguito.

Dal momento che la chiave e il segreto dell'API sono unici, ho ridotto il mio su questo screenshot

Scorri verso il basso e fai clic Crea il mio token di accesso:

Creazione del token di accesso

Aggiorna la pagina se è necessario. Ora avrai il Token di accesso e Accedi al segreto del token. Ancora una volta, questi sono unici per te e saranno richiesti in seguito.

Token completati. Possono anche essere rigenerati, crearne di nuovi o revocati

Questa è l'applicazione creata.

Il codice

Nel codice di questo progetto, di seguito, dovrai modificare per modificare per inserire il tuo Chiave API, Segreto API, Chiave del token di accesso e Accesso token segreto. Potrebbe anche essere necessario modificare il percorso per Adafruit_CharLCDPlate quindi corrisponde a dove l'hai installato sul tuo Pi.

Quando esegui il programma, il Pi si collegherà al Twitter Stream. In questo esempio, qualsiasi tweet contenente la parola Jeremy verrà inviato al Pi e visualizzato sul display LCD RGB. Questo è un tweet pubblico da chiunque nel mondo - niente a che fare con chi stai seguendo - è chiunque!

Ricordati di usare sudo quando si eseguono i privilegi di script-root Python sono richiesti per l'accesso i2c al display LCD. Per esempio:

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

Nota: il programma non si chiude in modo pulito premendo Control-C. Invece, apri un'altra shell e usala ps ax e uccidere per terminare il programma.

Il programma cerca altre parole nel tweet per impostare il colore della retroilluminazione RGB. Se trova il lavoro Clarkson imposterà il colore al rosso, perla è verde, amore è blu.

Infine, se c'è tempo tra Tweets, il programma scorrerà il testo avvolto in una parola in modo che tu possa vederlo tutto. 

import sys.path.append ('/ home / pi / py /' + 'Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate') da Adafruit_CharLCDPlate importa Adafruit_CharLCDPlate da tweepy.streaming importa StreamListener da tweepy import OAuthHandler da tweepy import Stream import json import threading import time import textwrap import subprocess api_key = "###" api_secret = "###" access_token_key = "###" access_token_secret = "###" classe DisplayLoop (StreamListener): "" "Questa classe è un ascoltatore per i dati del flusso tweet. È anche richiamabile in modo che possa eseguire il ciclo del thread di visualizzazione principale per aggiornare il display. "" "def __init __ (self): self.lcd = Adafruit_CharLCDPlate () self.lcd.backlight (self.lcd. RED) self.lcd.clear () self.backlight_map = 'clarkson': self.lcd.RED, 'pearl': self.lcd.GREEN, 'love': self.lcd.BLUE, 'odio': self. lcd.YELLOW, 'kyle': self.lcd.TEAL, 'like': self.lcd.VIOLET self.msglist = [] self.pos = 0 self.tweet = 'Ancora niente' def set_backlight (self): words = self.tweet.lower (). split (") use_default = True for w in words: if w in self.backlight_map: self.lcd.backlight (self.backlight_map [w]) use_default = False break se use_default: self.lcd.backlight (self.lcd.WHITE) def on_data (self, data) : tweet_data = json.loads (data) self.tweet = tweet_data ['text']. encode ('ascii', errors = "backslashreplace") self.msglist = [x.ljust (16) per x in textwrap.wrap ( str (self.tweet), 16)] self.pos = 0 self.set_backlight () self.scroll_message () restituisce True def on_error (self, status): print status def write_message (self, msg): self.lcd.home () self.lcd.message (msg) def scroll_message (self): "" "Visualizza la pagina di testo e aggiorna la posizione di scorrimento per la successiva chiamata" "" se len (self.msglist) == 0: self.write_message (".ljust (16) + '\ n' +". ljust (16)) elif len (self.msglist) == 1: self.write_message (self.msglist [0] + '\ n' + ". (16)) elif len (self.msglist) == 2: self.write_message (self.msglist [0] + '\ n' + self.msglist [1]) else: if self.pos> = len (self. msglist) -1: self.pos = 0 else: self.write_message (self.msglist [self.pos] + '\ n' + self.msglist [self.pos + 1]) self.pos + = 1 def get_ip_address (self, interface): "Restituisce l'indirizzo IP per l'interfaccia specificata, ad es. eth0 "try: s = subprocess.check_output ([" ip "," addr "," mostra ", interfaccia]) return s.split ('\ n') [2] .strip (). split (") [1] ] .split ('/') [0] tranne: return '?.?.?.?' def __call __ (self): while True: if self.lcd.buttonPressed (self.lcd.LEFT): self.write_message (self.get_ip_address ('eth0'). ljust (16) + '\ n' + self.get_ip_address ( 'wlan0'). ljust (16)) else: self.scroll_message () time.sleep (1) display_loop_instance = DisplayLoop () # Avvia il thread che esegue il thread richiamabile.Thread (target = display_loop_instance) .start () # Accedi per Twitter e avviare il flusso di monitoraggio 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']) 

Il codice spiegato

Display Tweet

Ci sono alcune cose chiave che accadono nel codice. Puoi adattare il codice per i tuoi scopi e ti incoraggio a sperimentare. Ci sono due thread:

  1. il thread del programma principale che si collega a Twitter e riceve i tweet e
  2. il thread di visualizzazione che gestisce lo schermo LCD: visualizza e scorre il testo.

Filo principale

C'è un semplice esempio nella pagina di GitH Tweepy: questo si collega allo stream e stampa qualsiasi tweet contenente la parola pallacanestro. Puoi vedere in questo esempio, più chiaramente, come a StreamListener la classe viene definita e quindi passata a ruscello costruttore. 

Ho fatto lo stesso nel mio script qui: stream = Stream (auth, display_loop_instance) con display_loop_instance

L'istanza di StreamListener può definire alcuni metodi di evento per Tweepy da chiamare. Proprio come l'esempio, sto solo usando on_data e on_error. Una volta stabilita la connessione a Twitter on_data viene chiamato ogni volta che arriva un nuovo tweet. Il tweet che viene ricevuto è un documento JSON con codifica UTF-8 come questo:

"created_at": "Sun 18 maggio 11:07:53 +0000 2014", "id": 467984918237437952, "id_str": "467984918237437952", "testo": "Ecco un messaggio di prova per Jeremy (@jerbly) da controlmypi ", "source": "web", "troncato": 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, "utente":  "id": 2413327915, "id_str": "2413327915", "name": "ControlMyPi", "SCREEN_NAME": "ControlMyPi", "location": "", "url": null, "descrizione": null, "protected": false, "followers_adeguati": 0, "count_amici ": 0," account_name ": 0," created_at ":" Mar 26 mar 23:39:27 +0000 2014 "," favourites_count ": 0," utc_offset ": null," time_zone ": null," geo_enabled ": false," verificato ": 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.c om \ / images \ / themes \ / theme1 \ /bg.png " "profile_background_tile": false, "profile_image_url":" http: \ / \ / abs.twimg.com \ / appiccicoso \ / default_profile_images \ /default_profile_5_normal.png ", "profile_image_url_https": "https: \ / \ / abs.twimg.com \ / appiccicoso \ / 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, "segue": null, "follow_request_sent": null, "notifiche": null, "geo": null, "coordinate": null, "luogo": null, "collaboratori": null, "retweet_count": 0, "favorite_count": 0, "enti":  "hashtag": simboli [], " ": []," urls ": []," user_mentions ": [" screen_name ":" jerbly "," name ":" Jeremy Blythe "," id ": 106417803," id_str ":" 106417803 "," indici ": [33,40]]," i preferiti ": false," retweet ": false," filter_level ":" medium", "lang": "en" 

Mi interessa solo il testo attributo da questo documento quindi userò la libreria json di Python per analizzare il json in oggetti Python. Posso quindi prendere il testo e codificarlo come ASCII in modo che sia compatibile con lo schermo LCD. 

Nella comprensione di una lista ho pronunciato il tweet in un elenco di 16 caratteri, riempito di spazio, pronto per essere visualizzato sullo schermo: [x.ljust (16) per x in textwrap.wrap (str (self.tweet), 16)]

Successivamente, ho chiamatoset_backlight-questo cerca una parola secondaria all'interno del testo tweet e imposta il colore della retroilluminazione RGB. Se non trova una parola sulla mappa, il display assume automaticamente il valore di bianco.

Finalmente ho chiamato scroll_message forzare un aggiornamento immediato sul display.

Visualizza thread

Ci sono due cose indipendenti che accadono nel programma: ricevere i tweet dallo stream e scorrerli sul display. Il thread del display si occupa dello scrolling e monitora anche la tastiera per una funzione secondaria.

I due thread devono lavorare sugli stessi dati, i tweet, quindi per mantenere le cose semplici il thread di visualizzazione chiama anche i metodi su display_loop_instance

Python ha un modo pulito per avviare un thread che chiama un metodo su un oggetto. Devi solo rendere la tua classe callable definendo a __chiamata__ metodo. 

Nel codice questo metodo ha un ciclo while senza fine con un sonno di 1 secondo. Questo sonno è vitale, senza di esso il testo scorrerà troppo velocemente. Anche il thread deve produrre in modo che non usi inutilmente un sacco di tempo della CPU.

Una cosa molto utile qui, e forse un punto in cui questo programma potrebbe essere ampliato, è il monitoraggio della tastiera. Mi piace eseguire questo programma dal boot-up in modo che tu possa portarlo a lavoro o da qualche parte e collegarlo a una LAN su DHCP e funziona solo. 

A volte, però, è necessario trovare l'indirizzo IP che ti è stato assegnato in modo da poter eseguire l'SSH. Nel loop infinito del thread di visualizzazione ho aggiunto una semplice istruzione per verificare se il pulsante sinistro della tastiera è premuto. Se lo è, visualizzo gli indirizzi IP cablati e wireless sullo schermo. Puoi testare questo premendo il tasto sinistro.

Per avviare automaticamente il programma all'avvio, basta modificare il file /etc/rc.local file e aggiungi una linea per eseguire il tuo programma:

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

Riavvia e dovrebbe avviarsi automaticamente.

Conclusione

In questo tutorial, ti ho mostrato come costruire un dispositivo, utilizzando un Raspberry Pi e un Adafruit RGB LCD, per visualizzare i tweet e visualizzarli in determinati colori in base alle parole chiave definite nel tweet stesso.

Fammi sapere se hai idee particolarmente interessanti sull'uso di questo progetto o sui modi in cui lo hai adattato per i tuoi scopi.