上司の離着席状態をクラウドに飛ばし、スマホで見れるようにした。
お疲れ様です。高橋です。
前回ブレッドボード上に構築した上司離着席検知システムですが、ユニバーサル基板上に作りなおしました。
さらに、受け付けた離着席状態をAmazonのクラウドに飛ばし、どこからでも上司の離着席状態を参照出来るようにしました。
全体の流れ
- 上司座席付近に設置したデバイスが離着席状態を部下デバイスに送信
- 部下デバイスは離着席状態をLEDの色で表現すると共に、PCにも離着席状態を送信
- PC側で離着席状態を受け取ると、直前に受け取った離着席状態と差があった場合、AWSに送信
- AWS側では受け取った離着席状態と日時をDBに蓄積し続ける
- 「今の状態を知る」用のwebページを開くと、直近の状態が表示される
- 「今までの状態を知る」用のwebページを開くと、今までの時系列推移が表示される
デバイス
デバイスは、上司の座席付近にこっそり設置する物と、そこからの離着席状態を受け付けて、LEDを点灯させつつ、Amazonのクラウド(EC2)に状態を飛ばす物と、2つあります。
上司デバイス(上司の座席付近にこっそり設置する物)
この左側の測距センサーで離着席を検知します。
部下デバイス(離着席状態を受け付ける物)
上司が着席していると青、離席しているとピンクが点灯します。
動作イメージ
左側が、上司デバイスで、右側が部下デバイスです。今は上司デバイス上空に何も障害が無いので、部下デバイスには怪しげなピンク色のLEDが点灯しています。
ここに手をかざすと「上司着席」モードとなり、青色LEDが点灯します。
※LED
前に使っていた赤色LEDが謎の(というより過負荷による)損傷によってリタイアしてしまいましたので、適当なLEDを挿してみたのですが、これがまた怪しいピンクのLED。素敵な色です。
離着席状態をサーバに飛ばす
離着席状態をサーバに飛ばすには、部下デバイスからシリアル送信される離着席状態をPC側で受け付ける必要があります。部下デバイスは100msec毎にLED点灯の判断を行ってますが、そのまま100msec毎にPCにも情報を送るようにしてます。しかしPC側で100msec毎に受け付けて、しかもそれをそのままクラウドに垂れ流したら、あまり意味のないデータが大量に生成される事になります。そのため、「直前にクラウドに送信した離着席状態と差があった場合のみ送る」というように細工を行います。
部下デバイスからクラウド側にデータを送るためのjavaプログラムが下記の通りです。URLは実際のものでは無いです。
package serialTest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URL; import java.util.TooManyListenersException; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; public class serial implements SerialPortEventListener { public static String strComPort = "COM8"; public static int intBPS = 9600; public String strBeforeStatus = ""; private SerialPort port; private static BufferedReader reader; serial() { try { // Serial port initialize CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(strComPort); port = (SerialPort) portId.open("serial", 2000); port.setSerialPortParams(intBPS, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE ); port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); reader = new BufferedReader(new InputStreamReader(port.getInputStream())); try { port.addEventListener(this); port.notifyOnDataAvailable(true); } catch (TooManyListenersException e) { System.out.println("Error: " + e); } } catch (Exception e) { System.out.println("Error: " + e); System.exit(1); } } public void run() { try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); OutputStream out = port.getOutputStream(); boolean flagQuit = false; while (!flagQuit) { String input = br.readLine(); if (input.length() > 0) { if (input.equals(":quit")) break; input += "\r"; out.write(input.getBytes("US-ASCII")); } } port.close(); } catch (Exception e) { System.out.println("Error: " + e); } } public void serialEvent(SerialPortEvent event) { if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { String buffer = null; try { while (reader.ready()) { try { buffer = reader.readLine(); } catch (IOException ex2) { } if (strBeforeStatus.equals(buffer) == false) { System.out.println(buffer); // post to AWS URL url = new URL("http://curious4dev.mydns.jp/hogehoge.php?status=" + buffer); Object content = url.getContent(); if (content instanceof InputStream) { BufferedReader bf = new BufferedReader(new InputStreamReader((InputStream) content)); String line; while ((line = bf.readLine()) != null) { System.out.println(line); } } strBeforeStatus = buffer; } } } catch (IOException ex) { ex.printStackTrace(); } } } public static void main(String arg[]) { serial serial = new serial(); serial.run(); } }
要は、部下デバイスからシリアルのCOM8で何か来たら、直前に送信したデータと比較して異なっていたら、クラウド側にデータを送る。という事を無限ループさせているだけです。
クラウド側で受け付ける
クラウド側に「hogehoge.php」という、データを受け付けてDBに蓄積するためのプログラムを作っておきます。db接続周りは適当に変えてください。
// get requestparam $status = htmlspecialchars($_GET['status']); // initialize $db_host = 'host'; $db_user = 'user'; $db_pass = 'pass'; $db_name = 'db_name'; $sql_insert = 'insert into richakuseki (status, insert_date) values(:status, now());'; // conenct to mysql $pdo = new PDO("mysql:dbname=" . $db_name, $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); // insert db $statement = $pdo->prepare($sql_insert); $statement->bindParam(':status', $status, PDO::PARAM_STR); $statement->execute();
今の状態をスマホで知る
直近の状態を知りたい時に開くのが下記の通りです。now.phpとでも命名しておきましょう。
// initialize $db_host = 'host'; $db_user = 'user'; $db_pass = 'pass'; $db_name = 'db_name'; $sql_select= 'select status, insert_date from richakuseki order by insert_date desc limit 1;'; // conenct to mysql $pdo = new PDO("mysql:dbname=" . $db_name, $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); // insert db $statement = $pdo->prepare($sql_select); $statement->execute(); $row = $statement->fetch(); $status = $row[0]; $time = $row[1]; if($row[0] == "10") { $status = "着席してる"; } else { $status = "着席してない"; } echo $time . "時点、" . $status;
利用イメージ
スマホでnow.phpを開くと、
こんな感じで、ぶっきらぼうではありますが、現時点の状態を確認する事が出来ます。もっとフワフワしたイラストやら、上司が実際に着席している写真、離席している写真なんかを、状態に応じて表示することも出来ます。
以上、よろしくお願い致します。
関連記事
-
-
YMZ294の基板が動いた。
お疲れ様です。高橋です。 先日「ブレッドボード上のYMZ294をユニバーサル基板 …
-
-
音階LED実装 #4
お疲れ様です。高橋です。 今日は音階LEDのIC-IC間、GNDの敷設、そして1 …
-
-
マウスの位置座標を使った電子楽器を作ってみた。
お疲れ様です。高橋です。 先日分解したマウスを使って、位置座標の取り出しと、取り …
-
-
耳コピミキサー 試作
お疲れ様です。高橋です。 iPhoneから流す音と電子ピアノから流す音を合成する …
-
-
マウスを分解してみた。
お疲れ様です。高橋です。 壊れたマウスを貰った 先日、壊れたマウスを貰いました。 …
-
-
Arduino+EEPROM+YMZ294で曲の抜き差し
お疲れ様です。高橋です。 I2Cの256KBitなEEPROMに曲データを書き込 …
-
-
webからUSBカメラ+Raspberry Pi
お疲れ様です。高橋です。 The Internetから、RaspberryPiの …
-
-
iPhoneでルンバを操作してみたい
お疲れ様です。高橋です。 突然ですがiPhoneでルンバを操作したいと思います。 …
-
-
【完成】ArduinoIDE1.6.4+ATTiny13Aで赤外線リモコン
お疲れ様です。高橋です。 苦戦していたArduinoIDE1.6.4を使ったAT …
-
-
aitendoで買った375円のバックライト付きI2C LCDで文字を表示してみた。
お疲れ様です。高橋です。 ちょっと前にaitendoで買ったバックライト付きのL …
- PREV
- 上司離着席検知システムと空巣検知
- NEXT
- 上司離着席状態検知アプリ