温度湿度計(仮組み)

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

カテゴリー: Arduino, センサー, 作ったモノ タグ: , , , , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください