M5StackでGROVE-ダストセンサを使う

先日、M5StickCと「GROVE – ダストセンサ」をつなぎ、室内のホコリの量を測定しました(記事は こちら)。

今回は、これと同じことをM5Stackで試します。
アレルギー体質の人、ペットを飼っている人など、ハウスダストを気にしている人が、自宅のホコリの量を常時チェックしたいというケースを想定しています。

使用するのは、スイッチサイエンスで購入した「GROVE – ダストセンサ」です。


このセンサは、大気中の1μm以上の粒子状物質の濃度を測ることができます。ちなみに、PM2.5は2.5μm、スギ花粉は30〜40μmの大きさとのことです。
空気の品質管理、喫煙感知、クリーンルームの管理などに使えるようです。
使用する際には、直立状態にしておかなければなりません。また、最初に3分程度の予熱時間が必要です。

ダストセンサを、M5Stackにつなぎます。
M5StackのGROVEポートは、電源:5V、信号:3.3Vです。ダストセンサは5V駆動なので、本来は信号を3.3Vに降圧しないといけないのかもしれませんが、今回はM5Stackに直結しました。

なお、M5Stack Basicに最初からついているGROVEポートはI2C専用です。今回使用したM5Stackには、GPIO仕様のGROVEセンサをつなぐために「PLUSエンコーダモジュール」というものを取り付けています。

ダストセンサは、このGPIO用のGROVEポートにつなぎます。

ダストセンサで測定したホコリの量を、AmbientというWebサービスに送信して、Ambientでグラフ表示してみます。

スケッチは以下のとおりです。M5StickCの時のスケッチとほとんど同じです。
ダストセンサでホコリの量を測定する部分は、ダストセンサ使用例(http://www.howmuchsnow.com/arduino/airquality/grovedust/)のスケッチを、Ambientにデータを送信する部分は、Ambientの環境構築を行った時に作成したスケッチ(記事は こちら)を流用しています。

#include <M5Stack.h>
#include "Ambient.h"

WiFiClient client;
Ambient ambient;

const char* ssid       = "XXXXXXXX";
const char* password   = "XXXXXXXX";
unsigned int channelId = XXXXX;
const char* writeKey   = "XXXXXXXX";

int interval = 60000;
int pin = 36;

unsigned long sendTime;

void setup() {
  M5.begin();
  M5.Lcd.setCursor(0, 0, 2);

  WiFi.begin(ssid, password);
  while(WiFi.status()!=WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.print("\r\nWiFi connected\r\nIP address: ");
  M5.Lcd.println(WiFi.localIP());
  ambient.begin(channelId, writeKey, &client);

  pinMode(pin, INPUT);
  sendTime = millis();
}

unsigned long lowpulseoccupancy = 0;

void loop() {
  unsigned long duration = pulseIn(pin, LOW);
  lowpulseoccupancy = lowpulseoccupancy + duration;

  unsigned long currentTime = millis();
  if(currentTime-sendTime >= interval || currentTime < sendTime) {
    float ratio = lowpulseoccupancy / (interval*10.0);
    float value = 1.1*pow(ratio,3 ) - 3.8*pow(ratio, 2) + 520*ratio + 0.62;

    ambient.set(1, value);
    ambient.send();
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(0, 0, 2);
    M5.Lcd.println(value);

    sendTime = currentTime;
    lowpulseoccupancy = 0;
  }
}

センサから取り込んだ信号のLow期間の比率を測定し、測定した値をホコリの量に補正した上で、1分毎にAmbientに送信しています。

センサを我が家のダイニングに設置した時の結果は、以下のとおりです。

M5StickCの時と同様の結果が得られました。
夜間は低いレベルになっていますが、昼間はレベルが上がり、人の活動が多いタイミングで大幅に上昇しています。

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。