14
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

IoTLTAdvent Calendar 2018

Day 7

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

Last updated at Posted at 2018-12-07

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:

さいごに

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

14
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?