つくったブログ

ぼくがつくったもの。

DHT11と4桁7セグLEDを用いた温湿度計(arduino)

できたよ。

http://instagram.com/p/rqKo15rLuc/
やっとできた。

つなぎ方

http://instagram.com/p/rqIeCgrLrH/
こんなかんじでつなぎます。

コード

/*********************************************************************
Temperature and Humidity sensor 

*********************************************************************/
/*
Copyright (c) 2012-2014 Wataru KUNINO
http://www.geocities.jp/bokunimowakaru/
参考:
DHT11:http://www.geocities.jp/bokunimowakaru/
7segLED:http://happy-arduino.blogspot.jp/2012/08/17_27.html
        http://cranberrytree.blogspot.jp/2013/05/arduino47led.html
        http://garretlab.web.fc2.com/arduino/introduction/beginning_with_7segment_led/
*/

#define DHTport			17			// DHT_DATAポート番号(ANALOG 3)
#define SD_CS			10			// SDカードCS端子(デフォルト=10)
#include <MsTimer2.h>
const static byte DHTtype=	11;		// AM2302時はDHT=22にする
									// (#ifdefが使えないかった)
//---
const int anode_pins[] = {9,8,11,3,4,5,6,7};    // アノードに接続するArduinoのピン
const int led_4pins[] = {2,12,13,10};
int state=0;
int state_1111[] = {0,0,0,0};
float hum=0.0,temp=0.0;
	byte dht11_dat[5];
	byte dht11_check_sum;
	byte i;
	char Str[16];
//----
// DHT TSシーケンス
byte DHTTSSeq(void) {
	byte dht11_in;
	// start condition
	// 1. pull-down i/o pin from 18ms
	digitalWrite(DHTport, LOW);
	pinMode(DHTport,OUTPUT);
	delay(200);
	pinMode(DHTport,INPUT);
	delayMicroseconds(20+40);	// High 20us + Slave ACK 80us/2

	dht11_in = digitalRead(DHTport);	// 正常時 = LOW
	if(dht11_in){
		Serial.println("dht start condition 1 not met");
		return(1);
	}
	delayMicroseconds(80);
	dht11_in = digitalRead(DHTport);	// 正常時 = HIGH
	if(!dht11_in){
		Serial.println("dht start condition 2 not met");
		return(1);
	}
	while( digitalRead(DHTport) );		// LOW待ち
	return(0);
}

// DHTデータ受信
byte read_dht11_dat(){
	byte i = 0;
	byte result=0;
	for(i=0; i< 8; i++){
		while( !digitalRead(DHTport) ); // High待ち
		delayMicroseconds(49);			// 28us or 70us 
		if( digitalRead(DHTport) ){
			result |=(1<<(7-i));
			while( digitalRead(DHTport) ); // wait '1' finish
		}
	}
	return result;
}

// DHT ACK
void DHT_ACK(void) {
	while( digitalRead(DHTport) ){
	delayMicroseconds(50);
    }
}

void setup() {
  //1~8番ピン デジタル出力へセット
        for (int i=0; i<=7; i++){
          pinMode(anode_pins[i],OUTPUT);
        }
        for (int i=0; i<=3; i++){
          pinMode(led_4pins[i],OUTPUT);
        }
        pinMode(DHTport,INPUT);
        Serial.begin(9600);	
        Serial.print("DHT");
        Serial.println(DHTtype,DEC);
        MsTimer2::set(15,led_start);
}

// 7segLED---
//LEDレイアウトを定義
boolean Num_Array[11][8]={
        {1,1,1,0,1,0,1,1},{0,0,1,0,1,0,0,0},{1,0,1,1,0,0,1,1},{1,0,1,1,1,0,1,0},
        {0,1,1,1,1,0,0,0},{1,1,0,1,1,0,1,0},{1,1,0,1,1,0,1,1},{1,1,1,0,1,0,0,0},
        {1,1,1,1,1,0,1,1},{1,1,1,1,1,0,1,0},{0,0,0,0,1,0,0}
};
boolean led_Array[4][4]={
        {0,1,1,1},{1,0,1,1},{1,1,0,1},{1,1,1,0}
};
//LED表示関数を定義

void NumPrint(int Number){
        for (int w=0; w<=7; w++){        
        digitalWrite(anode_pins[w],Num_Array[Number][w]);
        }
}

void led_start(){
        for (int j=0;j<4;j++){
          for (i=0;i<4;i++){
           digitalWrite(led_4pins[i],led_Array[j][i]); 
          }
          NumPrint(state_1111[j]);
          delayMicroseconds(1000);
        }
         digitalWrite(led_4pins[3],1);
}
// 7segLED---

void loop() {
	DHTTSSeq();
	for (i=0; i<5; i++) dht11_dat[i] = read_dht11_dat();
	DHT_ACK();
	dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
	if(dht11_dat[4]!= dht11_check_sum){
		Serial.println("DHT11 checksum error");
	}
	/* 表示 */

        temp =  (float)dht11_dat[2];
        
	Serial.print("DHT TEMP = ");
	Serial.print( temp , 1 );
	Serial.print(" degC\n");

	hum =  (float)dht11_dat[0]; 
	Serial.print("DHT HUM  = ");
	Serial.print( hum , 1 );
	Serial.print(" %\n");

        int th[]={temp,hum};
        for (int k=0;k<2;k++){
           state=(int)th[k]%10000;
           state_1111[0]= (state) % 10; 
           state_1111[1]= state /10 % 10;
           state_1111[2] = state /100 % 10;
           state_1111[3]= state /1000 % 10;
           MsTimer2::start();
           delay(1000);
           MsTimer2::stop(); 
           delay(1000);
        }
          
}
  • DHT11の処理方法は以下のサイトを参考にしました。

Arduino温湿度測定ロガー・湿度センサーの比較 by ボクにもわかる地上デジタル

  • 割り込みを使って、温度と湿度を交互に表示しています。
  • あとでプログラムの整理をしようかな。→整理しました。

うごくよ。


#arduino temperature and humidity sensor

こんな感じ。

おわりに

次はプログラムの解説をします。


FabLife ―デジタルファブリケーションから生まれる「つくりかたの未来」 (Make: Japan Books)

FabLife ―デジタルファブリケーションから生まれる「つくりかたの未来」 (Make: Japan Books)