ProMicroで熱中症アラート付き温度計を作ってみた

 ProMicroを手に入れました。正確にはProMicroの互換品ですが。

 ProMicro自体もArduino Leonardoの互換品ということで、互換品の互換品になりますね。今回はProMicroと温度センサモジュールとキャラクLCDモジュールを使って温度計を作ってみましょう。
 どうせなら、熱中症の危険度がLEDの色で一目でわかるようにしてみましょう。

仕様

 温度計なので、LCDに温度を表示させるのは決まりです。LEDの色と閾値を決めなければいけません。
 こちらの環境省の資料によれば部屋の温度が28℃が最もよく、24℃以下では外気温との温度差が大きく体に負担とのことです。
 また、こちらの資料では、暑さ指数(WGBT)が

暑さ指数 危険度
28℃~31℃ 厳重警戒
31℃以上 危険

となっていますね。
 暑さ指数は実際には湿度によっても変わるんですが、今回は手元に湿度計がないので温度だけ見てアラートを出すことにします。湿度測定への拡張は作ってしまってからでも簡単にできますしね。
 ということで、LEDの色と閾値は下記の感じでいきましょう。

室温 危険度
24℃以下 黄色
24~28.5℃ 青色
28.5~31℃ 黄色
31℃以上 赤色

材料

回路

 こんな感じです。
f:id:moutakusan:20200905170158p:plain

 LEDの電流制限抵抗は赤が順方向電圧2.1V minで、最大定格50mAなので、
    RRED = (5-1.8)V/0.05A = 64 ohm
青と緑は順方向電圧2.9V minで、最大定格30mAなので、
    RBG = (5-2.9)V/0.03A = 70 ohm
って感じで、抵抗のMIN値だけ計算して、適当に決めました。

配線

こんなんになりました。配線多くて見た目はいまいちだなぁ。
f:id:moutakusan:20200905174246p:plain

こちらの記事とかだと、ユニバーサル基板にLCDモジュールを取り付けてきれいに配線してるなぁ。今後の課題です。

コード

基本的にはArduino IDEに収録されてるコードのコピペで作れてしまいます。今回は、

  • ファイル → スケッチ例 → Wire → master_reader
  • ファイル → スケッチ例 → LiquidCrystal → HelloWorld

の二つをベースに作りました。

#include <Wire.h>
#include <LiquidCrystal.h>
const int rs = 9, en = 10, d4 = 8, d5 = 7, d6 = 6, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int rled=15, gled=14, bled = 16;
void setup() {
Wire.begin();        // join i2c bus (address optional for master)
Serial.begin(9600);  // start serial for output
Wire.beginTransmission(0x48);
Wire.write(0x03);
Wire.write(0x80);
Wire.endTransmission();
delay(240);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("temperature");
pinMode(rled,OUTPUT);
pinMode(bled,OUTPUT);
pinMode(gled,OUTPUT);
digitalWrite(rled,LOW);
digitalWrite(gled,LOW);
digitalWrite(bled,LOW);
}
void loop() {
Wire.requestFrom(0x48, 2);    // request 6 bytes from slave device #8
int byteData;
int data=0;
float temp;
while (Wire.available()) { // slave may send less than requested
byteData = (Wire.read()<<8) | Wire.read(); // receive a byte as character
if(byteData & 0x8000){
data = -((~byteData & 0x7fff) +1 );
}
else{
data = byteData&0x7fff;
}
}
temp = data*0.0078;
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(temp);
lcd.setCursor(6,1);
lcd.print("degC");
if(temp>31){
digitalWrite(rled,HIGH);
digitalWrite(gled,LOW);
digitalWrite(bled,LOW);
}
else if (temp>28.5| temp<24){
digitalWrite(rled,HIGH);
digitalWrite(gled,HIGH);
digitalWrite(bled,LOW);
}
else{
digitalWrite(rled,LOW);
digitalWrite(gled,LOW);
digitalWrite(bled,HIGH);
}
delay(500);
}

完成品

 室温が28℃以下の部屋で、温度センサー部を指で温めて動作を確認します。

f:id:moutakusan:20200905231410g:plain
28.5℃以下から28.5℃以上
f:id:moutakusan:20200905231518g:plain
31℃以下から31℃以上

 動きました!温度によってLEDの色も変化してくれていますね。ただ、黄色がただの赤と緑になってますね。フルカラーLEDを初めて使ったんですが、上手く色が混ざらないものなんでしょうか?拡散板とか使えばいいのかなぁ。もしくは輝度調整?また次の機会にそこらへんは見ていくことにしましょう。

シェアして応援お願いします
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次