寒くなってきたので、先日入手したデジタル温度湿度センサ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セグを使っているのは夜でも見れるように。
