const int DHpin = 2;
byte dat[4];
void setup()
{
pinMode(2, OUTPUT);
Serial.begin(9600); //设置串行每秒传输数据的速率(9600)
}
void loop()
{
DHT11_test();
show_data();
delay(500);
}
void show_data(){ //从 Arduino 串口监视器观察数据
Serial.print("Humdity: ");
Serial.print(dat[0], DEC);
Serial.print(".");
Serial.print(dat[1], DEC);
Serial.println("%");
Serial.print("\tTemperature: ");
Serial.print(dat[2], DEC);
Serial.print(".");
Serial.print(dat[3], DEC);
Serial.println(" C");
}
byte DHT11_read(){ //串口通讯,发送8位数据
byte data = 0;
for(int i=0; i<8; i++){
if( digitalRead(DHpin)==LOW ){
while( digitalRead(DHpin)==LOW );
delayMicroseconds(30); //高电平>30us为“1”,高电平<30us为“0”
if( digitalRead(DHpin)==HIGH )
data |= 1<<(7-i);
while( digitalRead(DHpin)==HIGH );
}
}
return data;
}
void DHT11_test(){
digitalWrite(DHpin, LOW); //拉低总线,发开始信号
delay(30); //【延时要大于18ms,以便 DHT11 检测开始信号】
digitalWrite(DHpin, HIGH);
delayMicroseconds(40); //拉高总线,等待 DHT11 响应
pinMode(DHpin, INPUT); //从 DHT11 中读取温湿度
while( digitalRead(DHpin)==HIGH );
delayMicroseconds(80); // DHT11 发出响应,拉低总线80us
while( digitalRead(DHpin)==LOW );
delayMicroseconds(80); // DHT11 拉高总线80us后开始发送数据
for(int i=0; i<4; i++) //接受温湿度数据【前湿度,后温度】
dat = DHT11_read();
pinMode(DHpin, OUTPUT);
digitalWrite(DHpin, HIGH); //发送完后释放总线,等待下一次开始信号
} |