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℃以上 | 赤色 |
材料
- ProMicro互換機
- もちろんProMicroでもいいですしLeonardoでもいいです。
- 温度センサモジュール
- キャラクタLCDモジュール
- フルカラーLED
- 半固定抵抗
- 抵抗
- ジャンパーワイヤー
- ブレッドボード
回路
こんな感じです。
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値だけ計算して、適当に決めました。
配線
こんなんになりました。配線多くて見た目はいまいちだなぁ。
こちらの記事とかだと、ユニバーサル基板に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℃以下の部屋で、温度センサー部を指で温めて動作を確認します。
動きました!温度によってLEDの色も変化してくれていますね。ただ、黄色がただの赤と緑になってますね。フルカラーLEDを初めて使ったんですが、上手く色が混ざらないものなんでしょうか?拡散板とか使えばいいのかなぁ。もしくは輝度調整?また次の機会にそこらへんは見ていくことにしましょう。