もやし日誌

日記のようなもの

HDC1000とRaspberry Piを使ってTwitterに室温と湿度を投げてみた

f:id:kazuki09:20160619014351j:plain
ちょっとまえに秋月で買った温湿度センサーHDC1000から取ってきた温湿度を自動でTwitterに投げるようにしてみました。
買ったは良いものの、ラズパイがLCD液晶に現在の時刻と温度と湿度を出すだけの機械と化していたので「インターネットにつながっている」という利点を活かしてみました。
とりあえずは簡易的なIoTになってるかなぁって感じですw(ちょっと違うかな?)

設置編

qiita.com
そこそこ資料も出回ってるセンサーなので解説は....要らなそうですね。

Pythonからセンサーを弄ってみる

# -*- coding: utf-8 -*-
import wiringpi
import os
import struct
from time import sleep
wiringpi.wiringPiSetup() #setup wiringpi
i2c = wiringpi.I2C() #get I2C
dev = i2c.setup(0x40) #setup I2C device
i2c.write(dev,0x02) #HDC1000 CONFIGURATION POINTER
i2c.write(dev,0x10) #send 1byte
i2c.write(dev,0x00) #send 1byte
sleep((6350.0 + 6500.0 +  500.0)/1000000.0)
dataAry = struct.unpack("BBBB",os.read(dev,4))
os.close(dev)
temp = (dataAry[0] << 8) | (dataAry[1])
hudi = (dataAry[2] << 8) | (dataAry[3])
temp = ((temp / 65535.0) * 165 - 40)
hudi = ((hudi / 65535.0 ) * 100)
print "Humidity %.2f" % hudi
print "Temperature %.2f" % temp

Humidity 62.47
Temperature 31.08

出力結果はこんな風になるはずです。設置編にあるCのソースを参考にPythonで書いてみました。
ちょっと違う所と言えばGPIOでRDYピンからの完了フラグを確認せずに、仕様書に書いてある時間分だけsleepするようにしてみたところぐらいですかね。
0x00~0x01に温湿度のデータが入るとのことで、アドレスに対してreadすればいけるかなーって思ったらI/Oエラーしか返ってこなくて3時間ぐらい潰しました。
wiringpiのpythonバインディングライブラリを使ってるのでビルドとインストールお願いします。
github.com

Twitterにも投稿してみる

# -*- coding: utf-8 -*-
import wiringpi
import os
import struct
from time import sleep
import tweepy
#setup tweepy
consumer_key = "hogehogehogehoge"
consumer_secret = "hogehogehogehoge"
access_token = "hogehogehogehoge"
access_secret = "hogehogehogehoge"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
#setup HDC1000
wiringpi.wiringPiSetup() #setup wiringpi
i2c = wiringpi.I2C() #get I2C
dev = i2c.setup(0x40) #setup I2C device
i2c.write(dev,0x02) #HDC1000 CONFIGURATION POINTER
i2c.write(dev,0x10) #send 1byte
i2c.write(dev,0x00) #send 1byte
sleep((6350.0 + 6500.0 +  500.0)/1000000.0)
dataAry = struct.unpack("BBBB",os.read(dev,4))
os.close(dev)
temp = (dataAry[0] << 8) | (dataAry[1])
hudi = (dataAry[2] << 8) | (dataAry[3])
temp = ((temp / 65535.0) * 165 - 40)
hudi = ((hudi / 65535.0 ) * 100)
print "Humidity %.2f" % hudi
print "Temperature %.2f" % temp
api.update_status(status="現在の室温は" + ("%.2f度" % temp) + "、湿度は" + ("%.2f" % hudi) + "%です\n#もやしの部屋")

TwitterAPIクライアントにはtweepyを使いました。これはpipからインストールできるので

sudo pip install tweepy

でインストールできます。APIキーをセットすれば


こんな風にツイートされるはずです。

cronを使って自動ツイートしてみる

手動でツイートするだけでは面白くないのでcronを使って自動的にツイートできるようにしてみました。
cronからスクリプトを呼ぶだけなので難しいことはしてないです。

sudo service cron start
sudo chkconfig cron on

cronサービスを起動し、ラズパイの起動時に自動的に起動するようにします。(すでにしてあるなら飛ばしてもおk)
I2Cの操作にはroot権限を要するので、今回はrootのcrontabにスクリプトを登録します。

sudo crontab -e
00 * * * * python /home/pi/temp_twitter.py

一応これで1時間に1回自動的にツイートされるようになります。

KotlinでAndroidアプリをつくってみた話

お久しぶりです、もやしです。
最近流行り(?)の言語、KotlinをIkaStageWidgetに採用してみたのでメモ程度に残したいと思います。

Kotlinって何ぞ?

簡単に言うとJVM(あるいはDalvikVM,ART)上で動く言語です。Scalaとか知っているのであればそれを想像してもらえるとわかりやすいと思います。
ちなみにJVM上で動くものなので既存のJavaライブラリも全て使えます。
開発環境ですが公式ではIntelliJ IDEAがサポートされていて、何も導入しなくても使えます。IntelliJ IDEAの開発元がKotlin開発してるので当たり前っちゃ当たり前ですねw

控えめに言って最高なことりん

hogebutton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //do something here
    }
});

AndroidアプリをJavaで開発したことがあるなら誰もが一度は見るコレ、まあ長ったらしいですよね。
いや、一応Javaできれいに書く方法は色々ありますがどれもちょっとメンドイです。
Kotlinだとこうなります

hogebutton.setOnClickListener {
    //do something here
}

最高かよ。Kotlinマジ天使。ちゅんちゅんちゅんちゅん(ry

Javaソースと混ぜてもおk

既存のプロジェクトに一部分だけ導入する、みたいなことも可能です。
Java側からKotlinのコードを呼び出す(逆も可)ことも普通にJavaソースを扱うかのように出来ます。

たとえばNULL安全とか?

例えば

var hoge : String = "hogehoge"
hoge = null

みたいなことをしようとするとコンパイルエラーになります。Kotlinで変数にnullを代入できるようにするには

var hoge : String? = null

のような感じに書く必要があります。またNull許容型に対しメンバ関数などを参照する際には

hogehoge?.dosomething()

みたいな書き方をしなければなりません。これがsafe callです。safe callでは変数がnullであれば上記ソースのdosomething()にあたる部分は実行されず、無視されます。
ちなみにぬるぽ大好きおじさんはこんな書き方も出来ます

hogehoge!!.dosomething()

この場合はhogehogeがnullならぬるぽが起こります。ただメンバ変数を参照したいときはこの方がすっきりするかもしれないです。
他にもいろいろJavaより便利だったりする機能があるので、ちらっと公式サイトの方見てみてください。

Kotlinはランタイムがコンパクトでいいぞ

全部合わせて1MBに収まるぐらいのサイズです。最近はAndroid端末の性能も上がってきてるのでアプリのサイズを気にする人は減ってきてる気がするので、まあどうでもいいと言えばどうでもいい話ですがコンパクトなのは良いことです。

ことりんはいいぞ

まあ、まだ色々紹介したいものがあるのですが紹介しきれないので紹介はこのぐらいにしたいとおもいます。
ではまた~
play.google.com