読者です 読者をやめる 読者になる 読者になる

ティッシュを消費したらTweetする装置を作った

Raspberry Pi

冬はティッシュの消費量が増える季節です

体調の悪化をなにかしら数値化しておきたい。
鼻をかむ回数が増えるだろうからティッシュの消費量を追えばよさそう。

(あと余談ですが、最近DMM.comの月額動画を契約しました。)

すでにそういう製品があるのでは?

検索してみたけどそういう製品は見当たらない…。
ただ1件、ティッシュとセンサを組み合わせている方を見つけました。

www.jonki.net

そうそう、こういうの。
ここからwebへ何かしらPOSTすればよさそう。

ティッシュの消費量監視システムができました

消費したティッシュの枚数をTwitterにつぶやきます。

後ほどティッシュケースに装着するようにしました。

その結果、こんなTweet↓が流れます。

材料

工作の流れ

  • ティッシュを取り出すと上下するアームをレゴブロックで作る
  • GPIOピンに傾斜スイッチを接続し、傾きによって状態が0,1で変化するのを確認する
  • アームの先端に傾斜スイッチを取り付けて、角度を調整する
  • 取り出し時に、IFTTTのMaker Channel宛てにリクエストを送る
  • IFTTT側でそれをtriggerにして、Twitterへつぶやかせる

それぞれ解説していきます。

ティッシュを取り出すと上下するアームをレゴブロックで作る

試行錯誤しながら、とりあえず動くものを作る時にはレゴブロックが便利。
ギアやプーリーをベースとしたキットが販売されているのでそれを使いました。
http://amzn.to/2kiuv62

デイリーポータルZさんの以下の記事を見ると欲しくなるはず。 portal.nifty.com

今回の工作で作ったパーツは

  • アーム
  • アームを固定するための台座
  • アームが上がりきってしまわないようにするためのつっかえ棒

から成り立っています。

GPIOピンに傾斜スイッチを接続し、傾きによって状態が0,1で変化するのを確認する

以下のようなpythonのコードを書いて「値が0から1に変化したことを検知し、検知後1000ミリ秒間に再度検知しても無視する」ということを実現しています。

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

SWITCH_IO = 26
GPIO.setup(SWITCH_IO, GPIO.IN)

def switch_on(channel):
  # ONに切り替わったので何かする

GPIO.add_event_detect(SWITCH_IO, GPIO.FALLING, switch_on, 1000)

アームの先端に傾斜スイッチを取り付けて、角度を調整する

ティッシュを取り出して十分にアームが持ち上がった時に通電するように、さきほどのアームの先端に角度を調整しつつ傾斜スイッチを設置します。

冒頭の動画を見ると、ティッシュを引き抜いてアームが持ち上がった時にチカッとセンサーのLEDが光っているのがわかるかと思います。

取り出し時に、IFTTTのMaker Channel宛てにリクエストを送る

IFTTTは、各種サービスをtriggerとactionとして扱い、それらを自分好みに組み合わせてタスクの自動化を行えるサービスです。
直接Twitterへ投稿するプログラムをpythonで書いてもよかったのですが、手軽さと柔軟性を考慮してIFTTTを利用することにしました。

IFTTTのMaker Channelを利用することで、webhook URLへのPOSTリクエストをtriggerとして扱えるようになります。 そのための具体的な手順は以下のとおりです。

  1. IFTTTのMaker settingsにアクセス
  2. そこに表示されているURLをコピペしてアクセス
  3. curlで叩く例などが出て来るので、{event}の部分にtrigger名(今回はtissue_takenとしました)を入力して、そのURLをコピー f:id:moyashipan:20170206022114p:plain

そうして得られたURLに対してPOSTリクエストを行うコードを書きます。
こんな感じに↓

import json
import urllib2

data = { 'value1': num_of_tissues, 'value2': first_taken_at.strftime('%Y/%m/%d %H:%M:%S') }
req = urllib2.Request(trigger_url)
req.add_header('Content-Type', 'application/json')

urllib2.urlopen(req, json.dumps(data))

IFTTT側でそれをtriggerにして、Twitterへつぶやかせる

IFTTTに新しいAppletを登録します。
デバッグ中にTwitterに投稿してしまうと迷惑になるので当初は自分にDMを送るようにしました。
If Maker Event "tissue_taken", then send a direct message to @Moyashipan のようなAppletができていて、 ティッシュを取ることで自分にDMが届けば成功です。

そうして全体が上手く連携していることが確認できたら、actionをpost a tweet to @MoyashipanにしたAppletを作り、さきほどのAppletはOFFにします。
そしてティッシュを取ることで自分のアカウントでつぶやきが流れたら完成です。

工夫

複数枚取った後でまとめてtriggerさせる

ティッシュを1枚ずつ取るたびにTwitterへ投稿していては、短時間に複数枚取った場合に迷惑です。
そこで、1枚取ると15秒間のカウントが始まり、その間にさらに取ると15秒プラスされるようにしました。
そしてカウントがゼロになったら、カウント開始時からの枚数をまとめてValue1に格納してtriggerさせています。

こうすることで、たくさん消費する場合には通知までの時間が長引いてしまいますが、 そういう場合にはできるだけまとまった(大きな)数値が投稿されたほうがテンションが上がるだろうということでカウントを追加するようにしました。

問題点

デバッグの後で片付けが必要

水銀スイッチを使っている

傾斜スイッチは、水銀の入ったガラス管が傾き、水銀が導線に触れる事でスイッチがONになるというものです。
人体に有害なため生産されなくなったという物らしいので、他のスイッチを使ったほうが安全そうです。

まとめ

  • ラズパイとスイッチを繋げば、手軽に日常の動作の数値化ができる
  • IFTTTのMaker Channelを使えば、検知した後の動作は全部IFTTTに任せられるのでお手軽