In deze tutorial laat ik je zien hoe je een Raspberry Pi met een RGB LCD gebruikt om tweets te monitoren. Tweets met specifieke zoekwoorden worden weergegeven in gedefinieerde kleuren. U leert hoe u een Twitter-toepassing maakt om de stream-API te gebruiken om gegevens naar uw programma te pushen, zodat u meer te weten kunt komen over Python-programma's met meerdere threads..
sudo pip installeer tweepy
Maak een Twitter-applicatie op de Twitter-website, zodat het Raspberry Pi-programma verbinding kan maken met de stream. Ga hiervoor naar https://apps.twitter.com en log in.
Maak een applicatie door het invullen van het formulier, zoals hieronder getoond. Opmerking: u kunt een tijdelijke aanduiding voor de website plaatsen. Dit is een verplicht veld maar is niet vereist voor dit Raspberry Pi-project.
Een Twitter-applicatie maken op de Twitter-websiteWanneer u het formulier verzendt, wordt een aanvraag gemaakt. Op de API-sleutels tab zie je een API sleutel en API geheim-deze zijn uniek voor u en zullen later nodig zijn.
Omdat de API Key en Secret uniek zijn, heb ik de mijne op deze screenshot geredigeerdScroll naar beneden en klik Maak mijn toegangstoken:
De toegangstoken makenVervers de pagina als dat nodig is. Je hebt nu de Toegangstoken en Toegang token geheim. Nogmaals, deze zijn uniek voor u en zullen later nodig zijn.
Tokens voltooid. Ze kunnen ook worden geregenereerd, om nieuwe te maken of worden ingetrokkenDat is de applicatie die is gemaakt.
In de onderstaande code voor dit project moet je het bewerken om je in te voeren API sleutel, API Secret, Toegang tot Token Key en Toegang tot het geheime token. U moet mogelijk ook het pad naar de wijzigen Adafruit_CharLCDPlate
dus het komt overeen met waar je het op je Pi hebt geïnstalleerd.
Wanneer u het programma uitvoert, maakt de Pi verbinding met de Twitter-stream. In dit voorbeeld elke tweet die het woord bevat Jeremy wordt naar de Pi geduwd en weergegeven op het RGB LCD-scherm. Dit is een openbare tweet van iedereen in de wereld - niets te maken met wie je volgt - het is iedereen!
Vergeet niet om te gebruiken sudo
tijdens het uitvoeren van de Python zijn script-rootbevoegdheden vereist voor toegang tot het LCD-scherm voor de i2c. Bijvoorbeeld:
sudo python /path/to/script/script.py
Opmerking: het programma kan niet goed worden gesloten door op te drukken Besturing C. Open in plaats daarvan een andere shell en gebruik ps bijl
en doden
om het programma te beëindigen.
Het programma zoekt naar andere woorden in de tweet om de kleur van de RGB-achtergrondverlichting in te stellen. Als het het werk vindt Clarkson het zal de kleur op rood zetten, parel is groen, liefde is blauw.
Ten slotte, als er tijd tussen de tweets is, scrolt het programma de tekst in woordomslag zodat je het allemaal kunt zien.
import sys sys.path.append ('/ home / pi / py /' + 'Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate') van Adafruit_CharLCDPlate import Adafruit_CharLCDPlate van tweepy.streaming import StreamListener van tweepy import OAuthHandler van tweepy import Stream import json import threading import time import textwrap import subproces api_key = "###" api_secret = "###" access_token_key = "###" access_token_secret = "###" class DisplayLoop (StreamListener): "" "Deze klasse is een listener voor tweet stream data. Het is ook opvraagbaar zodat het de hoofddisplay thread loop kan gebruiken om het display bij te werken. "" "def __init __ (self): self.lcd = Adafruit_CharLCDPlate () self.lcd.backlight (self.lcd. ROOD) 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 = 'Nog niets' def set_backlight (self): woorden = self.tweet.lower (). split (") use_default = Waarvoor met woorden: if w in self.backlight_map: self.lcd.backlight (self.backlight_map [w]) use_default = False break if 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) voor x in textwrap.wrap ( str (self.tweet), 16)] self.pos = 0 self.set_backlight () self.scroll_message () return True def on_error (zelf, status): print status def write_message (self, msg): self.lcd.home () self.lcd.message (msg) def scroll_message (self): "" "Geeft de pagina met tekst weer en werkt de schuifpositie bij voor het volgende gesprek" "" als 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 (zelf, interface): "Retourneert het IP-adres voor de gegeven interface, bijvoorbeeld eth0 "try: s = subprocess.check_output ([" ip "," addr "," show ", interface]) return s.split ('\ n') [2] .strip (). splitsen (") [1 ] .split ('/') [0] behalve: 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 () # Start de thread met de callable threading.Thread (target = display_loop_instance) .start () # Inloggen om te twitteren en de volgstroom te 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'])
Er zijn een paar belangrijke dingen die in de code gebeuren. U kunt de code aanpassen voor uw eigen doeleinden en ik moedig u aan om te experimenteren. Er zijn twee threads:
Er is een eenvoudig voorbeeld op de Tweepy github-pagina - deze maakt verbinding met de stream en drukt elke tweet af die het woord bevat basketbal. Je kunt in dat voorbeeld duidelijker zien hoe a StreamListener
klasse is gedefinieerd en vervolgens doorgegeven aan de Stroom
bouwer.
Ik heb hetzelfde gedaan in mijn script hier: stream = Stream (auth, display_loop_instance)
met display_loop_instance
.
De instantie van StreamListener
kan een paar gebeurtenismethodes definiëren voor Tweepy om te bellen. Net zoals het voorbeeld dat ik alleen gebruik on_data
en on_error
. Zodra de verbinding met Twitter tot stand is gebracht on_data
wordt aangeroepen wanneer een nieuwe tweet binnenkomt. De tweet-gegevens die zijn ontvangen, zijn een UTF-8-gecodeerd JSON-document zoals dit:
"created_at": "Sun May 18 11:07:53 +0000 2014", "id": 467984918237437952, "id_str": "467984918237437952", "text": "Hier is een testbericht naar Jeremy (@jerbly) van controlmypi ", "bron": "web", "afgeknotte": 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 "gebruiker": "id": 2413327915, "id_str": "2413327915", "naam": "ControlMyPi", "screen_name": "ControlMyPi", "plaats": "", "url": null, "description": null, "protected": 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 ": false," geverifieerd ": 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 \ / sticky \ / default_profile_images \ /default_profile_5_normal.png ", "profile_image_url_https": "https: \ / \ / abs.twimg.com \ / sticky \ / 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, "volgende": null, "follow_request_sent": null, "meldingen": null, "geo" null "coördinaten" null "plaats" null "ontvangers" null "retweet_count": 0, "FAVORITE_COUNT": 0, "eenheden": "hashtags" [] "symbolen ": []," urls ": []," user_mentions ": [" screen_name ":" jerbly "," name ":" Jeremy Blythe "," id ": 106417803," id_str ":" 106417803 "," indices ": [33,40]]," favorited ": false," retweeted ": false," filter_level ":" medium", "lang": "en"
Ik ben alleen geïnteresseerd in de tekst
attribuut van dit document zodat ik de jsonbibliotheek van Python gebruik om de json te ontleden in Python-objecten. Ik kan dan de tekst pakken en coderen als ascii, zodat deze compatibel is met het LCD-scherm.
In een lijstbegrip heb ik de tweet in een ruimtegevulde 16 tekens breedtelijst gewikkeld, klaar om op het scherm weer te geven: [x.ljust (16) voor x in textwrap.wrap (str (self.tweet), 16)]
Vervolgens heb ik gebeldset_backlight
-dit zoekt naar een secundair woord in de tekst van de tweet en stelt de RGB-achtergrondkleur in. Als het geen woord op de kaart vindt, wordt het scherm standaard wit.
Eindelijk heb ik gebeld scroll_message
om een onmiddellijke update op het display af te dwingen.
Er gebeuren twee onafhankelijke dingen in het programma: tweets ontvangen van de stream en er doorheen bladeren op het scherm. De display-thread zorgt voor het scrollen en controleert ook het toetsenbord voor een secundaire functie.
De twee threads moeten dezelfde gegevens gebruiken, de tweets, dus om het eenvoudig te houden, roept de display-thread ook methoden op de display_loop_instance
.
Python heeft een handige manier om een thread te starten die een methode op een object aanroept. Je moet gewoon je klas opvoeden door een a te definiëren __call__
methode.
In de code heeft deze methode een oneindige while-lus met een slaap van 1 seconde. Deze slaap is van vitaal belang, zonder dat zal de tekst te snel doorlopen. Ook de thread moet meegeven, dus het gebruikt niet onnodig veel CPU-tijd.
Een extra handig ding hier, en mogelijk een punt waar dit programma zou kunnen worden uitgebreid, is de toetsenbordmonitoring. Ik vind het leuk om dit programma vanaf het opstarten uit te voeren, dus je kunt het naar je werk of ergens brengen en het in een LAN aansluiten op DHCP en het werkt gewoon.
Soms moet je echter wel achterhalen welk IP-adres je hebt gekregen, zodat je erin kunt inspringen. In de oneindige lus van de display thread heb ik een eenvoudige verklaring toegevoegd om te controleren of op de linker toetsenbordknop is gedrukt. Als dat zo is, toon ik de bekabelde en draadloze IP-adressen op het scherm. U kunt dit testen door op de linker toets te drukken.
Om het programma tijdens het booten automatisch uit te voeren, bewerkt u de /etc/rc.local
bestand en voeg een regel toe om je programma te draaien:
python /home/pi/path/to/program/program.py &
.
Start opnieuw op en het zou automatisch moeten starten.
In deze tutorial heb ik je laten zien hoe je een apparaat construeert, met behulp van een Raspberry Pi en een Adafruit RGB LCD, om tweets weer te geven en om ze in bepaalde kleuren weer te geven, afhankelijk van de trefwoorden die zijn gedefinieerd in de tweet zelf.
Laat het me weten als je bijzonder interessante ideeën hebt voor het gebruik van dit project of voor manieren waarop je het hebt aangepast voor je eigen doeleinden.