Edited at

Amazon Dash Buttonで室温ツイートボタンを作る

More than 1 year has passed since last update.

まだまだボタンが余っている(10個ほど)ので、先日購入した温度センサーを使って"室温を取得してツイートするボタン"を作ってみたいと思います。

それと余っているADBの活用法募集してます。


使うもの


  • RaspberryPi Model 3

  • 温度センサー(DS18B20+)

  • ブレッドボード

  • 抵抗(今回は1kΩを使いました)

  • ジャンパーワイヤー

  • AmazonDashButton(今回はペットボトルのアイスコーヒーで1番美味しい『NESCAFE』のボタンを使いました)

RaspberryPiの初期設定などは終わっている前提で進めます。

AmazonDashButtonはdasherが使えるようにしておいてください。(詳しくは前回記事参照。)


DS18B20+の配線と初期設定

図のように配線しました。初Fritzingです。

このセンサーは1-Wireという規格で通信するそうで、まずはそれの有効化。

modulesに2行追記するだけです。

$ sudo vim /etc/modules


/etc/modules

w1-gpio

w1-therm

起動時の設定(?)も追記します。

$ sudo vim /boot/config.txt


/boot/config.txt

dtoverlay=w1-gpio-pullup,gpiopin=4


再起動します。

$ reboot

うまくいけば、/sys/bus/w1/devicesにファイルが作られます。

ここでいう28-0000086e469eの部分は人によって違います。

$ cd /sys/bus/w1/devices

$ ls
28-0000086e469e w1_bus_master1

w1-slaveを開くと温度を確認できます。

$ cd 28-0000086e469e

$ cat w1_slave
ac 01 4b 46 7f ff 04 10 86 : crc=86 YES
ac 01 4b 46 7f ff 04 10 86 t=26750

t=26750の部分が温度です。1000倍されているので、26.7度ということになります。

これで動作確認できました。


プログラム

温度を取得してTwitterAPIに投げるだけなのでなんでもいいですが、楽に書けるPythonで書きました。


TwitterAPIの取得

まず、ツイートするためにTwitterAPIを取得します。

このサイトが分かりやすいので参考にしてみてください。

Twitterアカウントに電話番号を登録しないと、キーが取得できないようです。

※正しく入力してるのにSMS認証が通らない時は、F5更新で頑張ればできます。

先ほどのサイトの解説を参考にして、Consumer Key,Consumer Secret,Access Token,Access Token Secretの4つを取得してください。


w1thermsensorのインストール

センサーの初期設定の時に行った動作確認で、数値が表示されるので自分でその部分だけ抽出してもいいのですが、少しめんどくさそうですよね?

調べてみるとw1thermsensorという便利なパッケージがあるようなのでそれを使います。

インストール方法は色々ありますが、gitでcloneしてinstallするやり方を採用しました。

$ git clone https://github.com/timofurrer/w1thermsensor.git

$ cd w1thermsensor
$ sudo python setup.py install

試してみます。


get_temp.py

#coding:utf-8

from w1thermsensor import W1ThermSensor

#センサーの取得
sensor = W1ThermSensor()
#温度の取得(摂氏)
celsius = sensor.get_temperature()

#小数点2桁目までで室温表示
print("室温: {0:.2f}".format(celsius))


$ python get_temp.py

室温: 27.64

わずか数行で室温を表示することができました。便利ですね。


Twitterに投稿するためのプログラム

次は取得したデータを実際にTwitterに投稿してみたいと思います。

TwitterAPIと先ほどのプログラムを組み合わせて、以下のプログラムを作成しました。

APIの使い方についてはこちらを参考にしました。

まずはTwitterのAPIキーを参照するためのsettings.pyを作成します。

取得したキーをそれぞれ入れるだけです。


settings.py

CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxx"

CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ACCESS_TOKEN = "xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ACCESS_TOKEN_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

あとは色々組み合わせて適当にかきます。


temp_tweet.py

#coding:utf-8

from requests_oauthlib import OAuth1Session
import json
import settings
import datetime
from w1thermsensor import W1ThermSensor

#センサーの取得
sensor = W1ThermSensor()

#温度の取得(摂氏)
celsius = sensor.get_temperature()

#日時の取得
todaydetail = datetime.datetime.today()
date = todaydetail.strftime("%Y/%m/%d %H:%M:%S")

#settings.pyからTokenを取得
twitter = OAuth1Session(settings.CONSUMER_KEY, settings.CONSUMER_SECRET, settings.ACCESS_TOKEN, settings.ACCESS_TOKEN_SECRET)

#小数第2位までで表示するように形成
temp = "{0:.2f}".format(celsius)

#ツイート
params = {"status": "現在(%s)の室温は%sです。"%(date,temp)}
req = twitter.post("https://api.twitter.com/1.1/statuses/update.json",params = params)



Dasherの設定(ここでハマった)

あとはDasherに作成したプログラムを設定してボタンが押されたら実行されるようにします。

今回ここの設定でハマって何時間もかかりました。

まず、dasherではREADME.mdにあるようにconfig.jsonの設定でcmdというオプションが使用できます。これは任意のコマンドを実行するためのオプションです。

こちらの環境の問題かもしれませんが、python /home/pi/temp_tweet.pyのように指定してもエラーが出て動作しませんでした。

シェルスクリプト経由だと実行できそうなので、スクリプトを作成しました。


temp_tweet.sh

#!/bin/sh

python /home/pi/temp_tweet.py

そしてこのスクリプトを実行するようにdasherで指定します。


config.json

{"buttons":[

{
"name": "temp_tweet",
"address": "ee:ee:ee:ee:ee:ee",
"interface": "wlan0",
"protocol": "udp",
"cmd": "/home/pi/temp_tweet.sh"
}
]}

次にハマったのが、そもそもADBが反応しなくなったというものです。

MACアドレスを検索するためのfind_buttonでは認識されるのですが、肝心の処理が実行できませんでした。

色々試した結果、config.jsonにオプションでinterfaceprotocolを設定すれば動作するようになりました。

前回はこの設定なしでも動作したので、原因はよくわかりません。(誰か教えて)

まあ記述しておいた方が確実かもしれないですね。


ボタンを押す

ツイートされました。


それっぽい名前にしてますが、これから運用するかは知りません。


まとめ

温度取得してTwitterAPIに投げるプログラムを書いて、それをDasherで実行させてるだけなので簡単にできました。

"ボタン"を作ったのにこんなことを言ったらおしまいですが、ボタンを押さなくてもcrontabで定期実行すれば「部屋の温度bot」ができそうですね。外に設置して「気温bot」なら少しだけ需要がありそう。

ん?もしかしてボタンじゃなくてもよかった???


参考サイト

PythonのTwitterライブラリ「Tweepy」を使ってつぶやいてみる

Raspberry Piで1-Wireデジタル温度センサのDS18B20をPythonから使う

IT女子のラズベリーパイ入門奮闘記 第18回「ラズベリーパイで手作り温度計!」