Pages

2013年1月5日

ウォシュレット実況bot


お家のトイレからプライバシーが吹き飛ぶ日がやってきました。
事の発端は以下のツイート
このツイートに触発されて、Arduino + Ethernet Shield + 赤外線リモコン受信モジュールで作ってしまったのが上記写真。

実際のツイートはこんな感じ。(一部)
という具合。

我が家の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を宣言して、
   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 へお送り頂けると早くお返事できると思います。