close

ST_logo_20130425.png

DHT11數字溫濕度傳感器是一款溫濕度複合傳感器,數字模塊採集技術和溫濕度傳感技術,DHT11規格如下:

供電電壓:3.3〜5.5V

測量範圍:濕度20-90%RH

溫度0〜50℃

測量精度:濕度+ -5%RH

溫度+ -2℃分辨率:濕度 1%RH

溫度1℃長期穩定性:<±1%RH /年

DHT11接腳說明:

686607399.jpg

DHT11通訊介紹

1. Single-bus data格式用於MCU和DHT11傳感器之間的通信和同步。 一個通信過程大約是4ms。

2. 數據由小數和整數部分組成。 完整的數據傳輸是40 bit,傳感器首先發送更高的數據位。

3. 數據格式: 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data + 8bit check sum

4. MCU端發送命令

MCU GPIO send high -> MCU GPIO send low(18ms) -> MCU GPIO send high(20 - 40us) -> MCU GPIO 從output轉input -> 等待160us -> 開始接收DHT11資料

7.JPG

5. DHT11 bit為'0'

8.JPG

6. DHT11 bit為'1'

9.JPG

7. 整個通訊流程如下,

11.JPG

1. 實驗材料

STM32F103C8T6開發板*1

20181027_181027_0001.jpg

USB TO TTL*1

20181015_181015_0003.jpg

J-link*1

20181027_181027_0002.jpg

USB延長線*1

20181015_181015_0001.jpg

DHT11*1

408250.jpg

線材*1

402985.jpg

2. 電路接線

任意挑一個GPIO Port

6.JPG

3. 程式撰寫

STM32F103_Configuratio裡

gpio_config.c

#include "gpio_config.h"

/*
程式名稱:LED配置初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/7
程式修改日期:N/A
程式說明:

*/
void LED_ConfigInit(void){         
  GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);    

  GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}

/*
程式名稱:One Wire Output配置初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/7
程式修改日期:N/A
程式說明:

*/
void OneWire_Output_ConfigInit(void){         
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);    

  GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

/*
程式名稱:One Wire Input配置初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/7
程式修改日期:N/A
程式說明:

*/
void OneWire_Input_ConfigInit(void){         
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
  GPIO_Init(GPIOB, &GPIO_InitStructure);    
    
        GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

gpio_config.h

#ifndef __GPIO_CONFIG_H
#define __GPIO_CONFIG_H

#include "main.h"

/* LED初始化 */
void LED_ConfigInit(void);
/* One Wire Output配置初始化 */
void OneWire_Output_ConfigInit(void);
/* One Wire Input配置初始化 */
void OneWire_Input_ConfigInit(void);

#endif 

ExtDevices_Configuration裡

dht11.c

/* 結構變數DHT11 */
_DHT11_Type DHT11;
/* 結構指標*DHT11_Ptr */
_DHT11_Type *DHT11_Ptr=&DHT11;

/*
程式名稱:DHT11初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/7
程式修改日期:N/A
程式說明:

*/
void DHT11_Init(void){
    /* One Wire Output配置初始化 */
    OneWire_Output_ConfigInit();
}

/*
程式名稱:DHT11命令讀取
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/7
程式修改日期:N/A
程式說明:

*/
uint32_t DHT11_Read(void){
    uint8_t bitCount=31;
    uint16_t DHT11_Count=0;
    uint32_t byte=0;
    
    GPIO_SetBits(GPIOB, GPIO_Pin_12);
    delay_ms(1);
    /* MCU Sends out Start Sigal */
    GPIO_ResetBits(GPIOB, GPIO_Pin_12);
    delay_ms(18);
    /* MCU pulls up voltage and waits for DHT response */
    GPIO_SetBits(GPIOB, GPIO_Pin_12);
    delay_us(30);
    /* One Wire Input配置初始化 */
    OneWire_Input_ConfigInit();
    delay_us(159);
    
    /* start to transmit */
    while(bitCount>0){
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0) {
            if(DHT11_Count>=65){
                byte |= 1<<bitCount--;
            }else if(DHT11_Count>20 && DHT11_Count<=28){
                byte |= 0<<bitCount--;
            }
            DHT11_Count = 0;
        }else if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1){
            DHT11_Count++;
        }
    }
    DHT11_Count = 0;
    /* One Wire Output配置初始化 */
    OneWire_Output_ConfigInit();
    GPIO_SetBits(GPIOB, GPIO_Pin_12);
    
    return byte;
}

/*
程式名稱:DHT11濕度與溫度顯示
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/7
程式修改日期:N/A
程式說明:

*/
void DHT11_Display(void){

    DH11_Display = DHT11_Read();
    ......
}

dht11.h

#ifndef __DHT11_H
#define __DHT11_H

#include "main.h"

/*
程式名稱:DHT11全域變數
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/06/23
程式修改日期:N/A
程式說明:

*/
typedef struct
{
    uint8_t hum[7];
    uint8_t temp[7];
    uint16_t humLength;
    uint16_t tempLength;
}_DHT11_Type;
/* 結構變數DHT11 */
extern _DHT11_Type DHT11;
/* 結構指標*DHT11_Ptr */
extern _DHT11_Type *DHT11_Ptr;

/* DHT11初始化 */
void DHT11_Init(void);
/* DHT11命令讀取 */
uint32_t DHT11_Read(void);
/* DHT11濕度與溫度顯示 */
void DHT11_Display(void);

#endif 

4. 實驗結果

對DHT11吹一口氣來觀察數據變化

10.JPG

arrow
arrow

    鄭智遠 發表在 痞客邦 留言(0) 人氣()