研究Tips:研究を効率化するためのTipsを紹介しています。

測定+メール通知システムの構築: 例 水漏れ、膜間差圧の監視

はじめに

リアクターを運転しているとしばしば水漏れが生じます。できるだけ早く水漏れが生じたことに気づいて対応できればいいのですが、週末をはさむと大惨事になっている場合もあります。この問題を解決するために以前、wifi接続のwebカメラを実験室内に設置したことがあるのですが、webカメラは1) 人の目で結局確認しなければトラブルの有無がわからないので、一日に何回も確認する必要がある、2)部屋の天井灯を常にONにしておく必要があるなど制限がありました。監視作業は誰かに任せて、なにかトラブルがあったときにスマホに連絡が届くシステムが一番効率的です。このページではそうした監視システムを作ります。

いままではArduinoをマイコンとして使用してきましたが、Arduino単品ではネット接続ができません。Arduinoでネット接続するには無線機ZigBeeをシールドで取り付ける、Arduino Yunなどのタイプを使用するなどが考えられますが、ここでは安価かつ製作例の多いESPr® Developerを使用します。ESPr® Developerはwifiでネット回線に接続でき、Arduino同様にプログラムすることができるのでArduinoに慣れた人には扱い易い部品です。ここでは二つの製作例を紹介します:

例1. 水漏れが生じた場合、wifi回線を使ってインターネットにアクセスし、gmailでメール連絡する装置

例2. 圧力センサで膜間差圧を測定し、差圧がある一定値を超えた(=膜が閉塞した)際にwifi回線を使ってインターネットにアクセスし、gmailで連絡する装置です。

なお、センサー部分をDOセンサー等、各種センサーへ変更するだけで転用可能ですので、アイディア次第で幅広い用途で利用できます。センサー類については、pH、DO、ORPコントローラーの項目の材料リストを参考にしてください。後述しますが、ここで使用するESPr® Developerの電圧測定は0〜1Vレンジ(Arduinoは0〜5V)なので、これよりも高い電圧で測定値を出力するセンサーの場合、抵抗を途中に設置するなどして電圧を落として入力します。

例1 水漏れ検知+web通報

材料

  1. ESPr® Developer (ピンソケット実装済み) (スイッチサイエンス、SSCI-026529)
  2. USB2.0ケーブル(A-microBタイプ) (スイッチサイエンス、SSCI-010351)
  3. Wifiルーター
  4. ブレッドボード:例えば、ブレッドボードBB-601 (秋月電子通商 P-05155)。
  5. 収納ケース(100均の食品保存ケース、空きチップケースなど。ESPr類が入ればなんでも構いません。)
  6. 電線(単芯のワイヤ): 例えば、耐熱通信機器用ビニル電線 2m×10色 (秋月電子通商 P-08996)
  7. ワイヤーストリッパー (例えば、ベッセルワイヤーストリッパー 3500E-1)
  8. 100kΩ抵抗
  9. ACアダプター5V2A (秋月電気通商: M-01891)
  10. 2.1mm標準DCジャック・スクリュー端子台 (秋月電子通商: C-08849)
  11. ドライバー、電気ドリルとドリルビットなど汎用工具

作製方法

これまでArduinoで使用してきたプログラムソフトのArduino IDEでESPr Developerを取り扱えるように環境を設定します。この作業の方法はスイッチサイエンスのHPに詳しい説明があるので、こちらに従ってください。作業後、Arduino IDEにおいて、ボードからGeneric ESP8266 moduleを指定し、シリアルポートでUSB接続したESPr Developerを指定してください。

水漏れセンサ回路図.jpg図のような回路を組みます。動作原理として、水に接触するまでワイヤ開放端は接続されていないので通電しませんが、水を介して電気が流れるようになるとそのシグナルを検知する仕組みになっています。ワイヤ開放端はビニールテープなどで床に貼り付けるか、ゴム栓に穴を空けて固定するといいです。ESPr Developerでは”TOUT”ピン(基盤上のピンの文字が読みづらく、VOUTピンと間違えやすいので注意してください。)をArduinoのアナログ入出力ピンと同様に使用できます。測定電圧レンジが0〜1Vです(ESPr DeveloperはこのピンがTOUTしかないところが玉にきずです)。

Web通知を受け取り、Gmailを送るためにIFTTT(イフト)を使用します。初めてログインする場合、アカウントが必要です。この後でgmailを送信する必要もあるので、googleアカウントでログインします。青色の”Sign in”ボタンの下にある”Continue with Google or Facebook”をクリックし、アカウント、パスワードなど必要な情報を入れて、sign inしてください。研究室でgoogleアカウントを作っておいて、そちらで運用すると良いです。

0.jpgIFTTT_sign.jpg

右上のアカウントを展開し、その中の"New Applet"を選択します。
If this then thatの「this」を選択し、トリガー動作を決めます。ここではWebhooksを使います。Webhooksを選択、続いて、Receive a web requestを選択します。Event Nameをユニークな名前で入力します。例えば、water_leakageなど、なんでもいいです。Create triggerで決定します。

ti.jpg1.jpg2.jpg3.png4.jpg

If this then thatの「that」を選択し、トリガーが発動したときの行動を決めます。

メールの送受信を行うには、次の二通りあります。自分のgmailアカウントにメールを送信する場合、Emailを選択し、Send me an emailです。続く画面でどのような文面のメールを送信するか編集できます。水漏れが起きていることを知りたいだけならそのままの文面で構いません。

もう一つのトリガーの例は自分のgmailアカウントを使って、別のアカウント(大学のアカウントなど)へ送信したい場合です。この場合、Gmailを選択し、Send an emailです。送信先のアドレス等を記載する以外は先の説明と同様です。作業が終わったらCreate actionを選択、内容確認後にfinishします。これでトリガーとアクションの組み合わせができました。これでESP8266が漏水を検出し、webリクエストを送ると、メールを送信するプログラムができました。

1.jpg2.jpg3.jpg4.jpg5.jpg6.jpg7.jpgalarm_message.jpg8.jpg

続いて、表示される画面のWebhooksのロゴをクリックし、右上のDocumentationを選択します。ここに表示されるyour keyをメモしておきます。

8.jpg9.jpg10.jpg

以下のスケッチをESPr Developerへ転送します。変更が必要な箇所は赤字で書いている、wifiのSSID、パスワード、Webhooksのkey、イベント名、測定時間間隔、通報する際の閾値です。なお、漏電を検出して通報する際の閾値を900にしていますが、漏水によってワイヤ間に電気が流れれば、間違いなく1000を超えるのでこの設定で問題ないかと思います。変更しても構いません。

/*
水漏れをワイヤで検出し、ESP8266からIFTTTヘ接続、Gmail宛にメールを送信するスケッチ
*/
#include <ESP8266WiFi.h>

const char* ssid = “abcde0000"; //wifiのssid入力、ダブルクオテーションで囲む
const char* password = “abitibh92"; //wifiのパスワード、ダブルクオテーションで囲む
const char* host = "maker.ifttt.com"; //iftttアドレス、変更なし。
const char* event = “leakage"; //ifttt webhooksで作製したイベントの名前、ダブルクオテーションで囲む
const char* secret_key = “abi9347GEgeibhTA12"; //webhooksのdocumentationで確認できるkey、ダブルクオテーションで囲む

void setup() {
Serial.begin(115200);

// wifi接続を開始する。
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

int value; //valueを数値データ格納用に定義

void loop() {
value =analogRead(A0); //TOUTピンで測定
Serial.println(value);
delay(3000); //A0を3秒間隔で測定, シグナルが900を超えたら作動。
if(value > 900)
{
// delay(5000);
++value;

Serial.print("connecting to ");
Serial.print(host);

// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80; //http接続なので、ポート80を使用。

if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}

// URLを作成
// maker.ifttt.com/trigger/{event}/with/key/{key}
String url = "/trigger/";
url += event;
url += "/with/key/";
url += secret_key;

Serial.print("requesting URL: ");
Serial.println(url);

// ウェブリクエストを送信
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");

while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
// ヘッダ部分の受取終了
break;
}
}

//終了
String line = client.readStringUntil('\n');
Serial.print("reply: ");
Serial.println(line);
Serial.println("closing connection");
Serial.println();

delay(1000*60*60); // 1時間後に測定再開、問題が続くようならその都度メールを送信
}
}

スケッチをESPr developerへ転送したら、Arduino IDEのシリアルモニタで動作状況を確認してください。最初にwifiの接続が表示され、続いて、測定値の表示になります。次にワイヤ先端を水に浸し、測定値が上昇すること、それによってwebリクエストが実行されるメッセージがシリアルモニタに表示されることを確認してください。

宛先のメールにメールが届いているか確認します。サーバー次第でメールの受信まで5分ほどかかる場合もあります、また、ゴミ箱や迷惑メールに仕分けられる場合もあるので確認してください。それでもメールが届かない場合、IFTTTのmy appletsから動かしているappletsを選択し、最後に動作したした時間、累積動作回数(写真の赤枠内の情報)を確認します。これがゼロのままでnever runになっていたらwebリクエストがIFTTTへ届いていません。

serial_monitor_alarm.jpgmail_message.jpg

Alarm1_operation.jpg

ESP8266_水漏れセンサ.jpgPC接続状況で動作が確認できたら、PCから切り離し、電源をアダプタに切り替えます。ESP8266の電源を入力するVINピンへの入力電圧は3.7〜6Vなので、5Vの電源を供給するアダプタを使用しています。GNDピンにマイナス、VINピンにプラスを接続です。単三乾電池駆動も可能です。本当は待機時の消費電力を抑えるためにdeepsleepingモードを導入した方がいいのですが、実験室内に設置するなら電源の確保は容易だと思います。そのため、アダプタから電源を取り、deepsleepingはしない動作になっています(もちろん組み込んでもらって構いません)。

例2 膜間差圧測定+web通報

概要

デジタル圧力計PPXR01NH6Mは-100〜100kPaの圧力を測定し、測定値をアナログ電圧出力するセンサです。この出力電圧をESPr® Developerで測定し、圧力が閾値を下回った場合(=ここでは膜ろ過の流路に圧力センサを設置したと仮定し、これは膜が閉塞したことを意味する)に、Gmailで通知を送信する装置を作成します。

先の水漏れセンサと同様の回路ですが、ここで使用している圧力計の電圧出力は0〜5Vであるのに対し、ESPr® DeveloperのTOUTピンは0〜1Vの入力範囲です。そのため、圧力計の出力をTOUTへ直接接続すると、オーバーレンジになってしまいます。そのため、分圧回路を使って、電圧出力を約1/5に降圧し、TOUTピンで測定します。

材料

  1. ESPr® Developer (ピンソケット実装済み) (スイッチサイエンス、SSCI-026529)
  2. USB2.0ケーブル(A-microBタイプ) (スイッチサイエンス、SSCI-010351)
  3. Wifiルーター
  4. 収納ケース(100均の食品保存ケース、空きチップケースなど。ESPr類が入ればなんでも構いません。)
  5. 電線(単芯のワイヤ): 例えば、耐熱通信機器用ビニル電線 2m×10色 (秋月電子通商 P-08996)
  6. ワイヤーストリッパー (例えば、ベッセルワイヤーストリッパー 3500E-1)
  7. ACアダプター5V2A (秋月電気通商: M-01891)
  8. ACアダプター 12V 1A (秋月電子通商 M-01804)
  9. 2.1mm標準DCジャック・スクリュー端子台 (秋月電子通商: C-08849) 2個
  10. 圧力センサ(アナログ電圧出力できるタイプのもの): デジタル圧力センサPPXR01NH6M (アズワン 61-5686-15)および内ネジホースニップル 1/8 × 7 GHNF-0107 (アズワン61-9574-11)
  11. 抵抗10 kΩと47kΩ
  12. ドライバー、電気ドリルとドリルビットなど汎用工具

作製方法

ESP8266_圧力計.jpg図のような配線で回路を作製します。ここでは10 kΩと47kΩ抵抗で分圧しており、TOUTピンに入力する電圧は10÷(10+47)に降圧され、0〜1Vの範囲におさまるようにしています。

回路ができあがったら、続いてIFTTTでトリガーとアクションを決めます。先の水漏れセンサーの例と同じでトリガーをwebhooks; receive web requestを選び、アクションでemailまたはgmailを選び、メール送信を選びます。イベント名とwebhooksのkeyを以下のスケッチで使用するので、メモしておきます。

ESPr® Developerで測定した電圧から圧力(単位kPa)を求めるための検量線を作製します。そのためにまず、以下のスケッチを転送します。シリアルモニタを表示し、測定値を確認します。大気圧開放(= 0 kPa)の状態では表示値は560でした。つづいて、圧力計の圧力ポートにチューブとテルモシリンジを取り付けて、負圧または陽圧に調整し、圧力計表示値とそのときのシリアルモニタの表示値をメモします。

/*
圧力をPPXR01NH6Mの電圧出力を測定、表示する。検量線作製用のスケッチ
*/

#include <ESP8266WiFi.h>
int value;

void setup() {
Serial.begin(115200);
}
void loop() {
value =analogRead(A0); //TOUTピンで測定
Serial.println(value);
delay(3000); //A0を3秒間隔で測定。
}

検量線_圧力計1.jpg先の作業を複数点で測定し、測定値の関係をエクセルに入力して、検量線を求めます。写真のとおり、ここでは傾き0.2762、切片-154.45の直線が得られました。

TMP_serial_monitor.jpg続いて、以下の本スケッチを転送します。本スケッチでは赤字のwifiのSSID、接続パスワード、Webhooksのkey、イベント名、測定時間間隔、通報する際の閾値を適宜変更してください。ここでは圧力が-75 kPaを下回ったとき(=膜が閉塞した)にIFTTTで設定したイベント(Gmailの送信)が行われるようにしています。

転送後、シリアルモニタで動作確認した際の状況が写真の通りです。圧力をkPa単位で表示し、-75 kPaを下回ったときにトリガーが発動しています。

/*
圧力をPPXR01NH6Mで測定し、圧力が閾値を超えた場合、IFTTTヘ接続、Gmailでメールを送信するスケッチ
*/

#include <ESP8266WiFi.h>

const char* ssid = “XXXX"; //wifiのssid入力、ダブルクオテーションで囲む
const char* password = "XXXX"; //wifiのパスワード、ダブルクオテーションで囲む
const char* host = "maker.ifttt.com"; //iftttアドレス、変更なし。
const char* event = "TMP_alarm1"; //ifttt webhooksで作製したイベントの名前, ダブルクオテーションで囲む
const char* secret_key = "XXXX"; //webhooksのdocumentationで確認できるkey, ダブルクオテーションで囲む

void setup() {
Serial.begin(115200);

// wifi接続を開始する。
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

// You need to change the values of slope and intercept.
float slope = 0.2762; // create global variable for slope
float intercept = -154.45; // create global variable for intercept
int value; //valueを数値データ格納用に定義
int TMP; //TMPを数値データ格納用に定義



void loop() {
value =analogRead(A0); //TOUTピンで測定
TMP = (value * slope) + intercept; //測定値から検量線でTMPを換算する、単位kPa
Serial.print(TMP);
Serial.println(" kPa");
delay(3000); //A0を3秒間隔で測定, TMPが−75kPaを下回ったら膜が閉塞したとみなして作動。
if(TMP < -75)
{
// delay(5000);
++value;

Serial.print("connecting to ");
Serial.print(host);

// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80; //http接続なので、ポート80を使用。https接続はしない。

if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}

// URLを作成
// maker.ifttt.com/trigger/{event}/with/key/{key}
String url = "/trigger/";
url += event;
url += "/with/key/";
url += secret_key;

Serial.print("requesting URL: ");
Serial.println(url);

// ウェブリクエストを送信
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");

while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
// ヘッダ部分の受取終了
break;
}
}

//終了
String line = client.readStringUntil('\n');
Serial.print("reply: ");
Serial.println(line);
Serial.println("closing connection");
Serial.println();

delay(1000*60*60); // 1時間後に測定再開
}
}

ESP8266_圧力計_アダプタ.jpg動作確認が終わったら、ESPr developerの電源を5Vアダプタに変更し、動作を開始します。