Action disabled: source

3.14 温湿度传感器 DHT11 实验

通过串行通讯,当主机向传感器发送请求时,输出口变输入口,向主机传送1byte数据。传送完毕后,输出口变输入口,再次等待主机发送请求。

读取 DHT11 温湿度传感器的值,然后发送给 PC 通过串口显示出来。

  • DHT11 是一款单总线的温湿度传感器
  1. 供电电压: 3.3~5.5V DC
  2. 输 出: 单总线数字信号
  3. 测量范围: 湿度 20-90%RH, 温度 0~50℃
  4. 测量精度: 湿度+-5%RH, 温度+-2℃
  5. 分 辨 率: 湿度 1%RH, 温度 1℃
  • 注意事项
  1. 避免在结露情况下使用
  2. 长期保存温度10-40℃,湿度60%以下
  3. 使用时电源和地接法要正确,以免损坏传感器
  • 实验装置套盒中提供三个引脚的温湿度传感器,如图所示

  • 连接的电路图如下,模块的“+”端接+5V 输出,“-”端接GND,“S”端接数字端口2 号引脚

  • 程序成功运行后,点击红圈内的按钮打开串口监视器观察串口中的返回数据

每700ms可以看到一组温度与湿度

int DHpin = 2;
byte dat[5];
byte read_data()
{
byte data;
for(int i=0; i<8; i++)
{
if(digitalRead(DHpin) == LOW)
{
while(digitalRead(DHpin) == LOW); //等待50us;
delayMicroseconds(30); //判断高电平的持续时间,以判定数据是‘0’还是‘1’;
if(digitalRead(DHpin) == HIGH)
data |= (1<<(7-i)); //高位在前,低位在后;
while(digitalRead(DHpin) == HIGH); //数据‘1’,等待下一位的接收;
}
}
return data;
}
void start_test()
{
digitalWrite(DHpin,LOW); //拉低总线,发开始信号;
delay(30); //延时要大于18ms,以便DHT11 能检测到开始信号;
digitalWrite(DHpin,HIGH);
delayMicroseconds(40); //等待DHT11 响应;
pinMode(DHpin,INPUT);
while(digitalRead(DHpin) == HIGH);
delayMicroseconds(80); //DHT11 发出响应,拉低总线80us;
if(digitalRead(DHpin) == LOW);
delayMicroseconds(80); //DHT11 拉高总线80us 后开始发送数据;
for(int i=0;i<4;i++) //接收温湿度数据,校验位不考虑;
dat[i] = read_data();
pinMode(DHpin,OUTPUT);
digitalWrite(DHpin,HIGH); //发送完一次数据后释放总线,等待主机的下一次始信号;
}
void setup()
{
Serial.begin(9600);
pinMode(DHpin,OUTPUT);
}
void loop()
{
start_test();
Serial.print("Current humdity = ");
Serial.print(dat[0], DEC); //显示湿度的整数位;
Serial.print('.');
Serial.print(dat[1],DEC); //显示湿度的小数位;
Serial.println('%');
Serial.print("Current temperature = ");
Serial.print(dat[2], DEC); //显示温度的整数位;
Serial.print('.');
Serial.print(dat[3],DEC); //显示温度的小数位;
Serial.println('C');
delay(700);
}
  • 3/3/14.txt
  • 最后更改: 2013/12/10 00:42
  • (外部编辑)