時代はIoTである。モノをネットに接続することは、もはや正義を通り越して神の啓示であるとすら言えるほどだ(笑)。
やろうやろうと思ってやっていない一事はこのことだ。すなわち、「Arduino」を使用して、直接モノにツイートさせること、これである。モノがツイートするのはきっと面白いに違いない。
「Twitter Arduino」あたりで検索すると、ライブラリが出てくる。今回はこれ(Tweet Library 1.3)をありがたく使わせていただく。
さて、そうと決まれば何をネットに接続するか、である。ここはやはり、自宅の便器をネットに接続するという、これを一度やってみるべきであろう。
やはり、IoT時代であるから、便器もネットにつないでやらなければ面白くないだろう。便器だって平等に扱ってやらねば、他の物品との差別感を覚えてひがむようになり、性格が曲がってしまうかもしれない。このように性格の歪んだ便器は、人間様が用を足すときに局部に噛みついてくるようなことが万に一つはないとも限らない。便器にも時々はインターネットと会話をさせてやるべきだ。
とりあえず、便所のフタの開閉を検知するため、「チルトスイッチ」を使用する。
これは、傾けるとスイッチが入るというもので、Arduinoを買ったときに一緒に買った「Seeedstudio SIDEKICK BASIC KIT」というセットに入っていたものだ。
回路は簡単である。下図のように、行儀よく10kΩほどプルダウンしておけば誤動作は少ない。
スケッチのほうは、ライブラリの導入に多少手間取った。使用させていただいた「Tweet Library」は、「ETHERNET SHIELD」のほうに対応しており、私が持っている「ETHERNET SHIELD 2」にはそのままでは対応していない。
基本的にヘッダファイルのインクルードを「#include <Ethernet.h>」から「#include <Ethernet2.h>」に書き換えるだけでいいのでは、と思ったのだが、どうもうまくいかない。さっぱりお手上げだったのだが、いろいろといじくりまわしているうち、エラーメッセージをよく見てみると、「クラスの2重定義」という意味のエラーが出ていることがわかった。なぜか、「libraries\Ethernet2\srcの下にあるやつと重なっている」みたいなメッセージが出ている。ハテ、とライブラリのあるディレクトリを見てみると、「libraries\Ethernet2\src」の下に、なぜか「Twitter.h」と「Twitter.cpp」がある。
なんだかわかんないけどいいや、消しちゃえ!と、それをぞんざい適当に消したら、うまくコンパイルできるようになった。しかし、そのことで5~6時間ほどハマッてしまった。
ETHERNET SHIELD 2とプロトタイプシールドを、先日買った「継ぎ足しピンヘッダ」を介して積み重ね、次のようにしていつもの100円ショップのアクリル枠にねじ止めする。
手前に緑色のチルトスイッチが取り付けられていることがわかるだろう。
Twitterに専用アカウントをとり、Tweet Libraryの説明にしたがってトークンを取得する。専用アカウントは、その名も「佐藤家の物」である(笑)。
それから、スケッチを次のように書く。
// // つぶやき便所 tweetToilet.ino // 27.08.08(土) 1000~ // 佐藤俊夫 // チルトスイッチで便所のふたの動きを検出し、呟かせる。 // #include <SPI.h> #include <Ethernet2.h> #include <Twitter.h> #include <stdio.h> // byte MAC[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74 }; IPAddress IP(192, 168, 1, 129); Twitter TWITTER("hogehogehoge-hagehagehagehage......"); // トークン const int TILTSW = 9; // void setup() { pinMode(TILTSW, INPUT); delay(1000); Ethernet.begin(MAC, IP); delay(1000); } void loop() { static int tiltSwStatus = LOW, prevStatus = LOW; int i = 0; tiltSwStatus = tiltSw(); if(tiltSwStatus != prevStatus){ prevStatus = tiltSwStatus; tweetMsg(tiltSwStatus); delay(1000); }else{ ; } } // int tiltSw(){ // チルトスイッチの読み取りを安定させるため、100回連続して同じ値が返るまで読む。 int i = 0, prevStatus = LOW, nowStatus = LOW; prevStatus = digitalRead(TILTSW); do{ nowStatus = digitalRead(TILTSW); if(nowStatus == prevStatus){ i ++; }else{ i = 0; } prevStatus = nowStatus; }while(i < 100); return(nowStatus); } // void tweetMsg(int tiltStatus){ const char openMsg[] = "%e3%82%84%e3%81%82%e3%80%82%e4%bf%ba%e3%81%af%e4%bd%90%e8%97%a4%e5%ae%85%e3%81%ae%e4%be%bf%e5%99%a8%e3%81%a0%e3%80%82%e4%bb%8a%e3%83%95%e3%82%bf%e3%81%8c%e9%96%8b%e3%81%84%e3%81%a6%e3%81%84%e3%82%8b%e3%80%82", // 'やあ。俺は佐藤宅の便器だ。今フタが開いている。' closeMsg[] = "%e4%bf%ba%e3%81%af%e4%bd%90%e8%97%a4%e5%ae%85%e3%81%ae%e4%be%bf%e5%99%a8%e3%81%a0%e3%80%82%e4%bb%8a%e3%83%95%e3%82%bf%e3%81%8c%e9%96%89%e3%81%be%e3%81%a3%e3%81%9f%e3%80%82"; // '俺は佐藤宅の便器だ。今フタが閉まった。' char tweetStr[256]; if(tiltStatus == HIGH){ sprintf(tweetStr, "%s \r\n %ld", openMsg, millis()); // Twitterは同じ文字列を繰り返し書き続けられないので、起動時間を付けて書き、重複を防ぐ。 }else{ sprintf(tweetStr, "%s \r\n %ld", closeMsg, millis()); } TWITTER.post(tweetStr); TWITTER.wait(); }
うまく動くようになったら、ホット・グルーでプロトタイプを便器のフタに取り付ける。
便所にLAN工事を施しておしまいだ。
上記動画のように便器のふたを開け閉めすると、やおら便器が次のように呟きだすのである。
やあ。俺は佐藤宅の便器だ。今フタが開いている。
49360— 佐藤家の物 (@SatoGoods) August 8, 2015
俺は佐藤宅の便器だ。今フタが閉まった。
31517— 佐藤家の物 (@SatoGoods) August 8, 2015