DHT11數字溫濕度傳感器是一款溫濕度複合傳感器,數字模塊採集技術和溫濕度傳感技術,DHT11規格如下:
供電電壓:3.3〜5.5V
測量範圍:濕度20-90%RH
溫度0〜50℃
測量精度:濕度+ -5%RH
溫度+ -2℃分辨率:濕度 1%RH
溫度1℃長期穩定性:<±1%RH /年
DHT11接腳說明:
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資料
5. DHT11 bit為'0'
6. DHT11 bit為'1'
7. 整個通訊流程如下,
1. 實驗材料
STM32F103C8T6開發板*1
USB TO TTL*1
J-link*1
USB延長線*1
DHT11*1
線材*1
2. 電路接線
任意挑一個GPIO Port
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吹一口氣來觀察數據變化
留言列表