机の上においたボタンを押すとリアルタイムでSlack上に寿司を食べたいことを通知できるシステムを構築した
机の上においたボタンを押すとSlack上に寿司を食べたいことを通知できるシステムを構築した。
動機
寿司を食べたい時にそれをSlackで報告するためわざわざキーボードに手を伸ばすのは非常に面倒である。机の上に専用のスイッチがありそれを押すだけで寿司が食べたいことを通知できれば非常に素晴らしいユーザー体験が得られるはずだ。昔遊んでいたArduinoが家にあったので、それとSlackを組み合わせることでシステムを構築していく。
作り方
Arduino側
100均に行ってボタンっぽいものを購入する。
スイッチ式のシーリングライトがあったので流用。ライトなので押すと光る。
(光る)
気合で内部のスイッチを見つけ出して配線。
内部を開けるとこんなかんじになっていた。緑と黄色のリード線は自分で結線した。
適当に抵抗を繋いでやばい電流がArduinoにいかないようにする。 回路図を示したいところだが、そもそも100均ボタン側の回路が不明なのでプレッドボード側も勘で配線した。 とりあえず5Vを直接グラウンドに繋いではいけないことがわかった。
Arduinoにコードをデプロイ。
const int SWITCH = 2; void setup() { pinMode(SWITCH, INPUT); Serial.begin(9600); } void loop() { if (digitalRead(SWITCH) == HIGH) { Serial.print("1\n"); } else { Serial.print("0\n"); } delay(500); }
Arduinoに繋いでシリアルモニタでチェック。"1"と"0"がボタンに応じて出力されていればOK
。出てなかったら配線とか抵抗を見直す。
Python側
PySerialというモジュールがあるので、それをpipでインストール(Arduinoとの通信)。
こちらを参考にした。
slackwebというモジュールがあるので、それをpipでインストール(Slackとの通信)。
SlackのIncoming WebHookを用いた。異常に簡単にSlackにメッセージを流せる。
Slackにincoming webhook経由でpythonからメッセージをPOSTする - Qiita
コードはこちらを参考にした。 Incoming WebHookのURLは環境変数に格納し、実行時に読み込むようにした。
pythonを実行
import slackweb import os import serial import time url = os.environ["SLACK_OHA"] slack = slackweb.Slack(url=url) port = "/dev/cu.usbmodem1421" current_oha_state = False # ボード側は500ms間隔でserialにHIGH -> b"1", LOW -> b"0"を送信する with serial.Serial(port=port, baudrate=9600, timeout=1) as ser: while True: # time.sleep(0.1) flag = ser.readline() # switch ON if (bytes(b"0") in flag and not current_oha_state): current_oha_state = True print("oha") slack.notify(text="スシ食べたい🍣") # switch OFF elif (bytes(b"1") in flag and current_oha_state): current_oha_state = False print("otu") slack.notify(text="スシいらない🍣") print(flag, current_oha_state)
結果
とりあえずボタンをポチポチ押す。すると、
ほぼリアルタイムでこのようになる。ギリギリIoTの範疇に入る気がする。
これで快適に他人にスシを食べたいことを通知できるようになった。 会社のCTOがArduinoの無線モジュールを入手したようなので、それを使えばボタンをPCから独立させることも可能な気がする。未来っぽい。