目錄
1. DHT11簡介
1.1. 連接電路?
1.2. 串行接口 (單線雙向)
?2. cubeMX設(shè)置
3. 代碼開發(fā)
?3.1. 實現(xiàn)定時函數(shù)
3.2. 打開串口調(diào)試
3.4. 測試代碼實現(xiàn)
4. 運行效果
1. DHT11簡介
1.1. 連接電路?
信息如下:
建議連接線長度短于20米時用5K上拉電阻,大于20米時根據(jù)實際情況使
用合適的上拉電阻
?DHT11的供電電壓為 3-5.5V。傳感器上電后,要等待 1s 以越過不穩(wěn)定狀態(tài)在此
期間無需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個100nF 的電容,用以去
耦濾波。
1.2. 串行接口 (單線雙向)
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次
通訊時間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù)
部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下:
一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)
+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)
+8bit校驗和
數(shù)據(jù)傳送正確時校驗和數(shù)據(jù)等于“8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)
+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)”所得結(jié)果的末8位。
?
?
?
?2. cubeMX設(shè)置
- GPIOE,GPIO_PIN_6,作為DATA接口。推挽輸出,上拉電阻。
- 打開定時器TIM6。
- 開啟USART1。
3. 代碼開發(fā)
?3.1. 實現(xiàn)定時函數(shù)
time.c文件:
/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
void delay_us(uint16_t delayValue)
{
uint16_t delayCount=0;
HAL_TIM_Base_Start(&htim6);
__HAL_TIM_SetCounter(&htim6,delayCount);
while(delayCount<delayValue)
{
delayCount=__HAL_TIM_GetCounter(&htim6);
}
HAL_TIM_Base_Stop(&htim6);
}
void delay_ms(uint16_t delayValue)
{
for(int i=0;i<delayValue;i++)
{
delay_us(1000);
}
}
/* USER CODE END 1 */
3.2. 打開串口調(diào)試
?usart.h文件:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
?usart.c文件:
/* USER CODE BEGIN 1 */
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
return ch;
}
/* USER CODE END 1 */
3.3. 實現(xiàn)DHT11協(xié)議
gpio.h文件:
/* USER CODE BEGIN Private defines */
typedef enum
{
INPUT=0,OUTPUT
}IOMODE;
#define DHT_GPIO_H HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET)
#define DHT_GPIO_L HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET)
/* USER CODE END Private defines */
/* USER CODE BEGIN Prototypes */
_Bool readDht11(void);
/* USER CODE END Prototypes */
gpio.c文件:
/* USER CODE BEGIN 0 */
#include "tim.h"
#include <stdio.h>
#include "main.h"
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
uint8_t humiAndTemp[5];
_Bool status=1;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
void dht11IOMode(IOMODE ioMode)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6;
if(ioMode==INPUT)
{
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;
GPIO_InitStruct.Pull=GPIO_PULLUP;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}else if(ioMode==OUTPUT)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET);
GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull=GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
}
_Bool dht11Start(void)
{
dht11IOMode(OUTPUT);
DHT_GPIO_L;
delay_ms(20);
dht11IOMode(INPUT);
delay_us(30);
uint16_t count;
for(count=0;count<60;count++)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_RESET)
break;
delay_us(2);
}
if(count>=59)
{
LOG("dht11 start fail\n");
return 0;
}
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_SET);
return 1;
}
uint8_t readDht11Byte(void)
{
uint8_t value=0;
uint8_t count=0;
for(uint8_t i=0;i<8;i++)
{
value<<=1;
count=0;
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_RESET)
{
count++;
if(count>=35)
{
status=0;
return 0;
}
delay_us(2);
}
delay_us(38);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_SET)
{
value|=1;
}else{
value|=0;
}
count=0;
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_SET)
{
count++;
if(count>=35)
{
status=0;
return 0;
}
delay_us(2);
}
}
status=1;
return value;
}
_Bool readDht11(void)
{
uint8_t check_value=0;
if(dht11Start()==0)
{
LOG("dht11 start fail\n");
return 0;
}
for(uint8_t i=0;i<5;i++)
{
humiAndTemp[i]=readDht11Byte();
if(status==0)
{
LOG("humiAndTemp[%d] fail\n",i);
return 0;
}
status=1;
if(i!=4)
{
check_value+=humiAndTemp[i];
}
}
if(check_value==humiAndTemp[4])
{
LOG("check_value success,check_value:%d,humiAndTemp[4]:%d\n",check_value,humiAndTemp[4]);
return 1;
}else{
LOG("check_value fail,check_value:%d,humiAndTemp[4]:%d\n",check_value,humiAndTemp[4]);
return 0;
}
}
/* USER CODE END 2 */
3.4. 測試代碼實現(xiàn)
main.h文件:
/* USER CODE BEGIN Private defines */
#define OPENLOG
#ifdef OPENLOG
#define LOG(fmt, ...) printf("<%s:%s>:"fmt"\r\n", __FILE__, __FUNCTION__, ##__VA_ARGS__)
#else
#define LOG(fmt, ...)
#endif
/* USER CODE END Private defines */
main.c文件:
/* USER CODE BEGIN 2 */
HAL_Delay(1000);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("hello world\n");
if(readDht11())
{
printf("readDht11 success\n");
printf("humiAndTemp[0]:%d\n",humiAndTemp[0]);
printf("humiAndTemp[1]:%d\n",humiAndTemp[1]);
printf("humiAndTemp[2]:%d\n",humiAndTemp[2]);
printf("humiAndTemp[3]:%d\n",humiAndTemp[3]);
printf("humiAndTemp[4]:%d\n",humiAndTemp[4]);
uint16_t humi=(humiAndTemp[0]<<8) + humiAndTemp[1];
uint16_t temp=(humiAndTemp[2]<<8) + humiAndTemp[3];
printf("temp:%d.%d\n",temp>>8,temp&0xff);
printf("humi:%d.%d\n",humi>>8,humi&0xff);
}
else
{
printf("readDht11 fail\n");
}
delay_ms(5000);
/* USER CODE END WHILE */
}
4. 運行效果
文章來源:http://www.zghlxwxcb.cn/news/detail-415672.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-415672.html
到了這里,關(guān)于stm32連接DHT11溫濕度傳感器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!