寒くなってきたので、先日入手したデジタル温度湿度センサAM2302(DHT22)を使って温度湿度計を作った。
(というか、寒くなってきたので温度湿度計を作りたくてセンサーを買った。)
先頭が’t’の時が温度で、’h’の時が湿度で、交互に表示する。
ただし、温度がマイナスの場合は’t’が’-‘(マイナス)になる。
スケッチはDHT22のテスト用スケッチを元に7セグへの表示部分を追加した。
7セグは4桁つながっているカソードコモンのモノ。
// Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 // what pin we're connected to // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor DHT dht(DHTPIN, DHTTYPE); void init7seg() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(A3, OUTPUT); digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 0); digitalWrite(A0, 1); digitalWrite(A1, 1); digitalWrite(A2, 1); digitalWrite(A3, 1); } void set7seg(int dig, char num, int dp) { if (dig == 0) { digitalWrite(A0, 1); digitalWrite(A1, 1); digitalWrite(A2, 1); digitalWrite(A3, 0); } else if (dig == 1) { digitalWrite(A0, 1); digitalWrite(A1, 1); digitalWrite(A2, 0); digitalWrite(A3, 1); } else if (dig == 2) { digitalWrite(A0, 1); digitalWrite(A1, 0); digitalWrite(A2, 1); digitalWrite(A3, 1); } else { digitalWrite(A0, 0); digitalWrite(A1, 1); digitalWrite(A2, 1); digitalWrite(A3, 1); } if (num == ' ') { digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 0); digitalWrite(11, 0); } else if (num == '-') { digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 0); digitalWrite(11, 1); } else if (num == '.') { digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 0); digitalWrite(11, 0); } else if (num == '0') { digitalWrite(5, 1); digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 0); } else if (num == '1') { digitalWrite(5, 0); digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 0); digitalWrite(11, 0); } else if (num == '2') { digitalWrite(5, 1); digitalWrite(6, 1); digitalWrite(7, 0); digitalWrite(8, 1); digitalWrite(9, 1); digitalWrite(10, 0); digitalWrite(11, 1); } else if (num == '3') { digitalWrite(5, 1); digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 0); digitalWrite(10, 0); digitalWrite(11, 1); } else if (num == '4') { digitalWrite(5, 0); digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 1); digitalWrite(11, 1); } else if (num == '5') { digitalWrite(5, 1); digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 0); digitalWrite(10, 1); digitalWrite(11, 1); } else if (num == '6') { digitalWrite(5, 1); digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 1); } else if (num == '7') { digitalWrite(5, 1); digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 1); digitalWrite(11, 0); } else if (num == '8') { digitalWrite(5, 1); digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 1); } else if (num == '9') { digitalWrite(5, 1); digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 0); digitalWrite(10, 1); digitalWrite(11, 1); } else if (num == 'E') { digitalWrite(5, 1); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 1); digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 1); } else if (num == 'H') { digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 0); digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 1); } else if (num == 'T') { digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 1); digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 1); /* } else if (num == '0') { digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0); digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 0); */ } digitalWrite(12, dp); } void msg7seg(const char *msg, int d) { int idx = 0, dig = 0; while (msg[idx] != '\0') { int dp = 0; if (msg[idx+1] == '.') { dp = 1; } set7seg(dig, msg[idx], dp); if (msg[idx+1] == '.') { idx++; } delay(d); idx++; dig++; } } void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); init7seg(); msg7seg(" ", 0); } void loop() { // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); float t = dht.readTemperature(); // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(t) || isnan(h)) { //Serial.println("Failed to read from DHT"); msg7seg("EEEE", 0); } else { /* Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); */ char buff[8]; dtostrf((double)t, 5, 1, buff); if (buff[0] == ' ') { buff[0] = 'T'; } for (int i = 0; i < 100; i++) { msg7seg(buff, 5); } dtostrf((double)h, 5, 1, buff); buff[0] = 'H'; for (int i = 0; i < 100; i++) { msg7seg(buff, 5); } } msg7seg(" ", 0); }
今はUSBの5Vで動いているけど、手を叩くと1分間だけ表示するとかして、電池で1シーズン動くくらいにしたい。
LCDにせず、7セグを使っているのは夜でも見れるように。