摘要:由于溫濕度傳感器對時間要求比較高,所以延時函數,我這邊采用的是大佬正點原子編寫的。根據時序圖可知應答信號為低電平,高電平。后續會逐步分塊更新,并會在最后一篇文章上傳源代碼。若是該文章對你有作用或是覺得文章寫得還行,幫忙點點贊,三連
? 根據 DHT11 溫濕度傳感器手冊
復位 DHT11 ,根據時序圖寫出設置 ``` void dht_Rst(void) { dht_output(); //設置 dht11 為普通推挽輸出 dht_low_input(); //設置 dht11 為低電平 delay_ms(20); //延時20ms 時間根據時序圖應該定義為18ms到30ms之間 dht_high_input(); //設置 dht11 為高電平 delay_us(30); //延時30us,少量延時,不易出錯 } ``` **==注意:==** 部分代碼為博主自己編寫的函數,都很==簡單!== 例如設置引腳模式,設置引腳高低電平等。由于溫濕度傳感器 DHT11 對時間要求比較高,**所以延時函數,我這邊采用的是==大佬正點原子編寫的==** 。
根據時序圖可知
應答信號為:低電平 83 us,高電平 87 us。
所以代碼編寫為:
``` u8 dht_Check(void) { u8 k = 0; //設置 參數 k,防止程序卡死 dht_input(); //定義 dht11 為輸入 while(dht_read_input && k < 100) //判斷是否有低電平輸入(dht11回應信號),或是 超出 83 us { k++; //延時等待 delay_us(1); } if(k >= 100 )return 1; //超時退出 else k = 0; while(!dht_read_input && k<100 ) //同理,87us 高電平退出while循環 { k++; delay_us(100); //延時等待 } if(k>=100)return 1; //超時退出 return 0; //成功監測應答信號,返回0 } ```
所以 DHT11 初始化代碼為:
u8 dht_Init(void) { dht_output(); dht_Rst(); return dht_Check(); }
由 DHT11手冊 可以得到,DHT11 會輸出40位數據
每位數據 格式如下圖所示:
所以每位數據獲取代碼為:
u8 dht_ReadBit(void) { u8 k = 0; //定義 參數k ,防止超時 while(dht_read_input && k<100) //一檢測出低電平跳出循環 或 超時跳出 { k++; delay_us(1); //延時等待 } k = 0; while(!dht_read_input && k<100) //一檢測出高電平跳出循環 或 超時跳出 { k++; delay_us(1); //延時等待 } delay_us(40); //這時候為剛檢測出高電平,由于數據格式 數據為 和數據位 只在高電平的時間不同,所以延時 40us ,如果還為高電平,則為 數據位 1 if(dht_read_input) return 1; else return 0; }
由于手冊下關于數據位描述為下圖:
可知:應該把代碼分為8位一組,并且先測出的為 高位
代碼為:
u8 dht_ReadByte(void){ u8 i,dat; dat = 0; for(i=0;i<8;i++) { dat<<=1; //數據左移 不夠補0 dat|=dht_ReadBit(); // | 字符 與0相或,結果為 后面的那個,即只取決于dht_ReadBit() 得到的數據 } return dat; //返回數據}
u8 dht_ReadData(u8 *t,u8 *h){ u8 temp[5]; //存放40位數據,每8位一組,總共5組 u8 i; dht_Rst(); //復位 DHT11,防止傳感器處在其他狀態 if(dht_Check() == 0) //判斷是否應答成功 { for(i=0;i<5;i++) { temp[i] = dht_ReadByte(); //取出數值 } if(temp[0]+temp[1]+temp[2]+temp[3] == temp[4]) //判斷檢驗和 { *h = temp[0]; //傳出參數,只傳整數值,0和2為整數值,1和3位小數值 *t = temp[2]; } }else return 1; return 0;}
? ?(1)初始化串口
GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能 USART1 GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出 //USART1_Tx USB Rx STM32中為 Tx,需要接到 USB轉TTL串口中的 Rx GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9; GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); //USART1_Rx USB Tx GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入 GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10; GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); USART_InitStrue.USART_BaudRate = 115200; USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStrue.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; USART_InitStrue.USART_Parity = USART_Parity_No; USART_InitStrue.USART_StopBits = USART_StopBits_1; USART_InitStrue.USART_WordLength = USART_WordLength_8b; USART_Init(USART1,&USART_InitStrue); USART_Cmd(USART1,ENABLE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;//設置中斷 NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //搶占優先級1 NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; //子優先級1 NVIC_Init(&NVIC_InitStrue);
?(2)中斷發送數據
void USART1_IRQHandler(void) { u8 s; while(*s!="/0") { while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET); USART_SendData(USART1,*s); s++; }}
?第一次嘗試編寫博客,若是有什么建議,歡迎批評指出。
?后續會逐步分塊更新,并會在最后一篇文章上傳源代碼。
?若是該文章對你有作用或是覺得文章寫得還行,幫忙點點贊,三連!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121370.html
摘要:溫濕度傳感器的對應轉的將溫濕度傳感器接入中,根據下圖提示,完成和溫濕度傳感器的連接。 4G DTU+MODBUS溫濕度傳感器+MQTT連接電信云 一、材料準備 二、...
摘要:向項目中添加名為的溫濕度傳感器模塊,選擇,驅動版本選擇最新版。使用溫濕度傳感器模塊的函數獲取當前濕度溫濕度模塊的函數用法如下設置光標到第二行第二個字符處打印和當前濕度使用函數每秒鐘重新檢測和顯示當前濕度。 showImg(https://segmentfault.com/img/bVC3uE?w=2552&h=1418); 誰將登場 LCD 模塊 溫濕度傳感器 你將學會 ...
摘要:但是我對此協議并不熟悉,本文便以測試為目的基于西門子模塊主站,采用通訊協議與溫濕度傳感器從站通訊獲取數據。 文章目錄 前言 一、前期準備 二、編寫通訊程序 1.通訊測試工具和軟件 2.編寫TIA Portal程序 三、基于OPC UA的通訊傳輸 總結 前言 最近作者在...
摘要:超簡單深度睡眠模式下遠程采集溫濕度信息項目背景相關技術深度睡眠模式溫濕度采集數據收發前后端實現后端前端項目背景自己用收納箱做了一個用于存放打印耗材的干燥箱,想用閑置的開發板和溫濕度傳感器做一個遠程溫濕度監測的小項目。 ...
摘要:三小結本次實驗在實現了溫濕度數據采集并通過串口顯示和利用屏數據顯示代碼的基礎上,完成屏顯示采集的溫濕度數據也并不復雜,其中,溫濕度數據采集的過程使用的是模擬,屏的數據顯示采用的是。 ...
閱讀 2609·2021-09-28 09:35
閱讀 3261·2021-09-03 10:28
閱讀 2905·2019-08-30 15:43
閱讀 1477·2019-08-30 14:04
閱讀 1799·2019-08-29 17:02
閱讀 1812·2019-08-26 13:59
閱讀 690·2019-08-26 11:51
閱讀 3251·2019-08-23 17:16