#はじめに
みなさんIoTライフ楽しんでますか?
RHEMS技研の荒木です
さて今回はオフィスの郵便受けをArduino(ESP-WROOM-02)を用いてIoT化しました
オフィスが2階だし下の階にある郵便受けに郵便物が投函されてもされてもわからないし、確認に行くのも面倒だなぁ
そうだ!
それならポストをIoT化してしまおう!
というのが今回の趣旨になります
郵便物が投函されたとき・従業員が郵便物を回収したときにそれぞれSlackに通知が流れるようなっているので郵便物が届いた瞬間回収しにいけるわけです!
夢があるでしょう?
ありますよね?
郵便受けを確認しに行くことがなくなるとサボりにくくなるけどIoT化します
#くわしく
仕組みとしてはポストの開閉を感知してAPIエンドポイントに投げる、といった簡単なものになっています
コードは前回(前編)のを郵便受けVer.に改良しただけになります
また、投げたあとの処理も前回(後編)のを郵便受け用に少し変えただけになります
今回書いたコードはこんなかんじです
#include<ESP8266WiFi.h>
#include <WiFiClientSecure.h>
// WiFiアクセスポイントの定数
#define WIFI_SSID "SSID"
#define WIFI_PASSWD "PASSWORD"
// APIアクセスに必要な定数
#define API_HOST "API-HOST"
#define HTTPS_PORT 443
// ピンアサイン
#define SENSOR_PIN1 12
#define SENSOR_PIN2 4
// WiFi Secure Clientを作る
WiFiClientSecure client;
void http_request(String http_method, String uri, String body) {
// レスポンス格納バッファ
String buff = "";
// HTTPSコネクションを開始する
if (!client.connect(API_HOST, HTTPS_PORT)) {
// Serial.println("Connection failed");
}
// リクエストを組み立て送信する
client.print(http_method + " " + uri + " HTTP/1.1\r\n" +
"Host: " + API_HOST + "\r\n" +
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Connection: close\r\n");
if (body.length() > 0) {
// bodyが存在するなら、Content-Lengthと共に送信する
client.print("Content-Length: ");
client.println(body.length());
client.println();
client.println(body);
} else {
// bodyが無い場合は、空行を送信する
client.println();
}
// レスポンスヘッダを読み飛ばす
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
// 空行だけならヘッダは終わっている
break;
} else {
// Serial.println(line);
}
}
// レスポンスボディを1文字づつバッファへ格納
char c;
while (client.available()) {
c = client.read();
buff += c;
}
Serial.println(buff);
client.stop();
}
// 起動時に一度だけ呼ばれるセットアップ関数
void setup(void) {
// ピンのモードを決定
pinMode(SENSOR_PIN1, INPUT);
pinMode(SENSOR_PIN2, INPUT);
// WiFi接続設定を行う
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
// WiFi接続を開始する
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);
}
}
// 変数を定義
int sens1;
int sens2;
int sent1 = 0;
int sent2 = 0;
// メインループ
void loop() {
// センサー読み取り
sens1 = digitalRead(SENSOR_PIN1);
sens2 = digitalRead(SENSOR_PIN2);
// 郵便受けになにか投函されて、まだ未送信だったら
if ((sens1 == HIGH) && (sent1 == 0)) {
sent1 = 1; // FULL送信済みとする
// APIにFULLを通知する
http_request("POST", "URI", "FULL");
}
// 未送信に戻す(sens1)
if (sens1 == "LOW") sent1 = 0;
// 従業員が郵便受けを開け中身を取り出しさらに未送信だったら
if ((sens2 == HIGH) && (sent2 == 0)) {
sent2 = 1; // EMPTY送信済みとする
// APIにEMPTYを通知する
http_request("POST", "URI", "EMPTY");
}
// 未送信に戻す(sens2)
if (sens2 == LOW) sent2 = 0;
delay(100);
}
とこんなかんじです
郵便物が投函されるとsens1が感知して"FULL"が送信され、従業員が郵便物を回収すると"EMPTY"が送信されるといった処理になります
次は回路です
下側についているのがsens1、上にひょろひょろっと出ているのがsens2です
どちらもリードセンサーを用いています
電源はマイクロUSBコネクタを使用してモバイルバッテリーから供給しています
ですが、供給電圧が5VなのでESP-WROOM-02が正常に動いてくれません
なので5V→3.3Vに変換する必要があります
そこで、回路に3端子レギュレータを組み込みます
電源→変換時の配線はこのようになっています
USBシリアル | 3端子レギュレータ |
---|---|
5V | IN |
GND | GND |
3端子レギュレータ | ESP02 |
---|---|
OUT | 3.3V |
GND | GND |
GNDはすべて共用になります
実際に回路を組むときは一箇所に集めるとよいでしょう
あとはプログラム所定のピンを使います
図にするとこんな感じ
ESP-WROOM-02がなかったのでESP8266を用いてそれっぽくしています
Arduinoに亀の子してそれっぽくしているので許して下さい
ピンは変わらず同じなので問題はないと思います
郵便受けに取り付けるとこんな感じです
が、ここで大きな問題が
なんとWi-Fiが郵便受けからオフィスまで届かないのです!!
1Fから2Fまでの距離しかないのになんで届かないの??
そんな怒りと悲しみを抑えながら執筆中です
そりゃまあ金属の箱にいれるのだから中から電波が出ないのは当たり前なんですけどね
残念ながら今回は完成にいたりませんでした(泣)
(まだサボりに行ける!)
記事執筆時ではアンテナの改良案を模索中です
#さいごに
いかがでしたでしょうか?
なにやってんだコイツって思っていただけたなら幸いです
Wi-Fiが届かなかったということで、次回は送信方法の改良をします!!
次回の投稿は未定なので更新されるまでしばしお待ち下さい
それではよきIoTライフを!!!!
https://qiita.com/hina03/items/99df273fbe932dd04941
Ver2が開発されたので読んでください
僕自身が改良したかったのですが幸せなことに忙しくなったので新しくできた部下(?)にやってもらいました
改良案自体は提示したのですが、なんとか本人のみで実装までやってくれました
結局WiFiは使わなかったのですがZigBeeを用いたので簡単に真似できる物となっていますのでぜひお試しください!