DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC测温元件。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。
DHT11 的技术参数如下:
工作电压范围: 3.3V-5.5V
工作电流 :平均 0.5mA
输出:单总线数字信号
测量范围:湿度 20~90%RH,温度 0~50℃
精度 :湿度±5%,温度±2℃
分辨率 :湿度 1%,温度 1℃
误差比较大,测量范围较小,也就只能当个玩具了。
DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 5Byte( 40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。 DHT11 的数据格式为: 8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和。其中校验和数据为前四个字节相加。
程序采用mbed开发环境
引脚连接:
DHT11的Dout引脚接Nucleo板子Arduino插座的A0
DHT11读取函数:
- int ReadDHT11(void)
- {
- // IO must be in hi state to start
- if(WaitPinHigh(250) == ERROR_TIMEOUT)
- {
- return ERROR_BUS_BUSY;
- }
-
- // start the transfer
- pin.output();
- pin = 0;
- wait_ms(18);
-
- pin = 1;
- wait_us(30);
-
- pin.input();
-
- // wait till the sensor grabs the bus
- if(WaitPinLow(40) == ERROR_TIMEOUT)
- {
- return ERROR_NOT_PRESENT;
- }
-
- // sensor should signal low 80us and then hi 80us
- if(WaitPinHigh(100) == ERROR_TIMEOUT)
- {
- return ERROR_SYNC_TIMEOUT;
- }
- if(WaitPinLow(100) == ERROR_TIMEOUT)
- {
- return ERROR_NO_PATIENCE;
- }
-
- int i, bit;
- uint8_t buf[5];
-
- // capture the data(40 bit)
- for(i=0; i<5; i++)
- {
- buf[i] = 0;
-
- for(bit=0; bit<8; bit++)
- {
- if(WaitPinHigh(75) == ERROR_TIMEOUT)
- {
- return ERROR_DATA_TIMEOUT;
- }
-
- // logic 0 is 28us max, 1 is 70us
- wait_us(40);
- buf[i] |= pin << (7 - bit);
-
- if(WaitPinLow(50) == ERROR_TIMEOUT)
- {
- return ERROR_DATA_TIMEOUT;
- }
- }
- }
-
- for(i=0; i<5; i++)
- {
- printf("buf[%d] = 0x%02x\r\n", i, buf[i]);
- }
-
- // valid check
- if(buf[4] != buf[0] + buf[1] + buf[2] + buf[3])
- {
- return ERROR_CHECKSUM;
- }
-
- Temperature = float(buf[2]);
- Humidity = float(buf[0]);
-
- return SUCCESS;
- }
复制代码 主函数:
- int main(void)
- {
- int ret;
-
- printf("******This is a DHT11 Test******\r\n");
-
- for(;;)
- {
- ret = ReadDHT11();
-
- if(ret == SUCCESS)
- {
- printf("Temperature : %4.2f\r\n", Temperature);
- printf("Humidity : %4.2f\r\n\r\n", Humidity);
- }
- else
- {
- printf("Error : %d\n", ret);
- }
-
- wait(5);
- }
- }
复制代码
|
多谢分享