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

測定+webストレージシステムの構築:膜間差圧の測定

はじめに

測定したデータをweb経由で転送し、閲覧することができれば自宅でも稼働状況を確認することができ、大変便利です。ここではESPr® Developerと市販の圧力センサを接続し、圧力を測定、測定値をIoTデータ可視可サービスのAmbientへ転送し、web閲覧する装置を作成します。後半では、Ambientではなく、IFTTT(イフト)を経由してGoogleドライブのスプレッドシートへ測定値を記録するシステムを紹介します。。

膜間差圧の測定→測定値をAmbientへ保存

材料

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

作製方法

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

ESP8266_圧力計.jpg図のような回路を組みます。動作原理として、圧力計の測定値はディスプレイに表示されると同時に出力ラインから出力されています。この圧力計は0〜5V出力ですが、ESPr DeveloperのTOUTピンの入力は0〜1Vです。そのため、抵抗を2個使って作る分圧回路を途中に設置し、電圧を落としてTOUTピンヘ接続しています。図の中の分圧回路では10kΩと47kΩを使用しているので、圧力計からの出力は10÷57=0.1754倍に降圧されます。


1.jpgAmbientにデータを保存する準備をします。AmbientのHPへ行き、ユーザー登録します。ログインするとMyチャネルの画面です。最初にログインしたときはデータを保存するためのチャネルがないので「チャネルを作る」を押して、新しいチャネルを用意してください。作製したチャネルのチャネルIDの番号(数字4桁)とライトキー(abc0138acibuのような英数字)をメモします。

以下のスケッチをESPr developerへ転送します。ESPr developerの測定値から圧力(単位 kPa)に換算していますが、これには検量線が必要です。検量線の作製方法は先のページを参考にしてください。また、スケッチではAmbient.hライブラリが必要です。ダウンロード、インストール方法はHPを参考ください。ESP8266WiFi.hとSPI.hライブラリは既にインストールされているはずですが、コンパイル時にエラーで見つからないようなら追加インストールしてください。スケッチ内で変更が必要な箇所はwifiのSSID、パスワード、AmbientのチャネルID、ライトキーの部分、これに加えて圧力換算のための換算式の傾き、切片(以下ではそれぞれ0.2762、-154.45としています)を入力します。

/*
圧力センサで測定した値をambientへアップロードするスケッチ
*/

#include <ESP8266WiFi.h>
#include <SPI.h>
#include "Ambient.h"

WiFiClient client;
Ambient ambient;

const char* ssid = “xxxx"; //要変更、wi-fiのSSID、ダブルクオテーションは必要
const char* password = "xxxx"; //要変更、wifiのパスワード、ダブルクオテーションは必要

unsigned int channelId = xxxx; // 要変更、AmbientのチャネルID
const char* writeKey = “xxxxx"; // 要変更、ライトキー、ダブルクオテーションは必要

// 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 setup(){
Serial.begin(115200);
delay(10);
Serial.println("Start");
WiFi.begin(ssid, password); // Wi-Fi APに接続
while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち
delay(100);
}

Serial.print("WiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}

void loop(){
value =analogRead(A0);
TMP = (value * slope) + intercept; //測定値から検量線でTMPを換算する、単位kPa
Serial.print(TMP); Serial.println(" kPa");
ambient.set(1, TMP); // valueをデータ1にセット
ambient.send(); // データをAmbientに送信
delay(15000); //15秒間隔
}

動作確認するため、シリアルモニタを立ち上げた状態で同じスケッチを再転送してください。書き込みが終わるとスケッチの最初からプログラムが作動します。シリアルモニタでwifi接続に成功し、測定値が表示され始めていれば、動作しています。Ambientにログインし、データを保存しているチャネルに入ると自動で作成されるグラフとしてデータを見ることができるはずです。
動作確認が終わったら、PCから切り離して5Vアダプタ電源に変更します。

ambient_TMP_serial01.jpgambient_TMP_graph01.jpgESP8266_圧力計_アダプタ.jpg

膜間差圧の測定→測定値をIFTT経由でGoogle driveへ保存

関連して、先の水漏れセンサーの記事で使用したIFTTTを使ってもデータをwebにアップロードできます。この場合、googleのスプレッドシート(google drive)へデータを自動保存するやり方です。Triggerは先の記事と同じくWebhooksのreceive a web requestをでイベントを作製します。
Actionでは”Google sheets"を選択し、"Add row to spread sheet"で測定値を書き込んでいきます。次の画面ではシートへ何を書き込むのか次の画面で編集できます、そのままでも動作するので編集しなくても構いません。

20.jpg21.jpg22.jpg

回路は先のAmbientを使用した時のものと同じで、以下のようなスケッチになります。赤字の部分を適宜変更してください。イベントは測定用に作製した名前に変更してください。
シリアルモニタを表示すると、wifi接続を示すメッセージが表示された後、測定値、測定毎にIFTTTに接続するメッセージが表示されます。データはGoogle driveに保存されています。IFTTTにログインしたgoogleアカウントでログインし、データを確認してください。今回はIFTTTのgoogleスプレッドシートの表示内容をデフォルトのままにしましたが、この場合、測定時間、イベント名、val1、val2、val3の値を各列に保存する内容になります。
動作確認が終わったらESPR developerをPCから切り離し、5V アダプタ電源を接続し、運用します。アダプタ電源の接続は先の例と同じです。

/*
センサ入力値をESP8266からIFTTTヘ接続、googleのスプレッドシートに保管するスケッチ
*/

#include <ESP8266WiFi.h>

const char* ssid = “xxxx"; //要変更、wifiのssid入力、ダブルクオテーションで囲む
const char* password = "xxxx"; //要変更、wifiのパスワード、ダブルクオテーションで囲む
const char* host = "maker.ifttt.com"; //iftttアドレス、変更なし。
const char* event = "data_storage_test1"; //要変更、ifttt webhooksで作製したイベントの名前
const char* secret_key = "xxxx"; //要変更、webhooksのdocumentationで確認できるkey
int val1 = 0; //iftttのアクションでGoogleスプレッドに記入する変数を定義
int val2 = 0;
//iftttのアクションでGoogleスプレッドに記入する変数を定義
int val3 = 0;
//iftttのアクションでGoogleスプレッドに記入する変数を定義

// 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

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() {
delay(15000); //15秒間隔で測定,データ送信
value =analogRead(A0); //TOUTピンで測定
val1 = (value * slope) + intercept; //測定値から検量線でTMPを換算する、単位kPa
Serial.print(val1);Serial.println(" kPa”); //測定値をシリアルモニタに表示
++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;
url += "?value1=“;
url += String(val1);
//iftttのアクションで設定するval1、この中にTMPの値が格納され、googleシートに保存される
url += "&value2=";
url += String(val2); //今回は該当するデータを保存していないので空のまま
url += "&value3=";
url += String(val3);
//今回は該当するデータを保存していないので空のまま

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");
delay(10);

while (client.connected()) {
String line = client.readStringUntil('\r');
Serial.print(line);
Serial.println("closing connection");
Serial.println();
}
}

ESPR_pressure_serialmonitor01.jpgESPR_pressure_IFTT_google.jpg