Slik bygger du en Tweet Controlled RGB LCD

Hva du skal skape

I denne veiledningen vil jeg vise deg hvordan du bruker en Raspberry Pi med en RGB LCD for å overvåke tweets. Tweets som inneholder bestemte søkeord, vises i definerte farger. Du lærer hvordan du oppretter et Twitter-program for å bruke stream-API for å skyve data til programmet, noe som gir deg muligheten til å lære om multi-threaded Python-programmer.

Nødvendig maskinvare

  • Raspberry Pi modell B ($ 40)
  • Kablet eller trådløs Internett-tilkobling
  • Adafruit RGB Negativ 16x2 LCD + Tastatur Kit for Raspberry Pi ($ 25)

Setup

  1. Følg trinnene på Adafruit-siden for å konfigurere og teste RGB-LCD-skjermen.
  2. Installer Tweepy slik:

sudo pip installere tweepy

Lag en Twitter-applikasjon

Opprett en Twitter-applikasjon på Twitter-nettstedet, slik at Raspberry Pi-programmet kan koble til strømmen. For å gjøre dette, naviger til https://apps.twitter.com og logg inn.

Lag et program ved å fylle ut skjemaet, som vist nedenfor. Merk: Du kan sette en plassholder for nettstedet - det er et obligatorisk felt, men ikke nødvendig for dette Raspberry Pi-prosjektet.

Opprette en Twitter-applikasjon på Twitter nettsiden

Når du sender inn skjemaet, vil det bli opprettet et søknad. På API-nøkler fanen vil du se en API-nøkkel og API-hemmelig-Disse er unike for deg og vil bli påkrevet senere.

Siden API-nøkkelen og hemmeligheten er unik, har jeg reddet min på dette skjermbildet

Rull ned og klikk Opprett min tilgangstoken:

Opprette tilgangstoken

Oppdater siden hvis du trenger det. Du har nå den Tilgangstoken og Tilgang token hemmelig. Igjen, disse er unike for deg og vil bli krevd senere.

Tokene fullført. De kan også regenereres, opprette nye eller tilbakekalle

Det er programmet som er opprettet.

Koden

I koden for dette prosjektet, under, må du redigere for å redigere for å skrive inn API-nøkkel, API Hemmelig, Tilgangstastnøkkel og Access Token Secret. Du må kanskje også endre banen til Adafruit_CharLCDPlate så det samsvarer med hvor du har installert det på Pi.

Når du kjører programmet, vil Pi koble til Twitter Stream. I dette eksemplet er det noen tweet som inneholder ordet Jeremy vil bli skjøvet til Pi og vises på RGB-LCD-skjermen. Dette er noen offentlig tweet fra alle i verden - ingenting å gjøre med hvem du følger - det er noen!

Husk å bruke sudo Når du kjører Python-scriptroten, er det nødvendig med privilegier for i2c-tilgang til LCD-skjermen. For eksempel:

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

Merk: Programmet lukkes ikke ved å trykke på Kontroll-C. I stedet åpner du et annet skall og bruker ps øks og drepe å avslutte programmet.

Programmet ser etter andre ord i tweetet for å sette fargen på RGB-bakgrunnsbelysningen. Hvis det finner arbeidet Clarkson det vil sette fargen til rød, perle er grønn, kjærlighet er blå.

Endelig, hvis det er tid mellom Tweets, vil programmet rulle den tekstinnpakte teksten slik at du kan se alt. 

importer sys sys.path.append ('/ home / pi / py /' + 'Adafruit-Raspberry-Pi-Python-kode / Adafruit_CharLCDPlate') fra Adafruit_CharLCDPlate import Adafruit_CharLCDPlate fra tweepy.streaming importere StreamListener fra tweepy import OAuthHandler fra tweepy import Stream import json import threading importtid import tekstwrap import delprosess api_key = "###" api_secret = "###" access_token_key = "###" access_token_secret = "###" klasse DisplayLoop (StreamListener): "" "Denne klassen er en lytter til tweet stream data. Den kan også kalles slik at den kan kjøre hoveddisplayet trådsløyfe for å oppdatere skjermen. "" "def __init __ (selv): self.lcd = Adafruit_CharLCDPlate () self.lcd.backlight (self.lcd. RED) self.lcd.clear () self.backlight_map = 'clarkson': self.lcd.RED, 'perle': self.lcd.GREEN, 'love': self.lcd.BLUE, 'hate': selv. lcd.YELLOW, 'kyle': self.lcd.TEAL, 'like': self.lcd.VIOLET self.msglist = [] self.pos = 0 self.tweet = 'Ingenting ennå' def set_backlight (selv): ord = self.tweet.lower (). split (") use_default = True for w i ord: hvis w i self.backlight_map: self.lcd.backlight (self.backlight_map [w]) use_default = False break hvis use_default: self.lcd.backlight (self.lcd.WHITE) def on_data (selvdata, data) : tweet_data = json.loads (data) self.tweet = tweet_data ['text']. encode ('ascii', feil = "backslashreplace") self.msglist = [x.ljust (16) for x i textwrap.wrap (self.tweet), 16)] self.pos = 0 self.set_backlight () self.scroll_message () returnere True def on_error (selvstatus): print status def write_message (self, msg): self.lcd.home () self.lcd.message (msg) def scroll_message (self): "" "Viser tekstsiden og oppdaterer rulleposisjonen for neste anrop" "" hvis 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]) ellers: hvis self.pos> = len 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 (selvgrensesnitt): "Returnerer IP-adressen for det gitte grensesnittet, f.eks. eth0 "try: s = subprocess.check_output ([" ip "," addr "," show ", grensesnitt)) returner s.split ('\ n') [2] .strip () ] .split ('/') [0] bortsett fra: retur '?.?.?.?' def __call __ (selv): mens True: hvis self.lcd.buttonPressed (self.lcd.LEFT): self.write_message (self.get_ip_address ('eth0'). ljust (16) + '\ n' + self.get_ip_address ( 'wlan0'). ljust (16)) ellers: self.scroll_message () time.sleep (1) display_loop_instance = DisplayLoop () # Start tråden som kjører callable threading.Thread (target = display_loop_instance) .start () # Logg inn til twitter og start sporingstrømmen auth = OAuthHandler (api_key, api_secret) auth.set_access_token (access_token_key, access_token_secret) stream = Stream (auth, display_loop_instance) stream.filter (spor = ['jeremy']) 

Koden forklart

Tweet display

Det er noen viktige ting som skjer i koden. Du kan tilpasse koden til eget bruk, og jeg oppfordrer deg til å eksperimentere. Det er to tråder:

  1. Hovedprogramtråden som kobles til Twitter og mottar tweets, og
  2. skjermtråden som styrer LCD-skjermen - den viser og ruller teksten.

Hovedtrekk

Det er et enkelt eksempel på Tweepy github siden - dette kobles til strømmen og skriver ut noen tweet som inneholder ordet basketball. Du kan se i det eksemplet, tydeligere hvordan a StreamListener Klassen er definert og sendes deretter til Strøm konstruktør. 

Jeg har gjort det samme i skriptet mitt her: stream = Stream (auth, display_loop_instance) med display_loop_instance

Forekomsten av StreamListener kan definere noen hendelsesmetoder for Tweepy å ringe. Akkurat som eksemplet bruker jeg bare on_data og on_error. Når forbindelsen til Twitter er opprettet on_data kalles når en ny tweet kommer inn. Tweet-dataene som er mottatt, er et UTF-8-kodet JSON-dokument som dette:

"created_at": "søndag 18 mai 11:07:53 +0000 2014", "id": 467984918237437952, "id_str": "467984918237437952", "tekst": "Her er en testmelding til Jeremy (@jerbly) fra controlmypi ", "source": "web", "avkortet": 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, "bruker":  "id": 2413327915, "id_str": "2413327915", "name": "ControlMyPi", "SCREEN_NAME": "ControlMyPi", "location": "", "url": null, "description": null, "beskyttet": false, "followers_count": 0, "friends_count": 0, "listed_count": 0, "created_at": "ons mar 26 23:39:27 +0000 2014", "favourites_count": 0, "utc_offset ": null," TIME_ZONE ": null," geo_enabled ": falsk" bekreftet ": falsk", statuses_count ": 7," lang ":" en " "contributors_enabled": falsk " is_translator": falsk", is_translation_enabled ": false" profile_background_color ":" C0DEED " "profile_background_image_url": "http: \ / \ / abs.twimg.com \ / images \ / temaer \ / THEME1 \ /bg.png", "profile_background_image_url_https":" https : \ / \ / abs.twimg.c OM \ / images \ / temaer \ / THEME1 \ /bg.png " "profile_background_tile": false "profile_image_url":" http: \ / \ / abs.twimg.com \ / klissete \ / default_profile_images \ /default_profile_5_normal.png ", "profile_image_url_https": "https: \ / \ / abs.twimg.com \ / klissete \ / 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": sant "default_profile": sant "default_profile_image": sant "følgende": null, "follow_request_sent": null, "varsler": null, "geo": null, "koordinater": null, "sted": null, "bidragsytere": null, "retweet_count": 0, "FAVORITE_COUNT": 0, "enheter":  "hashtagger": [], "symboler "" ["," urls ": []," user_mentions ": [" screen_name ":" jerbly "," navn ":" Jeremy Blythe "," id ": 106417803," id_str ":" 106417803 " indeksene ": [33,40]]," favorittmerket ": falsk", retweeted ": falsk", filter_level ":" medium", "lang": "en" 

Jeg er bare interessert i tekst attributt fra dette dokumentet, så jeg vil bruke Pythons jsonbibliotek til å analysere json i Python-objekter. Jeg kan da ta tak i teksten og kode den som ascii slik at den er kompatibel med LCD-skjermen. 

I en listeforståelse har jeg snakket tweetet inn i en mellomromstastet 16 tegn bredde liste, klar til å vises på skjermen: [x.ljust (16) for x i textwrap.wrap (str (self.tweet), 16)]

Deretter har jeg ringtset_backlight-Dette ser etter et sekundært ord i tweet-teksten og setter RGB-bakgrunnslysfargen. Hvis det ikke finnes et ord i kartet, blir displayet som standard hvitt.

Til slutt har jeg ringt scroll_message for å tvinge en umiddelbar oppdatering på skjermen.

Vis tråden

Det er to uavhengige ting som skjer i programmet: mottar tweets fra strømmen og ruller gjennom dem på displayet. Displaytråden tar seg av rullingen og overvåker også tastaturet for en sekundær funksjon.

De to tråder må jobbe over de samme dataene, tweets, for å holde ting enkle, viser skjermtråden også metoder på display_loop_instance

Python har en fin måte å starte en tråd som kaller en metode på et objekt. Du må bare få klassen din til å ringes ved å definere en __anrop__ metode. 

I koden har denne metoden en uendelig mensløkke med en 1 sekunders søvn. Denne søvn er viktig, uten at teksten vil rulle gjennom for fort. Også tråden må gi slik at det ikke unødvendig bruker mye CPU-tid.

En ekstra nyttig ting her, og muligens et punkt der dette programmet kan utvides, er tastaturovervåking. Jeg liker å kjøre dette programmet fra oppstart, slik at du kan ta det til jobb eller et sted og koble det til et LAN på DHCP, og det virker bare. 

Noen ganger, skjønt, må du finne ut IP-adressen du har blitt tildelt, slik at du kan ssh inn i den. I skjermtrådens endeløse sløyfe har jeg lagt til en enkel setning for å sjekke om den venstre tastaturknappen er trykket. Hvis det er, viser jeg de kablede og trådløse IP-adressene på skjermen. Du kan teste dette ved å trykke på venstre tast.

For å kjøre programmet automatisk ved oppstart, rediger du bare /etc/rc.local fil og legg til en linje for å kjøre programmet:

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

Reboot og den skal starte automatisk.

Konklusjon

I denne opplæringen har jeg vist deg hvordan du bygger en enhet, ved hjelp av en Raspberry Pi og en Adafruit RGB LCD, for å vise tweets og vise dem i bestemte farger avhengig av noen søkeord definert i tweetet selv.

Gi meg beskjed hvis du har noen spesielt interessante ideer til bruk av dette prosjektet eller måter du har tilpasset det til dine egne formål.