So erstellen Sie ein Tweet-gesteuertes RGB-LCD

Was Sie erstellen werden

In diesem Tutorial zeige ich Ihnen, wie Sie einen Raspberry Pi mit einem RGB-LCD verwenden, um Tweets zu überwachen. Tweets, die bestimmte Schlüsselwörter enthalten, werden in definierten Farben angezeigt. Sie erfahren, wie Sie eine Twitter-Anwendung erstellen, um mithilfe der Stream-API Daten in Ihr Programm zu pushen. So haben Sie die Möglichkeit, sich mit Multithread-Python-Programmen vertraut zu machen.

Erforderliche Hardware

  • Himbeer-Pi-Modell B ($ 40)
  • Kabelgebundene oder drahtlose Internetverbindung
  • Adafruit RGB Negative 16x2 LCD + Tastatur-Kit für Raspberry Pi ($ 25)

Konfiguration

  1. Befolgen Sie die Schritte auf der Adafruit-Site, um Ihr RGB-LCD einzurichten und zu testen.
  2. Installieren Sie Tweepy wie folgt:

sudo pip install tweepy

Erstellen Sie eine Twitter-Anwendung

Erstellen Sie auf der Twitter-Website eine Twitter-Anwendung, damit das Raspberry Pi-Programm eine Verbindung zum Stream herstellen kann. Navigieren Sie dazu zu https://apps.twitter.com und melden Sie sich an.

Erstellen Sie eine Anwendung, indem Sie das untenstehende Formular ausfüllen. Hinweis: Sie können einen Platzhalter für die Website setzen. Dies ist ein Pflichtfeld, jedoch nicht für dieses Raspberry Pi-Projekt.

Erstellen einer Twitter-Anwendung auf der Twitter-Website

Wenn Sie das Formular absenden, wird eine Anwendung erstellt. Auf der API-Schlüssel Tab sehen Sie eine API-Schlüssel und API-Geheimnis-diese sind für Sie einzigartig und werden später benötigt.

Da der API-Schlüssel und das Geheimnis eindeutig sind, habe ich meinen auf diesem Screenshot überarbeitet

Scrollen Sie nach unten und klicken Sie auf Erstellen Sie mein Zugriffstoken:

Erstellen des Zugriffstokens

Aktualisieren Sie die Seite bei Bedarf. Sie haben jetzt die Zugangstoken und Zugriffstoken geheim. Auch diese sind für Sie einzigartig und werden später benötigt.

Tokens abgeschlossen Sie können auch regeneriert werden, um neue zu erstellen oder zu widerrufen

Das ist die Anwendung, die erstellt wurde.

Der Code

Im folgenden Code für dieses Projekt müssen Sie bearbeiten, um Ihr Projekt einzugeben API-Schlüssel, API-Geheimnis, Zugriffstoken-Schlüssel und Zugriff auf Token Secret. Möglicherweise müssen Sie auch den Pfad zum ändern Adafruit_CharLCDPlate es stimmt also überein, wo Sie es auf Ihrem Pi installiert haben.

Wenn Sie das Programm ausführen, stellt der Pi eine Verbindung zum Twitter-Stream her. In diesem Beispiel jeder Tweet, der das Wort enthält Jeremy wird auf den Pi gedrückt und auf dem RGB-LCD angezeigt. Dies ist ein öffentlicher Tweet von irgendjemand auf der Welt - nichts mit dem zu tun, dem Sie folgen - es ist jedermann!

Denken Sie daran zu verwenden Sudo Bei der Ausführung von Python sind Skript-Root-Berechtigungen für den Zugriff von i2c auf das LCD erforderlich. Zum Beispiel:

 Sudo Python /path/to/script/script.py

Hinweis: Das Programm wird durch Drücken von nicht sauber geschlossen Steuerung-C. Öffnen Sie stattdessen eine andere Shell und verwenden Sie ps Axt und töten um das Programm zu beenden.

Das Programm sucht nach anderen Wörtern im Tweet, um die Farbe der RGB-Hintergrundbeleuchtung einzustellen. Wenn es die Arbeit findet Clarkson Die Farbe wird auf Rot gesetzt, Perle ist grün, Liebe ist blau.

Wenn zwischen den Tweets noch Zeit ist, scrollt das Programm den Text in Word um, damit Sie alles sehen können. 

import sys sys.path.append. ('/ home / pi / py /' + 'Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate') von Adafruit_CharLCDPlate importieren Adafruit_CharLCDPlate von tweepy.streaming importieren StreamListener aus tweepy.update importieren import json import threading Zeit importieren import textwrap import subprozess api_key = "###" api_secret = "###" access_token_key = "###" access_token_secret = "###" -Klasse DisplayLoop (StreamListener): "" "Diese Klasse ist Ein Listener für Tweet-Stream-Daten. Er kann auch aufgerufen werden, damit er die Hauptdarstellungs-Threadschleife ausführen kann, um die Anzeige zu aktualisieren. "" "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, 'hate': self. lcd.YELLOW, 'kyle': self.lcd.TEAL, 'like': self.lcd.VIOLET self.msglist = [] self.pos = 0 self.tweet = 'Noch nichts' def set_backlight (self): words = self.tweet.lower (). split (") use_default = True für w in Worten: wenn w in self.backlight_map: self.lcd.backlight (self.backlight_map [w]) use_default = False break, wenn 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) für x in textwrap.wrap ( str (self.tweet), 16)] self.pos = 0 self.set_backlight () self.scroll_message () Rückgabe True def on_error (self, status): Druckstatus def write_message (self, msg): self.lcd.home () self.lcd.message (msg) def scroll_message (self): "" "Zeigt die Textseite an und aktualisiert die Bildlaufposition für den nächsten Aufruf" "", wenn len (self.msglist) == 0: self.write_message (".just (16) + '\ n' +". ljust (16)) elif len (self.msglist) == 1: self.write_message (self.msglist [0] + '\ n' + ". ljust (16)) elif len (self.msglist) == 2: self.write_message (self.msglist [0] + '\ n' + self.msglist [1]) else: wenn 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): "Gibt die IP-Adresse für die angegebene Schnittstelle zurück, z. eth0 "try: s = subprozess.check_output ([" ip "," addr "," show ", interface]) gibt s.split ('\ n') [2] .strip (). split (") zurück ] .split ('/') [0] außer: 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 () # Starten Sie den Thread, der das aufrufbare Threading.Thread (target = display_loop_instance) twittern und den Tracking-Stream starten 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']) 

Der Kodex erklärt

Tweet-Anzeige

Es gibt ein paar wichtige Dinge im Code. Sie können den Code für Ihre eigenen Zwecke anpassen und ich ermutige Sie, zu experimentieren. Es gibt zwei Fäden:

  1. der Hauptprogramm-Thread, der eine Verbindung zu Twitter herstellt und die Tweets empfängt, und
  2. Der Anzeigethread, der den LCD-Bildschirm verwaltet, zeigt den Text an und scrollt ihn.

Haupt-Bedroung

Es gibt ein einfaches Beispiel auf der Tweepy-Github-Seite. Diese stellt eine Verbindung zum Stream her und druckt jeden Tweet, der das Wort enthält Basketball. Sie können in diesem Beispiel klarer sehen, wie ein StreamListener Klasse wird definiert und dann an die übergeben Strom Konstrukteur. 

Ich habe das gleiche in meinem Skript hier gemacht: stream = Stream (auth, display_loop_instance) mit display_loop_instance

Die Instanz von StreamListener kann einige Ereignismethoden definieren, die von Tweepy aufgerufen werden sollen. Wie im Beispiel verwende ich nur on_data und on_error. Sobald die Verbindung zu Twitter hergestellt ist on_data Wird aufgerufen, wenn ein neuer Tweet eingeht. Die empfangenen Tweet-Daten sind ein UTF-8-kodiertes JSON-Dokument wie das folgende:

"created_at": "So May 18 11:07:53 +0000 2014", "id": 467984918237437952, "id_str": "467984918237437952", "text": "Hier eine Testnachricht an Jeremy (@jerbly) von controlmypi "," source ":" web "," abgeschnitten ": 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 ",": " "id": 2413327915, "id_str": "2413327915", "name": "ControlMyPi", "screen_name": "ControlMyPi", "location": "", "url": null, "description": null, "protected": false, "followers_count": 0, "friends_count": 0, "aufgelisteter_count": 0, "created_at": "Mi 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 ":" de "," 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_iml_https ":" https : \ / \ / abs.twimg.c om \ / 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_profil_images \ /default_profile_5_normal.png "," profile_link_color ":" 0084B4 "," profile_sididebar_border_color ":" C_07 ". : "DDEEF6", "profile_text_color": "333333", "profile_use_background_image": true, "default_profile": true, "default_profile_image": true, "folgend": null, "follow_request_sent": null, "notifications": null, "Geo": Null, "Koordinaten": Null, "Ort": Null, "Mitwirkende": Null, "Retweet_Count": 0, "Favorite_Count": 0, "Entities": "Hashtags": [], "Symbole ": []," urls ": []," user_mentions ": [" screen_name ":" jerbly "," name ":" Jeremy Blythe "," id ": 106417803," id_str ":" 106417803 "," Indizes ": [33,40]]," favorited ": false," retweetet ": false," filter_level ":" medium "," lang ":" en " 

Ich interessiere mich nur für das Text Attribut aus diesem Dokument, also werde ich Pythons Json-Bibliothek verwenden, um den Json in Python-Objekte zu parsen. Ich kann dann den Text greifen und als ASCII kodieren, damit er mit dem LCD-Bildschirm kompatibel ist. 

In einem Listenverständnis habe ich den Tweet in eine Liste mit 16 Zeichen Breite gepackt, die auf dem Bildschirm angezeigt werden kann: [x.ljust (16) für x in textwrap.wrap (str (self.tweet), 16)]

Als nächstes habe ich angerufenset_backlight-Dies sucht nach einem sekundären Wort im Tweet-Text und legt die RGB-Hintergrundbeleuchtung fest. Wenn kein Wort in der Karte gefunden wird, ist die Anzeige standardmäßig weiß.

Endlich habe ich angerufen scroll_message um eine sofortige Aktualisierung der Anzeige zu erzwingen.

Thread anzeigen

Das Programm hat zwei unabhängige Vorgänge: Empfang von Tweets aus dem Stream und Scrollen durch sie auf dem Display. Der Display-Thread kümmert sich um das Scrollen und überwacht außerdem die Tastatur für eine sekundäre Funktion.

Die beiden Threads müssen mit den gleichen Daten, den Tweets, arbeiten. Um die Dinge einfach zu halten, ruft der Anzeigethread auch Methoden für die display_loop_instance

Python bietet eine nette Möglichkeit, einen Thread zu starten, der eine Methode für ein Objekt aufruft. Sie müssen Ihre Klasse lediglich durch die Definition von a aufrufbar machen __Anruf__ Methode. 

Im Code hat diese Methode eine niemals endende while-Schleife mit einem 1-Sekunden-Ruhezustand. Dieser Schlaf ist wichtig, ohne dass der Text zu schnell durchlaufen wird. Außerdem muss der Thread nachgeben, sodass er nicht unnötig viel CPU-Zeit benötigt.

Eine besonders nützliche Sache und möglicherweise ein Punkt, an dem dieses Programm erweitert werden könnte, ist die Tastaturüberwachung. Ich mag es, dieses Programm vom Boot-up aus zu starten, damit Sie es mit zur Arbeit nehmen können oder irgendwo und an ein LAN an DHCP anschließen, und es funktioniert einfach. 

Manchmal müssen Sie jedoch die IP-Adresse ermitteln, die Sie zugewiesen haben, damit Sie ssh verwenden können. In der Endlosschleife des Anzeigethreads habe ich eine einfache Anweisung hinzugefügt, um zu überprüfen, ob die linke Tastaturtaste gedrückt ist. Wenn dies der Fall ist, werden die verdrahteten und die drahtlosen IP-Adressen auf dem Bildschirm angezeigt. Sie können dies testen, indem Sie die linke Taste drücken.

Um das Programm beim Booten automatisch auszuführen, bearbeiten Sie einfach das /etc/rc.local Datei und fügen Sie eine Zeile hinzu, um Ihr Programm auszuführen:

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

Starten Sie neu und es sollte automatisch gestartet werden.

Fazit

In diesem Tutorial habe ich Ihnen gezeigt, wie Sie ein Gerät mithilfe eines Raspberry Pi und eines Adafruit RGB-LCDs erstellen, um Tweets anzuzeigen und sie in bestimmten Farben anzuzeigen, abhängig von den im Tweet selbst definierten Schlüsselwörtern.

Lassen Sie mich wissen, ob Sie besonders interessante Ideen für die Verwendung dieses Projekts haben oder wie Sie es für Ihre eigenen Zwecke angepasst haben.