Arduinoで取得したデータをマイクロSD カードに保存することができるようになったので、温湿度センサーと組み合わせて温湿度ロガーを作りました。

作りたいものの概略

 ザクっとですが、こんな感じのものを作りたいなー ということをまとめてみました。

  1. 温湿度センサーで10 秒毎に温湿度データを取得する。
  2. データ収取時刻はプログラムがスタートしてからの経過時間を秒で記録する。
  3. 取得したデータは[LOGGING.CSV]というファイル名で、
       
    ”経過時間(秒)” , ”温度(℃)” , ”相対湿度(%)” [改行]
    の形式でmicro SD カードに記録する。
  4. プッシュボタンを一回押すと測定を開始し、もう一度押すと測定を中断する。
  5. 測定中はLED が点灯する。

パーツの配置と配線

パーツ

 必要なパーツを集めます。

 温湿度を測定する為の温湿度センサー、データを保存する為のmicro SD モジュール、測定開始・終了させるためのプッシュボタン、測定中を示すLED 及びLED 用の電流制限抵抗(2 kΩ)。 そしてブレッドボードとジャンプワイヤー、Arduino UNO(互換品)を用意しました。

配線

 配線は下図のようにしました。

スケッチ構想

最初の構想

 スケッチの構想として、当初は”loop” 関数内にプッシュボタンが押される毎にオンとオフを切り替えるスケッチと、温湿度を測定してSD カードに保存するスケッチ、そして”delay” で10 秒間待機するスケッチを書こうと考えていました。

 しかし、この構想だと”delay” で止めている間はプッシュボタンの入力を受け付けないため、測定を終了させるには最長10 秒間プッシュボタンを押し続けてLED が消えるのを待たなければなりません。

MsTimer2

MsTimer2 ライブラリ

 そこで”MsTimer2” というライブラリを使うことにしました。 このライブラリを使えば任意の時間毎に割り込み処理を行うことができます。

 このライブラリを使って、10 秒毎に測定の為の関数を呼び出すスケッチを作ることにしました。

MsTimer2 ライブラリの導入

 まずこちらのサイトから”MsTimer2.zip” をダウンロードしました。 ページの中ほどにダウンロードリンクがあります。

 Arduino IDE から『スケッチ』⇒『ライブラリをインクルード』⇒『.ZIP形式のライブラリをインストール…』からダウンロードしたzipファイルを選択してインストールします。ライブラリのリスト、”提供されたライブラリ”の下に”MsTimer2”があればインストール成功です。

MsTimer2 ライブラリの導入(ライブラリマネージャーから)* ‘21.2.2追記

 MsTimer2ライブラリはライブラリマネージャーから導入することができます。こちらの方が簡単です。

  • Arduino IDEを起動し、『ツール』⇒『ライブラリを管理(Ctrl+Shift+I)』でライブラリマネージャーを開きます。
  • 検索ウィンドウに”MsTimer”と入力し、出てきた候補の中から”MsTimer2 by Javier Valencia”を探します。ここにマウスポインタを当てると[インストール]のボタンが出ますのでクリックしてインストールします。暫くするとインストールが完了しますので[閉じる]ボタンを押します。

改良案

構想

 ”MsTimer2” ライブラリを使ったスケッチの構想を立てました。
”loop” 関数内ではプッシュボタンの監視のみを行い、10 秒毎の割り込みで温湿度の測定とSDカードへの記録を行います。

スケッチ

 上記構想をもとに作成したスケッチが↓です。

#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#include <DHT_U.h>
#include <MsTimer2.h>

#define DHTPIN 2 // 温湿度センサーのピン番号
#define DHTTYPE DHT11 // 温湿度センサーの型番

const int chipSelect = 4; // SDモジュールのチップセレクトのピン番号
volatile bool  meas = 0; // 測定が有効か否か
DHT dht(DHTPIN, DHTTYPE); // 温湿度センサの設定

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }

  Serial.println("Initializing SD card...");

  // SD カード初期化
  while (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    delay(1000);
  }
  Serial.println("card initialized.");

  pinMode(7, OUTPUT); // LED出力
  pinMode(5, INPUT_PULLUP); // プッシュボタン入力
  
  dht.begin(); // 温湿度センサー開始
  
  MsTimer2::set(10000, measure); // 10秒毎に”measure”関数を割り込みで呼び出す
  MsTimer2::start(); // 割り込みを有効にする
}

void loop() {
  // プッシュボタンが押されたとき、”meas”が"0"なら"1"にしてLED点灯
  // "1"なら"0"にしてLED消灯         
  if (digitalRead(5) == LOW) {
    if (meas == 0) {
      meas = 1;
      digitalWrite(7 ,HIGH);
    }
    else  {
      meas = 0;
      digitalWrite(7 ,LOW);
    }
    Serial.println(meas);
    delay(1000);
  }
}

// 温湿度測定
void measure() {
  interrupts(); // 割り込み許可

  // "meas"が1なら温湿度を測定してSDカードに保存
  if (meas == 1) {
    String dataString = "";
    dataString += String(millis() / 1000); // 起動後の経過時間を秒に変換
    dataString += ",";
    dataString += String(dht.readTemperature()); // 温度測定(℃)
    dataString += ",";
    dataString += String(dht.readHumidity()); // 湿度測定(%)

    File dataFile = SD.open("LOGGING.CSV", FILE_WRITE); // フィアルを開く
    
    // 正常に開かれたか確認して、データ書き込みを行ってフィアルを閉じる
    if (dataFile) {
      dataFile.println(dataString); // データ書き込み
      dataFile.close(); // ファイルを閉じる
      Serial.println(dataString);
    }
    else {
      Serial.println("error opening LOGGING.CSV");
    }
  }
}

動作確認

 配線を行ったArduino にスケッチを書きこんで、温湿度測定を行いました。

広告
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Arduino互換 DHT11 温度&湿度センサーモジュール
価格:1064円(税込、送料別) (2021/2/3時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Arduino互換 37-in-1 センサーモジュールキットセット
価格:5904円(税込、送料別) (2021/2/3時点)

広告