Hur man bygger en Tweet Controlled RGB LCD

Vad du ska skapa

I denna handledning visar jag dig hur du använder en Raspberry Pi med en RGB-LCD för att övervaka tweets. Tweets som innehåller specifika sökord visas i definierade färger. Du lär dig hur du skapar en Twitter-applikation för att använda flödes API för att driva data till ditt program, vilket ger dig möjlighet att lära dig om Python-program med flera trådar..

Obligatorisk maskinvara

  • Raspberry Pi modell B ($ 40)
  • Trådbunden eller trådlös Internetanslutning
  • Adafruit RGB Negativ 16x2 LCD + Knappsats för Raspberry Pi ($ 25)

Inrätta

  1. Följ stegen på Adafruit-webbplatsen för att konfigurera och testa din RGB-LCD.
  2. Installera Tweepy så här:

sudo pip installera tvåpy

Skapa en Twitter-applikation

Skapa en Twitter-applikation på Twitter-webbplatsen, så att Raspberry Pi-programmet kan ansluta till strömmen. För att göra detta navigerar du till https://apps.twitter.com och loggar in.

Skapa en ansökan genom att fylla i formuläret, som visas nedan. Obs! Du kan placera en platshållare för webbplatsen. Det är ett obligatoriskt fält men inte nödvändigt för detta Raspberry Pi-projekt.

Skapa en Twitter-applikation på Twitter-webbplatsen

När du skickar formuläret skapas en ansökan. På API-nycklar fliken ser du en API-nyckel och API-hemlighet-Dessa är unika för dig och kommer att krävas senare.

Eftersom API-nyckeln och hemligheten är unika har jag redigerat min på denna skärmdump

Bläddra ner och klicka Skapa mitt åtkomsttoken:

Skapa åtkomsttoken

Uppdatera sidan om du behöver. Du har nu den Access token och Access token hemlighet. Återigen är dessa unika för dig och kommer att krävas senare.

Token slutförda. De kan också regenereras, skapa nya eller återkallas

Det är den ansökan som skapats.

Koden

I koden för det här projektet, nedan måste du redigera för att redigera för att skriva in ditt API-nyckel, API-hemlighet, Åtkomsttangent nyckel och Access Token Secret. Du kan också behöva ändra sökvägen till Adafruit_CharLCDPlate så det matchar var du har installerat den på din Pi.

När du kör programmet kommer Pi att ansluta till Twitter Stream. I det här exemplet är varje tweet innehållande ordet Jeremy kommer att tryckas på Pi och visas på RGB-LCD-skärmen. Det här är någon offentlig tweet från någon i världen - inget att göra med vem du följer - det är någon!

Kom ihåg att använda sudo När du kör Python-skriptroten krävs behörigheter för i2c-åtkomst till LCD-skärmen. Till exempel:

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

Obs! Programmet stängs inte ordentligt genom att trycka på Kontroll-C. Öppna istället ett annat skal och använd ps ax och döda att avsluta programmet.

Programmet letar efter andra ord i tweeten för att ställa in färgen på RGB-bakgrundsbelysningen. Om det hittar arbetet Clarkson det kommer att ställa in färgen till röd, pärla är grön, kärlek är blå.

Slutligen, om det finns tid mellan Tweets, kommer programmet att bläddra i den ordlindade texten så att du kan se allt. 

importera sys sys.path.append ('/ home / pi / py /' + 'Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate') från Adafruit_CharLCDPlate import Adafruit_CharLCDPlate från tweepy.streaming importera StreamListener från tweepy import OAuthHandler från tweepy import Stream import json import threading importtid import textwrap import delprocess api_key = "###" api_secret = "###" access_token_key = "###" access_token_secret = "###" klass DisplayLoop (StreamListener): "" "Denna klass är en lyssnare för tweet stream data. Det kan också kallas så att det kan köra huvuddisplayen trådslinga för att uppdatera displayen. "" "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, "hat": själv. lcd.YELLOW, 'kyle': self.lcd.TEAL, 'like': self.lcd.VIOLET self.msglist = [] self.pos = 0 self.tweet = 'Inget ännu' def set_backlight (själv): ord = self.tweet.lower (). split (") use_default = True for w i ord: om w i self.backlight_map: self.lcd.backlight (self.backlight_map [w]) use_default = Felbrytning om use_default: self.lcd.backlight (self.lcd.WHITE) def on_data (självdata) : tweet_data = json.loads (data) self.tweet = tweet_data ['text']. encode ('ascii', errors = "backslashreplace") self.msglist = [x.ljust (16) för x i textwrap.wrap str (self.tweet), 16)] self.pos = 0 self.set_backlight () self.scroll_message () returnera True def on_error (självstatus): utskriftstatus def write_message (self, msg): self.lcd.home () self.lcd.message (msg) def scroll_message (self): "" "Visar textsidan och uppdaterar rullningsläget för nästa samtal" "" om len (self.msglist) == 0: self.write_message (".ljust (16) + '\ n' +". ljust (16)) elif len (self.msglist) == 1: self.write_message (self.msglist [0] + '\ n' + ". (Self.msglist [0] + '\ n' + self.msglist [1]) annars: om 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 (självgränssnitt): "Returnerar IP-adressen för det givna gränssnittet t.ex. eth0 "försök: s = subprocess.check_output ([" ip "," addr "," show ", gränssnitt)) returnera s.split ('\ n') [2] .strip () ] .split ('/') [0] förutom: returnera '?.?.?.?' def __call __ (self): medan True: om self.lcd.buttonPressed (self.lcd.LEFT): self.write_message (self.get_ip_address ('eth0'). ljust (16) + '\ n' + self.get_ip_address ( "wlan0"). ljust (16)) annat: self.scroll_message () time.sleep (1) display_loop_instance = DisplayLoop () # Starta tråden som kör den kallbara tråden. Tråd (mål = display_loop_instance) .start () # Logga in till twitter och starta spårningsströ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 (spår = ['jeremy']) 

Koden förklaras

Tweet display

Det finns några viktiga saker som händer i koden. Du kan anpassa koden för egna ändamål, och jag uppmuntrar dig att experimentera. Det finns två trådar:

  1. huvudprogramtråden som ansluter till Twitter och tar emot tweets, och
  2. den displaytråd som hanterar LCD-skärmen - den visar och rullar texten.

Huvudsaklig tråd

Det finns ett enkelt exempel på Tweepy github-sidan - det här ansluter till strömmen och skriver ut vilken tweet som innehåller ordet basketboll. Du kan se i det exemplet tydligare hur a StreamListener klassen definieras och skickas sedan till Strömma konstruktör. 

Jag har gjort detsamma i mitt manus här: stream = Stream (auth, display_loop_instance) med display_loop_instance

Förekomsten av StreamListener kan definiera några händelsemetoder för Tweepy att ringa. Precis som exemplet använder jag bara on_data och on_error. När anslutningen till Twitter är etablerad on_data kallas närhelst en ny tweet kommer in. Den tweet-data som mottas är ett UTF-8-kodat JSON-dokument som det här:

"created_at": "Sun May 18 11:07:53 +0000 2014", "id": 467984918237437952, "id_str": "467984918237437952", "text": "Här är ett testmeddelande till Jeremy (@jerbly) från controlmypi ", "källa": "web", "stympad": 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, "användare":  "id": 2413327915, "id_str": "2413327915", "namn": "ControlMyPi", "SCREEN_NAME": "ControlMyPi", "location" "", "URL": null, "description": null, "protected": false, "followers_count": 0, "friends_count": 0, "listed_count": 0, "created_at": "ons mar 26 23:39:27 +0000 2014", "favoriter_count": 0, "utc_offset ": null," TIME_ZONE ": null," geo_enabled ": false," verifierad ": 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 \ / bilder \ / teman \ / theme1 \ /bg.png", "profile_background_image_url_https":" https : \ / \ / abs.twimg.c OM \ / bilder \ / teman \ / theme1 \ /bg.png " "profile_background_tile" falskt "profile_image_url":" http: \ / \ / abs.twimg.com \ / klibbig \ / default_profile_images \ /default_profile_5_normal.png " "profile_image_url_https": "https: \ / \ / abs.twimg.com \ / klibbig \ / 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": true, "efter": null, "follow_request_sent": null, "meddelanden": null, "geo": null, "koordinater": null, "plats": null, "bidragsgivare": null, "retweet_count": 0, "favorite_count": 0, "enheter":  "hashtags": [], "symboler ":", "urls": [], "user_mentions": ["screen_name": "jerbly", "namn": "Jeremy Blythe", "id": 106417803, "id_str": "106417803" index ": [33,40]]," favorit ": false," retweeted ": false," filter_level ":" medium", "lang": "en" 

Jag är bara intresserad av text attribut från detta dokument så jag använder Pythons json bibliotek för att analysera json i Python objekt. Jag kan sedan ta tag i texten och koda den som ascii så att den är kompatibel med LCD-skärmen. 

I en listaförståelse har jag blivit invecklat tweeten i en rymdplastad 16 teckenbreddslista, redo att visas på skärmen: [x.ljust (16) för x i textwrap.wrap (str (self.tweet), 16)]

Sedan har jag ringtset_backlight-Detta letar efter ett sekundärt ord i tweettexten och ställer in RGB-bakgrundsbelysningsfärgen. Om det inte finns något ord på kartan är displayen vanligtvis vit.

Slutligen har jag ringt scroll_message för att tvinga en omedelbar uppdatering på displayen.

Visa tråd

Det finns två oberoende saker som händer i programmet: tar emot tweets från strömmen och rullar igenom dem på skärmen. Displaytråden tar hand om rullningen och det övervakar även knappsatsen för en sekundär funktion.

De två trådarna måste arbeta över samma data, tweetsna, för att hålla sakerna enkla, visar displaytråden också metoder på display_loop_instance

Python har ett snyggt sätt att starta en tråd som kallar en metod på ett objekt. Du måste bara göra din klass möjlig genom att definiera en __ring upp__ metod. 

I koden har den här metoden en oändlig stundslinga med en 1 sekunders sömn. Denna sömn är viktig, utan texten kommer att bläddra igenom för snabbt. Även tråden måste ge så att det inte behöver använda mycket CPU-tid.

En extra användbar sak här, och möjligen en punkt där det här programmet kan utökas, är knappsatsövervakningen. Jag gillar att köra det här programmet från uppstart så att du kan ta det till jobbet eller någonstans och ansluta det till ett LAN på DHCP och det fungerar bara. 

Ibland måste du ta reda på den IP-adress du har tilldelats så att du kan ssh till den. I den vanliga änden av skärmgängan har jag lagt till ett enkelt meddelande för att kontrollera om den vänstra knappsatsen trycks ner. Om så är fallet visar jag de trådbundna och trådlösa IP-adresserna på skärmen. Du kan testa detta genom att trycka på vänster knapp.

För att köra programmet automatiskt vid start, redigera bara /etc/rc.local fil och lägg till en rad för att köra ditt program:

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

Starta om och starta automatiskt.

Slutsats

I den här handledningen har jag visat dig hur man konstruerar en enhet med en Raspberry Pi och en Adafruit RGB LCD, för att visa tweets och att visa dem i vissa färger beroende på vilka sökord som definieras i tweeten själv.

Låt mig veta om du har några särskilt intressanta idéer för användningen av det här projektet eller hur du har anpassat det för dina egna ändamål.