Arduinoで取得したデータをマイクロSD カードに保存することができるようになったので、温湿度センサーと組み合わせて温湿度ロガーを作りました。
Table of Contents
作りたいものの概略
ザクっとですが、こんな感じのものを作りたいなー ということをまとめてみました。
- 温湿度センサーで10 秒毎に温湿度データを取得する。
- データ収取時刻はプログラムがスタートしてからの経過時間を秒で記録する。
- 取得したデータは[LOGGING.CSV]というファイル名で、
”経過時間(秒)” , ”温度(℃)” , ”相対湿度(%)” [改行]
の形式でmicro SD カードに記録する。 - プッシュボタンを一回押すと測定を開始し、もう一度押すと測定を中断する。
- 測定中は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 にスケッチを書きこんで、温湿度測定を行いました。
広告 | |||
広告 | |||
2022-08-22 at 10:23
おはようございます。
TA-Gと申します
今回このブログを読ませていただき同じように作ってみたく思ったのですが途中のスケッチを検証した際に下記のようなエラーが出てしまいました。
sketch_aug22a:3:10: fatal error: DHT.h: No such file or directory
compilation terminated.
exit status 1
DHT.h: No such file or directory
DHT.hというファイルやディレクトリはないという意味であると思うのですが初心者の私からするとこれに対しての対応方法が分かりません。もしこの解決方法をご存じでありましたら教えていただけるとありがたいと思います。
お忙しいところ恐れ入りますがよろしくお願いします。
2022-09-07 at 21:54
返答が遅くなり申し訳ないです。
温度センサの操作に必要なadafruitのDHTライブラリが入っていないか、
正常に導入されていないかではないでしょうか。
https://soar130650.net/2021/02/02/esp32devkitc210202/#library
を参考にしてください。