WHITEPLUS TechBlog

ソフトウェアエンジニアがIoTやってみた

この記事はWHITEPLUS Advent Calendar 2018 - Qiita 9日目になります。

こんにちは、WHITEPLUSのサーバーサイドエンジニア仲見川です。 リネットのフロントエンドから社内イベントのシステム開発まで幅広く携わってます。

SendGridでSMTPを使わずNode.jsでお手軽メール送受信 - WHITEPLUS TechBlog に引き続き2回目の登場です。

今回は宅配クリーニングサービスを行うリネットならではというネタにしてみました。


私たちのクリーニングはドライクリーニングが主で、このドライクリーニングでは水ではなく石油系のドライクリーニング溶剤を使用しています。 ドライクリーニングは水で洗うと痛んでしまう衣服を洗うことが出来ます。

しかし、石油系溶剤はしっかりと乾燥させないと石油臭が残った状態でお客様の手元に届いたり、最悪のケースでは科学火傷の恐れもあります。

そのため、ドライチェッカーという乾燥状態を確認する機器を使用して溶剤が残っていないか確認しています。

ところが、このドライチェッカーはすでに生産終了しており。現在は在庫しているものを使っている状態で先行きが不安です。

今回はこのドライチェッカーを自作できないかと思い作ってみました。 また、せっかくならスタンドアローンでは無く計測結果をWebに送信して蓄積したいところです。

センサーは本家ドライチェッカーの製造元フィガロ技研が販売しており簡単な回路で検知できます。

ハードウェア&マイコンプログラミング

※私は電子回路は素人なので専門的知識を持っていません。本記事を参照していかなる損害が発生したとしても当方は一切責任を負いません。 電子工作は火災やけが等事故の危険を伴います。十分に配慮、注意のうえ行ってください。

この手の電子工作をするためのマイコンボードは色々とあるのですが、今回は2017年の末くらいから存在感を増してきたM5stackを採用しました。 M5Stackは画面があり無線LAN、Bluetoothを備えるという高機能なもので。 プログラムはArduino開発環境を持ちたスケッチ(C/C++ベースの独自言語)かmicro python(マイコンボード向けのpython)を使って書く事が出来ます。

microPythonはWebIDEにて開発が可能で、デプロイWebIDEからとお手軽なのですが。 Arduinoを以前ちょっと触ったことがあるのとArduino開発環境を用いるとArduinoのライブラリが活用出来るため、今回はArduino開発環境を用います。

セットアップは公式のドキュメントを参照していただくとして。
M5Stack - A series of modular stackable development devices

今回は回路が正しいか確認するためにブレッドボード(ハンダ付けせずに回路を作れるもの)を使ってプロトタイプを作成してみます。

回路は公式のデータシート(仕様書)に記載されている基本測定回路をそのまま再現します。
https://www.figaro.co.jp/product/docs/tgs822_productinfo_131212.pdf

使用する抵抗値の計算もデータシート記載の式に当てはめるだけです。
抵抗値によってセンサーの感度を変えることができるので抵抗はある程度変更が可能なように500Ωの半固定抵抗を使いました。

回路は難なく完成したのでスケッチ(プログラム)を作成します。

#include <M5Stack.h>

#define Sensor_pin 36

void setup()
{
  M5.begin();
  Wire.begin();
  M5.Lcd.setTextFont(2);
  pinMode(Sensor_pin, INPUT);
}

void loop()
{
  M5.Lcd.clear();
  M5.Lcd.setCursor(0,10);
  M5.Lcd.print(analogRead(Sensor_pin));
  delay(1000);
}

Arduino系統のプログラムは起動時にsetup()関数が実行され、移行はloop()関数が繰り返し実行されます。 今回のスケッチはセンサーの数値を読み取り画面に表示して1秒待つという処理です。

このセンサーはドライ溶液だけではなくアルコールも検知するので手指消毒用のアルコールを使って実験。

成功しました!

ちょっと画像小さくてわかりにくいのですが画面の数字がアルコールをしみこませたティッシュペーパーを近づけると増えています。

無事検知できたので計測結果をWebに送信してみましょう。

今回はセキュリティは一旦置いておいて。生データのままheroku構築したWebアプリへHTTPでPOSTすることにします。

#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <M5Stack.h>

#define Sensor_pin 36
#define BttonA 39
WiFiMulti wifi;
#define Ssid "*********"
#define Pass "*********"
HTTPClient http;

void setup()
{
  wifi.addAP(Ssid, Pass);
  M5.begin();
  Wire.begin();
  pinMode(Sensor_pin, INPUT);
  pinMode(BttonA, INPUT);
  while (wifi.run() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.printf(".");
  }
  M5.Lcd.println("wifi connect ok");
  delay(1000);
}

void loop()
{
  M5.update();
  
  if (M5.BtnA.wasReleased()) {
    String postData = String("{\"gas\":\"") + String(analogRead(Sensor_pin)) + String("\"}");
    http.begin( "wp-mail-register.herokuapp.com", 80, "/gas" );
    http.addHeader("Content-Type", "application/json" );
    http.POST(postData);
    M5.Lcd.println("SEND!");
    delay(1000);
  }
  M5.Lcd.clear();
  M5.Lcd.setCursor(0,10);
  M5.Lcd.print(analogRead(Sensor_pin));
  delay(1000);

}

本体左のボタンを押すとJSON形式でPOSTするようにしました。 今回は能動的にボタンを押すと、としましたがプログラム次第なのでとうぜん閾値を超えたらとか。常に取得してログを取るとかも可能です。

これを受け取るアプリケーションは手を抜いて先日のSendGridアプリを流用しました。 POSTを受け取ったらセンサーの数値をメールで送るという実装です。 当然、DBに格納するなどはWeb側アプリ側で好きなようにできます。

// 略

app.use('/gas', (req, res) => {
  const sgMail = require('@sendgrid/mail');
  sgMail.setApiKey(process.env.SENDGRID_API);
  const msg = {
    to: "**********@********",
    from: '**********@********',
    replyTo: '**********@********',
    subject: "ガスセンサー計測値",
    text: `${req.body.gas}`,
  };
  console.log(req.body);
  sgMail.send(msg);
  res.send('ok');
})

// 略

f:id:nakamigawa:20181208012034p:plain

最後に

もちろん、この記事のままでは実運用には耐えられませんのでもっと専門的な知識を持った人と共に改善を進めて行かなければなーと思っています。

現状は精度や信頼性といった点では商用製品にかなうことは無いのですが、もう少し煮詰めると低コストでネットワークに繋がる簡易チェッカーとしては使えそうです。