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を初めて使ったんですが、上手く色が混ざらないものなんでしょうか?拡散板とか使えばいいのかなぁ。もしくは輝度調整?また次の機会にそこらへんは見ていくことにしましょう。