トイレットペーパー使用量報告bot
2013.01.12 · 1249 words · 3 minute read
ウォシュレットでスッキリした後はお尻を拭かなければなりません。
という訳で、お家のトイレからプライバシーが吹き飛ぶガジェット第二弾は、Arduino + Ethernet Shield + ロータリエンコーダでトイレットペーパーの使った長さをツイートする装置。(上記写真)
実際のツイートはこんな感じ。
おしりを拭きました(´ε`;)フキフキ ペーパー長さ79cm
— けーいち (@9SQ) 2013年1月20日
という具合に、長さを±1cmくらいの誤差でつぶやきます。
使用したのはArduino UNO、Ethernet Shield、ロータリエンコーダ(マウスから入手)の3つ。
故障気味のマウスを分解、マウスのホイール部分を取り出します。
これをArduinoに接続。
写真では試験的にMEGA2560を使ってますが、実際はUNOで事足ります。
ロータリエンコーダはA、B、2つのパルスの位相が1/4周期ずれて出力されるので、このパルスをそれぞれカウントすることで回転方向と回転量を導出することが出来る。
このパルスを検出してカウントするためにattachInterruptを使いますが、このとき外部割り込みに使用できるピンはデジタル2番、3番ピン。
エンコーダは、端子が出ている方の面を手前にして左からA、B、GNDとなっている(メーカによって異なる)ので、AをArduinoのデジタル2番ピン、Bを3番ピンに接続します。
更に、ホイールの表面がトイレットペーパーの表面に当たるように、紙巻器に固定します。
長さの計測開始は約1cmからで、計測終了&ツイートはトイレットペーパーの引き出しが終わってから3秒後(3秒間エンコーダが回転しなかったら終了と見なす)としました。
プログラムは、こちらを参考にしつつ、以下のような感じで。
//Copyright 2012 bildr
//Released under the MIT License - Please reuse change and share
//modified by Kei.Y - Additional portions license is CC0
#include <SPI.h>
#include <Ethernet.h>
#include <Twitter.h>
byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //Ethernet ShieldのMACアドレス
byte ip[] = { 192, 168, 1, 123 }; //IPアドレス
Twitter twitter("/* 取得したトークン */");
char msg[256];
int encoderPin1 = 2;
int encoderPin2 = 3;
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
long encoderValueTemp = 0;
long lastUse = 0;
int stopCount = 0;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
Ethernet.begin(mac, ip);
Serial.begin (9600);
pinMode(encoderPin1, INPUT);
pinMode(encoderPin2, INPUT);
digitalWrite(encoderPin1, HIGH);
digitalWrite(encoderPin2, HIGH);
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
}
void loop(){
if(encoderValue > lastUse && (encoderValue - lastUse)>5){
if(encoderValue == encoderValueTemp){
stopCount++;
if(stopCount > 3 ){
sprintf(msg,"おしりを拭きました(´ε`;)フキフキ 長さ%dcm",(int)((encoderValue - lastUse)/5.4));
postTweet();
lastUse = encoderValue;
stopCount = 0;
}
}
encoderValueTemp = encoderValue;
}
delay(1000);
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1);
int LSB = digitalRead(encoderPin2);
int encoded = (MSB << 1) |LSB;
int sum = (lastEncoded << 2) | encoded;
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
lastEncoded = encoded;
}
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.");
}
}
使用用途として、トイレットペーパー使用量を他人と比較したり、無駄づかい防止・節約の為の意識付けなどがありますが、プライバシーも一緒に流れていく事に変わりはありません。
追記:ウォシュレット実況botと合体させて無線化しました。
ウォシュレット実況botの無線化
http://eleclog.quitsq.com/2013/01/toilet-tweet-bot-wireless.html
追記 2016.01.03 : 実際のツイートを開発用アカウントからメインアカウントのツイートに差し替えしました。