2つ目 湿度チェックアラーム
きっかけ
室内の湿度は温度と同じくらい重要であると、私は思っています。湿度が低すぎると、肌の乾燥や粘膜の乾燥による感染症になるリスクが適正値より増加してしまいます。逆に多湿だと、カビやダニの繁殖の増加や、体調不良や熱中症のリスクが増加する。適切な値でないと、弊害が多く生まれてしまいます。
ですが、外の湿度はスマホで検索すればすぐに出てくるようになっていますが、部屋内の温度は温湿度計が無い限り対処の仕様がありません。多湿はともかく低湿の場合は自身では気が付きにくく、対策が必要なのではないかと考えました。
初期案は温度計のみだった
初期の案としては、室内の温度と自身が住んでいる市の天気を表示させるシステムを考えていました。これは、私の部屋には今テレビが無く、朝急いで出る際に天候を確認せずに出ることがあったため、スマホでの検索の手間を省こうとした結果の案でした。
ですが、これではスマホの方が早いためわざわざM5Stackを起動させる手間の方が大きいと指摘を受け、改良する必要がありました。普段の生活を見直してみた結果、室内の湿度を測ることができたら便利になるのではと考えて、湿度計を追加することにしました。
実際作ってみる
使用したのは、M5Core2、DHTセンサー、BUZZERセンサーです。
プログラム
#include <M5Core2.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 26
#define DHTTYPE DHT11
#define BUZZER_PIN 25
DHT dht(DHTPIN, DHTTYPE);
const float lowHumidityThreshold = 30.0; // 湿度の下限閾値
const float highHumidityThreshold = 70.0; // 湿度の上限閾値
void setup() {
M5.begin();
dht.begin();
M5.Lcd.setTextSize(2);
pinMode(BUZZER_PIN, OUTPUT); // BUZZERピンを出力モードに設定
}
void loop() {
float h = dht.readHumidity(); // 湿度を測定
float t = dht.readTemperature(); // 温度を測定
// センサーが正しく読み取れない場合の処理
if (isnan(h) || isnan(t)) {
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Failed to read from DHT sensor!");
return;
}
// 画面の表示を更新
M5.Lcd.clear();
M5.Lcd.setCursor(0, 0);
M5.Lcd.printf("Temperature: %.1fC\n", t);
M5.Lcd.printf("Humidity: %.1f%%\n", h);
// 湿度が範囲外の場合、アラームを鳴らす
if (h < lowHumidityThreshold || h > highHumidityThreshold) {
M5.Lcd.setCursor(0, 40);
M5.Lcd.println("ALARM: Humidity Threshold Exceeded!");
// BUZZERを使って音を鳴らす (1000Hzで500ms鳴らす)
tone(BUZZER_PIN, 1000); // 1000Hzの音を鳴らす
delay(500); // 500ms待つ
noTone(BUZZER_PIN); // 音を止める
}
delay(20000); // 20秒ごとに測定を更新
}
開発環境はArudino、プログラムは、ここを参考にしたりしました。
M5Stack GitHub
結果
起動すると、温度と湿度が出るようになっています。湿度が範囲外になるとBUZZERが鳴るようになっています。