Dans ce tutoriel, je vais vous montrer comment utiliser un Raspberry Pi avec un écran LCD RVB pour contrôler les tweets. Les tweets contenant des mots clés spécifiques sont affichés dans des couleurs définies. Vous apprendrez à créer une application Twitter pour utiliser l'API de flux afin de transférer des données vers votre programme, ce qui vous permettra de mieux comprendre les programmes Python multi-threadés..
sudo pip installer tweepy
Créez une application Twitter sur le site Web de Twitter pour permettre au programme Raspberry Pi de se connecter au flux. Pour ce faire, accédez à https://apps.twitter.com et connectez-vous..
Créez une application en remplissant le formulaire, comme indiqué ci-dessous. Remarque: vous pouvez mettre un espace réservé pour le site Web. Il s'agit d'un champ obligatoire mais non requis pour ce projet Raspberry Pi..
Création d'une application Twitter sur le site TwitterLorsque vous soumettez le formulaire, une application sera créée. Sur le Clés API l'onglet, vous verrez un clé API et Secret de l'API-ceux-ci sont uniques à vous et seront nécessaires plus tard.
Puisque la clé API et le secret sont uniques, j'ai rédigé la mienne sur cette capture d'écran.Faites défiler et cliquez Créer mon jeton d'accès:
Création du jeton d'accèsActualisez la page si vous en avez besoin. Vous aurez maintenant le Jeton d'accès et Clé d'accès secret. Encore une fois, ceux-ci sont uniques à vous et seront requis plus tard.
Jetons complétés. Ils peuvent également être régénérés pour en créer de nouveaux ou révoqués.C'est l'application créée.
Dans le code de ce projet, ci-dessous, vous aurez besoin de modifier pour modifier pour entrer votre clé API, Secret API, Clé de jeton d'accès et Secret de jeton d'accès. Vous devrez peut-être également changer le chemin d'accès au Adafruit_CharLCDPlate
il correspond donc où vous l'avez installé sur votre Pi.
Lorsque vous exécutez le programme, le Pi se connecte au flux Twitter. Dans cet exemple, tout tweet contenant le mot Jeremy sera poussé vers le Pi et affiché sur l’écran LCD RGB. Ceci est un tweet public de n'importe qui dans le monde - rien à voir avec qui vous suivez - c'est n'importe qui!
N'oubliez pas d'utiliser sudo
lors de l'exécution de la racine de script Python, des privilèges sont requis pour l'accès i2c à l'écran LCD. Par exemple:
sudo python /path/to/script/script.py
Remarque: le programme ne se fermera pas proprement en appuyant sur Control-C. Au lieu de cela, ouvrez un autre shell et utilisez ps hache
et tuer
terminer le programme.
Le programme recherche d'autres mots dans le tweet pour définir la couleur du rétro-éclairage RVB. S'il trouve le travail Clarkson il va mettre la couleur au rouge, perle est vert, amour est bleu.
Enfin, s'il reste du temps entre les Tweets, le programme fera défiler le texte recouvert de mots afin que vous puissiez tout voir..
import sys spath.append ('/ home / pi / py /' + 'Adafruit-Raspberry-Pi-Code Python / Adafruit_CharLCDPlate') depuis Adafruit_CharLCDPate importez Adafruit_CharLCDPlate depuis tweepy.streaming import json importation threads heure d'importation import textwrap sous-processus d'importation api_key = "###" api_secret = "###" access_token_key = "###" access_token_secret = "###" class DisplayLoop (StreamListener): "" "Cette classe est un écouteur pour les données de flux tweet. Il est également appelable pour qu'il puisse exécuter la boucle de thread d'affichage principale pour mettre à jour l'affichage. "" "def __init __ (self): self.lcd = Adafruit_CharLCDPlate () self.lcd.backlight (self.lcd. ROUGE) self.lcd.clear () self.backlight_map = 'clarkson': self.lcd.RED, 'pearl': self.lcd.GREEN, 'love': self.lcd.BLUE, 'haine': self. lcd.YELLOW, 'kyle': self.lcd.TEAL, 'like': self.lcd.VIOLET self.msglist = [] self.pos = 0 self.tweet = 'Rien encore' def set_backlight (auto): mots = self.tweet.lower (). split (") use_default = True pour w en mots: si w dans self.backlight_map: self.lcd.backlight (self.backlight_map [w]) use_default = False break si use_default: self.lcd.backlight (self.lcd.WHITE) def on_data (self, data) : tweet_data = json.loads (données) self.tweet = tweet_data ['text']. encode ('ascii', errors = "backslashreplace") self.msglist = [x.ljust (16) pour x dans textwrap.wrap ( str (self.tweet), 16)] self.pos = 0 self.set_backlight () self.scroll_message () renvoie True def on_error (self, status): print status def write_message (self, msg): self.lcd.home () self.lcd.message (msg) def scroll_message (self): "" "Affiche la page de texte et met à jour la position de défilement pour le prochain appel" "" si len (self.msglist) == 0: self.write_message (".ljust (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]) sinon: si self.pos> = len (self. msglist) -1: self.pos = 0 sinon: self.write_message (self.msglist [self.pos] + '\ n' + self.msglist [self.pos + 1]) self.pos + = 1 def get_ip_address (self, interface): "Renvoie l’adresse IP de l’interface donnée, par ex. eth0 "essayer: s = sous-processus.check_output ([" ip "," addr "," show ", interface]) renvoie s.split ('\ n') [2] .strip (). split (") ] .split ('/') [0] sauf: return '?.?.?.??' def __call __ (self): while true: si 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 () # Démarre le thread qui exécute le threadable appelable.Thread (target = display_loop_instance) .start () # Connectez-vous pour twitter et démarrer le flux de suivi 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 y a quelques éléments clés dans le code. Vous pouvez adapter le code à vos propres fins et je vous encourage à expérimenter. Il y a deux discussions:
Il y a un exemple simple sur la page Tweepy github qui se connecte au flux et imprime tout tweet contenant le mot basketball. Vous pouvez voir dans cet exemple, plus clairement, comment un StreamListener
la classe est définie puis transmise à la Courant
constructeur.
J'ai fait la même chose dans mon script ici: stream = Stream (auth, display_loop_instance)
avec display_loop_instance
.
L'instance de StreamListener
pouvez définir quelques méthodes d’événement à appeler par Tweepy. Comme dans l'exemple, je n'utilise que on_data
et on_error
. Une fois la connexion à Twitter établie on_data
est appelé à chaque fois qu'un nouveau tweet arrive. Les données de tweet reçues sont un document JSON codé en UTF-8, comme suit:
"created_at": "dim. mai 18 11:07:53 +0000 2014", "id": 467984918237437952, "id_str": "467984918237437952", "text": "Voici un message de test adressé à Jeremy (@jerbly) de controlmypi "," source ":" web "," tronqué ": 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_str ": null," in_reply_same_demail " "id": 2413327915, "id_str": "2413327915", "name": "ControlMyPi", "screen_name": "ControlMyPi", "location": "", "url": null, "description": null, "protected": false, "followers_count": 0, "friends_count": 0, "Listed_count": 0, "created_at": "mer 26 mars 23:39:27 +0000 2014", "favourites_count": 0, "utc_offset ": null," time_zone ": null," geo_enabled ": false," vérifié ": 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 \ / collant \ / 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_ " : "DDEEF6", "profile_text_color": "333333", "profile_use_background_image": true, "default_profile": true, "default_profile_image": true, "suivant": null, "follow_request_sent": null, "notifications": null ", null, "geo": null, "coordonnée": null, "place": "contributeurs": null, "retweet_count": 0, "favorite_count": 0, "entités": "hashtags": [], "symboles ": []," urls ": []," user_mentions ": [" screen_name ":" sagement "," name ":" Jeremy Blythe "," id ": 106417803," id_str ":" 106417803 "," indices ": [33,40]]," favorited ": false," retweeted ": false," filter_level ":" moyen "," lang ":" en "
Je suis seulement intéressé par texte
attribut de ce document donc je vais utiliser la bibliothèque json de Python pour analyser le json dans les objets Python. Je peux alors saisir le texte et le coder en ascii pour qu'il soit compatible avec l'écran LCD.
Dans une compréhension de liste, le mot a été encapsulé dans une liste de 16 caractères de largeur et d'espacement, prête à être affichée à l'écran: [x.ljust (16) pour x dans textwrap.wrap (str (self.tweet), 16)]
Ensuite, j'ai appeléset_backlight
-ceci recherche un mot secondaire dans le texte du tweet et définit la couleur de rétroéclairage RVB. S'il ne trouve pas un mot sur la carte, l'affichage est blanc par défaut..
Enfin j'ai appelé scroll_message
forcer une mise à jour immédiate sur l'écran.
Deux choses indépendantes se produisent dans le programme: recevoir des tweets du flux et les faire défiler à l'écran. Le fil d'affichage prend en charge le défilement et surveille également le clavier pour une fonction secondaire.
Les deux threads doivent travailler sur les mêmes données, les tweets, afin que les choses restent simples, le thread d'affichage appelle également des méthodes de la même manière. display_loop_instance
.
Python a un moyen simple de démarrer un thread qui appelle une méthode sur un objet. Il vous suffit de rendre votre classe appelable en définissant un __appel__
méthode.
Dans le code, cette méthode a une boucle while sans fin avec une veille d'une seconde. Ce sommeil est vital, sans quoi le texte défilera trop rapidement. De plus, le thread doit céder afin de ne pas utiliser inutilement beaucoup de temps CPU.
La surveillance du clavier est une chose particulièrement utile ici, et peut-être même un point où ce programme pourrait être étendu. J'aime exécuter ce programme à partir du démarrage afin que vous puissiez le prendre pour fonctionner ou quelque part et le brancher sur un réseau local sur DHCP et cela fonctionne.
Cependant, vous devez parfois connaître l'adresse IP qui vous a été attribuée pour pouvoir y entrer en ssh. Dans la boucle infinie du fil d'affichage, j'ai ajouté une instruction simple pour vérifier si le bouton du clavier gauche est enfoncé. Si c'est le cas, j'affiche les adresses IP câblées et sans fil à l'écran. Vous pouvez tester cela en appuyant sur la touche gauche.
Pour exécuter le programme automatiquement au démarrage, éditez simplement le /etc/rc.local
déposer et ajouter une ligne pour exécuter votre programme:
python /home/pi/path/to/program/program.py &
.
Redémarrez et il devrait démarrer automatiquement.
Dans ce tutoriel, je vous ai montré comment construire un appareil, à l'aide d'un Raspberry Pi et d'un écran LCD Adafruit RGB, pour afficher les tweets et les afficher dans certaines couleurs en fonction des mots clés définis dans le tweet.
Faites-moi savoir si vous avez des idées particulièrement intéressantes sur l'utilisation de ce projet ou sur les moyens par lesquels vous l'avez adapté à vos besoins.