Comment construire un écran LCD RVB contrôlé par Tweet

Ce que vous allez créer

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..

Matériel requis

  • Raspberry Pi modèle B (40 $)
  • Connexion Internet filaire ou sans fil
  • Adafruit RGB Negative 16x2 LCD + Kit de clavier pour Raspberry Pi (25 $)

Installer

  1. Suivez les étapes du site Adafruit pour configurer et tester votre écran LCD RGB..
  2. Installez Tweepy comme suit:

sudo pip installer tweepy

Créer une application Twitter

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 Twitter

Lorsque 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ès

Actualisez 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.

Le code

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') 

Le code expliqué

Affichage de Tweet

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:

  1. le fil principal du programme qui se connecte à Twitter et reçoit les tweets, et
  2. le fil d'affichage qui gère l'écran LCD-il affiche et fait défiler le texte.

Fil principal

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.

Afficher le fil

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.

Conclusion

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.