お家のトイレからプライバシーが吹き飛ぶ日がやってきました。
事の発端は以下のツイート
トイレ流すリモコンの信号を受信すればすぐ実現出来そう。大小の区別も…。 QT @mattn_jp: 便器からツィートが流れだすまであと少し / “人間とウェブの未来 - mruby-oauthでmrubyからtwitterを操作” htn.to/sXuVQq
— きくちゃんさん (@kikuchan98) 1月 1, 2013
トイレのリモコン、押された時刻や種別が蓄積されてたらヤだな…
— きくちゃんさん (@kikuchan98) 1月 1, 2013
このツイートに触発されて、Arduino + Ethernet Shield + 赤外線リモコン受信モジュールで作ってしまったのが上記写真。実際のツイートはこんな感じ。(一部)
おしり洗浄中( ´_ゝ`)
— けーいち (@9SQ) 2013年1月20日
という具合。トイレを流しました(小)
— けーいち (@9SQ) 2013年1月20日
我が家のTOTOのウォシュレット、そのリモコンから送信されるコードを赤外線受信モジュールでキャッチし、押されたボタンを判別してツイートします。
使用したのはArduino UNO、Ethernet Shield、赤外線リモコン受信モジュール (PL-IRM2121)の3つ。
配線を簡略化する為に、5番ピンを赤外線モジュールとの通信、6番ピンをGND、7番ピンをVccにしています。
まずは、リモコンが送信しているコードの取得。
6.1ミリ秒のON、2.9ミリ秒のOFFに続いて、0.6ミリ秒、0.5ミリ秒間隔でON、OFFを繰り返し、1.5ミリ秒のOFFが間に何回か入ります。
Excelに起こすとこんな感じ。
左上:流す(小)、左下:流す(大)、右上:おしり、右中:やわらか、右下:ビデ
最初の6.1ms、2.9msはリモコン毎に異なる送信開始の合図リーダ部で、その後がデータ部となっている。
ここで、ON時間を無視してOFF時間だけ抽出し、1.5ミリ秒以上のOFF時間を1、0.5ミリ秒のOFF時間を0とすると
010000000001000000000001011000010110000:大
010000000001000000000001000100010001000:小
010000000001000001011001000000010101100:おしり
010000000001000001011001010100010000100:やわらか
010000000001000001011000100000001101100:ビデ
010000000001000101010101101101001110000:ストップ
という風に表すことができる。
あとはこれを条件分岐し、それぞれにあったツイートをpostさせればOK。
プログラムは、こちらやこちらやこちらを参考にしつつ、以下のような感じで。
#include <SPI.h> #include <Ethernet.h> #include <Twitter.h> #define IR_INPUT 5 byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //Ethernet ShieldのMACアドレス byte ip[] = { 192, 168, 1, 123 }; //IPアドレス Twitter twitter("/* 取得したトークン */"); char msg[256]; void setup() { Ethernet.begin(mac, ip); Serial.begin(9600); pinMode(IR_INPUT,INPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); digitalWrite(6,LOW); digitalWrite(7,HIGH); } void loop() { unsigned long time = 0; int i , cnt; char buf[64]; if (digitalRead(IR_INPUT) == LOW) { time = micros(); while (digitalRead(IR_INPUT) == LOW) ; time = micros() - time; } if (time >= 6100) { i = 0 ; while(digitalRead(IR_INPUT) == HIGH) ; while (1) { while(digitalRead(IR_INPUT) == LOW) ; time = micros() ; cnt = 0 ; while(digitalRead(IR_INPUT) == HIGH) { delayMicroseconds(10) ; cnt++ ; if (cnt >= 1200) break ; } time = micros() - time ; if (time >= 10000) break ; if (time >= 1500) buf[i] = (char)0x31 ; else buf[i] = (char)0x30 ; i++ ; } if (i != 0) { buf[i] = 0 ; checkCode(buf) ; } } } void checkCode(String code) { code = code.substring(15,37); Serial.println(code); if (code.equals("0000000010110000101100")){ strcpy(msg,"トイレを流しました(大)"); postTweet(); } else if (code.equals("0000000010001000100010")){ strcpy(msg,"トイレを流しました(小)"); postTweet(); } else if (code.equals("0010110010000000101011")){ strcpy(msg,"おしり洗浄中( ´_ゝ`)"); postTweet(); } else if (code.equals("0010110010101000100001")){ strcpy(msg,"おしりやわらか洗浄中(*´ω`*)"); postTweet(); } else if (code.equals("1010101011011010011100")){ strcpy(msg,"洗浄ストップ(`・ω・´)"); postTweet(); } delay(100); } void postTweet() { Serial.println("connecting ..."); if (twitter.post(msg)) { int status = twitter.wait(); if (status == 200) { Serial.println("OK."); } else { Serial.print("failed : code "); Serial.println(status); } } else { Serial.println("connection failed."); } }使用用途として、お通じの公開
追記:噴射時間もツイートするようにしてみた。
unsigned long washTimeを宣言して、洗浄ストップ(`・ω・´) 噴射時間9秒
— けーいち (@9SQ) 2013年1月20日
else if (code.equals("0010110010000000101011")){ washTime = millis(); strcpy(msg,"おしり洗浄中( ´_ゝ`)"); postTweet(); } else if (code.equals("0010110010101000100001")){ washTime = millis(); strcpy(msg,"おしりやわらか洗浄中(*´ω`*)"); postTweet(); } else if (code.equals("1010101011011010011100")){ washTime = millis() - washTime; sprintf(msg,"洗浄ストップ(`・ω・´) 噴射時間%d秒",(int)(washTime/1000)); postTweet(); }こんな感じで。
追記2:トイレットペーパーの使用量もツイートするようにしてみた。
トイレットペーパー使用量報告bot
http://eleclog.quitsq.com/2013/01/toilet-paper-bot.html
追記3:トイレットペーパー使用量botと合体させて、無線化しました。
ウォシュレット実況botの無線化
http://eleclog.quitsq.com/2013/01/toilet-tweet-bot-wireless.html
追記 2016.01.03 : 実際のツイートを開発用アカウントからメインアカウントのツイートに差し替えしました。
0 件のコメント:
コメントを投稿
記事へのコメントはいつも確認している訳ではないので、お返事が遅れる場合があります。
ご質問やご意見は twitter@9SQ へお送り頂けると早くお返事できると思います。