DHT11是一种数字温湿度传感器,可以通过单一的总线线路实时测量湿度和温度。它使用了一个CRC校验和的32位单总线数字信号来实现通讯。
DHT11运作时,需要的电源电压为3V~5.5V,输出的电平为3.3V左右,具有较高的测量精度和快速的反应时间。
可能的原因有很多,以下列举几个最常见的因素:
(1)传输方式错误:DHT11的数据传输采用单总线数字信号,如果传输方式不对,将无法读取到正确的数据。
(2)接口未连接好:如果缺失或不正确地连接了传感器,就无法从其读取到精确的数据。
(3)程序编写错误:编写的程序中存在漏洞,如语法错误,变量名拼写错误等。
以下是几个解决问题的方法:
(1)检查程序:若程序因编写错误或语法错误而无法读取到值,则需要重新检查编码并进行修复。
(2)检查接口:保持电路接线正确并检查传感器和计算机之间的连接是否牢固无误。另外,还应该检查如下方面:
① 接线是否正确:通过确认接线方式与示例代码中的接线方式是否相同,来检查所使用的连接方式是否正确;
② 结束线匹配:确认结束电阻和电容是否合适。非法的电容和终止电阻可能导致传感器无法响应;
③ 连接稳定性:确认连接方式和稳定性是否正确,特别是对于I/O口电平是否稳定。
(3)切换传输方式:从使用单总线数字信号到使用不同的方法进行数据传输。
以下示例代码可用于在32程序中读取温湿度传感器DHT11数据:
```
#define DHT11_PIN 2
int dht11_dat[5] = {0, 0, 0, 0, 0};
void read_dht11_dat()
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
float f;
pinMode(DHT11_PIN, OUTPUT);
digitalWrite(DHT11_PIN, LOW);
delay(18);
digitalWrite(DHT11_PIN, HIGH);
delayMicroseconds(40);
pinMode(DHT11_PIN, INPUT);
for (i = 0; i < 85; i++)
{
counter = 0;
while (digitalRead(DHT11_PIN) == laststate)
{
counter++;
delayMicroseconds(1);
if (counter == 255)
{
break;
}
}
laststate = digitalRead(DHT11_PIN);
if (counter == 255)
break;
if ((i >= 4) && (i % 2 == 0))
{
dht11_dat[j / 8] <<= 1;
if (counter > 30)
dht11_dat[j / 8] |= 1;
j++;
}
}
if ((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF)))
{
f = dht11_dat[2] * 9.0 / 5.0 + 32;
Serial.print("Humidity = ");
Serial.print(dht11_dat[0], DEC);
Serial.print(".");
Serial.print(dht11_dat[1], DEC);
Serial.print("% ");
Serial.print("Temperature = ");
Serial.print(dht11_dat[2], DEC);
Serial.print(".");
Serial.print(dht11_dat[3], DEC);
Serial.print("C ");
Serial.print(f);
Serial.print("F");
}
delay(1000);
void setup()
Serial.begin(9600);
Serial.println("DHT11 Humidity & temperature Sensor\n\n");
void loop()
read_dht11_dat();
```
以上程序所用的传输方式为单总线数字信号,可简单易行地读取到温湿度传感器的数据。