Help us understand the problem. What is going on with this article?

クリスマスにデートを楽しんでいる人々から幸せをもらうIoT

More than 1 year has passed since last update.

IoTLT Advent Calendar 2018(neo)の12月7日を担当します、 @mii-chang です!:sunny:
新卒1年目で、普段はモバイルアプリエンジニアとして、日々アプリを作っています。

普段はソフトウェアばかりやっているので、ハードウェアが気になるお年頃…
趣味程度ですが電子工作を勉強中なので、今回はクリスマス的なIoTをすることにしました:santa_tone1:

クリスマス

…それは恋人たちがキラキラとした街で幸せなひとときを過ごすロマンチックな日………

マライア・キャリーも、All I Want for Christmas is Youと言っていますね。

クリスマスには多くの恋人たちがデートをしていて、幸せいっぱいな気持ちになっているはず…
そんな特別な日の特別な気持ちを、たとえお家にいたとしても共有しちゃおう!と思って作ったのが、今回の IoTクリスマスツリー です

img

用意したもの

  • ダイソーで200円位で売っていた、キラキラのきれいなLEDガラスツリー
    IMAG0260.jpg

  • Raspberry pi 3 Model B

  • ブレッドボードとか各種ワイヤー・抵抗(LED光らせられる材料)

仕組み

どうやって幸せをもらうのか

クリスマスにデートを楽しんだ人たちが、Twitterに、「今日のデート楽しかったな:relaxed:」とつぶやくと、ツリーが光ります。
ツリーが光ったら、誰かがデートを楽しめたということなので、「おお、誰かが楽しくデートできたんだなあ。良かったなあ。」とTwitterとツリーを介して、誰かの幸せをおすそ分けしてもらいましよう。

技術的な仕組み

  1. PythonでTwitterのSearchAPIを使って、 デート 楽しかった のキーワード検索に引っかかるツイートを探す
  2. キーワードに一致する新着ツイートがあったら、RaspberryPiのGPIOを操作してクリスマスツリーのLEDを光らせる
  3. ほっこり。

接続

普通にLEDを光らせるときの感じでつなぎます。
ツリーの底の蓋を剥がして、直接つなぎました
IMAG0261.jpg

実装

今回はTwitterAPIの中の、SearchAPIを使いました

Twitterデベロッパー登録

TwitterAPIを使うにはデベロッパー登録が必要で、最近各項目が増えてちょっぴりめんどくさくなってしまったのですが、こちらの記事がとっても丁寧にまとめられていました。デベロッパー登録については、この記事を参考にしていただき、今回ここで説明するのは割愛します。

コード

detetree.py
# coding:utf-8
import json,Config, time, threading, RPi.GPIO
from requests_oauthlib import OAuth1Session

#TwitterAPIから取得したkeyの情報
key = consumer_key
secret = consumer_secret
token = access_token
tokenSeclet = access_token_secret

twitterOauth = OAuth1Session(key, secret, token, tokenSeclet)
url = 'https://api.twitter.com/1.1/search/tweets.json'
params = {'q' : 'デート 楽しかった', 'count' : 1} #検索ワード(検索パラメーター)の設定

tweetId = 0
gpioPin = 17 #ブレッドボードにつないでるラズパイのGPIOピン番号

def initGpio():
    print("Initialize port")
    RPi.GPIO.setmode(RPi.GPIO.BCM)
    RPi.GPIO.setup(gpioPin, RPi.GPIO.OUT)
    RPi.GPIO.output(gpioPin, 0)

def getTweet():
    result = twitterOauth.get(url, params = params)
    global tweetId
    try:
        timelines = json.loads(result.text)
        timelines = timelines['statuses'][0]
        print(str(tweetId))

        # ツイートのIDを取得して、前に取得したIDと異なるIDだったら新着ツイートとみなす
        if timelines['id'] != tweetId:
            tweetId = timelines['id']

            #新着ツイートの更新があったら4秒光らす
            RPi.GPIO.output(gpioPin, RPi.GPIO.HIGH)
            time.sleep(4)
            RPi.GPIO.output(gpioPin, RPi.GPIO.LOW)

        else:
            print('更新がないよ')

    except:
        print('error')
        import traceback
        traceback.print_exc()

initGpio()

while True:
    print('true')
    getTweet()
    time.sleep(5) #5秒に1回ツイートを取得

RPi.GPIO.cleanup()

TwitterのフリーのSearchAPIが、https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets.html によると、

Response formats JSON
Requires authentication? Yes
Rate limited? Yes
Requests / 15-min window (user auth) 180
Requests / 15-min window (app auth) 450

ということで、15分で180回までしかリクエストを送れない = 5秒に1回しかリクエストを送れないということだったので、5秒に1回”デート 楽しかった”のツイート検索を行っています。
このキーワードに一致するツイートがあった場合、4秒ツリーを光らせています。

実演

4倍速です

"デート 楽しかった"ってツイートしてる人がそんなにいなかったので、あまり光りません:joy:
デートの投稿はTwitterよりもinstagramのほうが多い気もしますね…!:thinking:

さいごに

お部屋においておくだけで世のクリスマスの幸せ気分を感じれるツリー。ロマンチックじゃありませんか?

mii-chang
モバイルアプリエンジニア
iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away