国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【香橙派+DHT11】香橙派(全志H616)+ DHT11溫濕度傳感器的驅(qū)動(dòng)教程

這篇具有很好參考價(jià)值的文章主要介紹了【香橙派+DHT11】香橙派(全志H616)+ DHT11溫濕度傳感器的驅(qū)動(dòng)教程。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、前言

最近寫DHT11的代碼到香橙派(全志H616)上,發(fā)現(xiàn)網(wǎng)上案例基本上都是樹莓派+DHT11的居多,香橙派的少,少數(shù)找得到的代碼跑起來也是不穩(wěn)定或者數(shù)據(jù)相對不太準(zhǔn)確,于是這里自己寫了一篇,供大家參考和批評指正

產(chǎn)品概述


DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器,應(yīng)用領(lǐng)域:暖通 空調(diào);汽車;消費(fèi)品;氣象站;濕度調(diào)節(jié)器;除濕器;家電;醫(yī)療;自動(dòng)控制
dht11驅(qū)動(dòng),單片機(jī),單片機(jī),stm32,嵌入式硬件

特點(diǎn)
  • 相對濕度和溫度測量
  • 全部校準(zhǔn),數(shù)字輸出
  • 長期穩(wěn)定性
  • 超長的信號傳輸距離:20米
  • 超低能耗:休眠
  • 4 引腳安裝:可以買封裝好的
  • 完全互換 : 直接出結(jié)果,不用轉(zhuǎn)化
數(shù)據(jù)傳送邏輯

只有一根數(shù)據(jù)線DATA,主控MCU發(fā)送序列指令給DHT11模塊,模塊一次完整的數(shù)據(jù)傳輸為40bit,高位先出

數(shù)據(jù)格式

8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和

關(guān)于校驗(yàn):假設(shè)接收到的40位數(shù)據(jù)為:
dht11驅(qū)動(dòng),單片機(jī),單片機(jī),stm32,嵌入式硬件

計(jì)算:
0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 = 0101 0001(校驗(yàn)位)


DHT11通信時(shí)序

dht11驅(qū)動(dòng),單片機(jī),單片機(jī),stm32,嵌入式硬件

(1)主機(jī)發(fā)送起始信號
首先單片機(jī)將連接DHT11 DATA引腳的GPIO口輸出低電平,且低電平保持時(shí)間不能小于18ms (t1)最大不能超多30ms,然后拉高數(shù)據(jù)線20~40us (t2) ,等待讀取DHT11的響應(yīng)信號。

(2)檢測從機(jī)應(yīng)答信號
DHT11的DATA引腳檢測到外部信號有低電平(t1),并等待外部低電平信號結(jié)束(t2),延遲后DHT11的DATA引腳處于輸出狀態(tài),之后DHT11開始輸出80 us (t3)的低電平作為應(yīng)答信號,緊接著輸出80us(t4)的高電平通知主機(jī)準(zhǔn)備接收數(shù)據(jù)。
主機(jī)的I/O此時(shí)處于輸入狀態(tài),檢測I/O有低電平(DHT11應(yīng)答信號)后,等待80us的高電平后接受數(shù)據(jù)。

(3)數(shù)據(jù)傳輸
由DHT11的DATA引腳輸出40位數(shù)據(jù),采用高位優(yōu)先方式(MSB),微處理器根據(jù)I/0電平的變化接收40位數(shù)據(jù)。
位數(shù)據(jù)“0”的格式為:50微秒的低電平和26-28us的高電平。
位數(shù)據(jù)“1”的格式為:50微秒的低電平加70us的高電平。


二、代碼


主體代碼主要是利用多線程,用戶每發(fā)送一次數(shù)據(jù)讀取請求,創(chuàng)建一個(gè)線程用于讀取數(shù)據(jù);利于提高代碼的健壯性和擴(kuò)展性;

同時(shí)引入一個(gè)blockFlag的標(biāo)志位,避免子線程代碼跑飛無法退出的問題;

并且在測試過程中發(fā)現(xiàn)有偶爾測試出溫度明顯錯(cuò)誤的數(shù)據(jù);考慮到可能是由于環(huán)境、傳感器、延時(shí)誤差等原因?qū)е碌臄?shù)據(jù)不準(zhǔn)確問題,所以程序中會(huì)將超過50°C的數(shù)據(jù)視為無效數(shù)據(jù),自行重新測試,最多自行重試5次

GPIO初始化

因?yàn)榘l(fā)送給DHT11的起始信號是先拉低電平,所以拉低電平前先維持一個(gè)穩(wěn)定的高電平狀態(tài)

void GPIO_init(int gpio_pin)
{
    pinMode(gpio_pin, OUTPUT); // set mode to output
    digitalWrite(gpio_pin, 1); // output a high level
    delay(1000);
}
起始信號

因?yàn)镈HT11的觸發(fā)是單次的,即每發(fā)送一次起始信號,才會(huì)檢查一次溫濕度,所以發(fā)送起始信號的代碼必然是要多次復(fù)用,所以這里也封裝成一個(gè)函數(shù)

void DHT11_Start_Sig()
{
	pinMode(pinNumber,OUTPUT);	//讓GPIO為輸出模式
	digitalWrite(pinNumber,HIGH);
	digitalWrite(pinNumber,LOW);
	delay(25);	//維持25ms的低電平
	digitalWrite(pinNumber,HIGH);	//轉(zhuǎn)化為高電平,等待DHT11的響應(yīng)信號
	
	pinMode(pinNumber,INPUT);
	//響應(yīng)信號為80us電平與80us的準(zhǔn)備信號
	
	pullUpDnControl(pinNumber,PUD_UP);	//進(jìn)行上拉,增加穩(wěn)定性,非必選
	delayMicroseconds(35);	//維持35微秒
}
讀取數(shù)據(jù)
void* readSensorData(void *arg)
{
    uint8 crc; 	
    uint8 i;	
	int attempt = 5;	//調(diào)用一次最多嘗試測5次
	
	while(attempt)
	{
		databuf = 0;	//清空數(shù)據(jù)存儲buf
		crc = 0;		//清空校驗(yàn)位數(shù)據(jù)存儲buf
		DHT11_Start_Sig();	
        
	    if(digitalRead(pinNumber)==0) //檢測DHT11是否應(yīng)答,應(yīng)答則繼續(xù)下一步
	    {
	      while(!digitalRead(pinNumber)); //wait to high
          
          //讀取4個(gè)數(shù)據(jù),合計(jì)32位
	      for(i=0;i<32;i++)
	      {
		       while(digitalRead(pinNumber)); //data clock start
		       while(!digitalRead(pinNumber)); //data start
	           delayMicroseconds(HIGH_TIME);	//如果32微秒后,仍然檢測到是高電平,則該數(shù)據(jù)位為1
	           databuf*=2;		//移位到buf的更高位
	           if(digitalRead(pinNumber)==1) //1
	            {
	                databuf++;
	            }
	      }
          //讀取校驗(yàn)位
	      for(i=0;i<8;i++)
	      {
			  	while(digitalRead(pinNumber)); //data clock start
			    while(!digitalRead(pinNumber)); //data start
		        delayMicroseconds(HIGH_TIME);
		        crc*=2;  
		        if(digitalRead(pinNumber)==1) //1
		        {
		           crc++;
		        }
	      }
          
		  //用于校驗(yàn)數(shù)據(jù)的準(zhǔn)確性,當(dāng)溫度大于50時(shí),視為無效數(shù)據(jù)
	  	  if(((databuf>>8)&0xff) > 50)
		  {
			 attempt--;
			 delay(500);	//不加這段延遲,下一次傳感器來不及響應(yīng)
			 continue;
		  }	
		  else
		  {
            //打印數(shù)據(jù)
		  	printf("Congratulations ! Sensor data read ok!\n");
	       	printf("RH:%lu.%lu\n",(databuf>>24)&0xff,(databuf>>16)&0xff); 
	       	printf("TMP:%lu.%lu\n",(databuf>>8)&0xff,databuf&0xff);
			blockFlag = 0;	//用來避免程序有時(shí)候跑飛,卡在此函數(shù)中,無法跳出
			return (void*)1;
		  }
	   }
	   else		//dht not answer
	   {
	   		blockFlag = 0;
	   		printf("Sorry! Sensor dosent ans!\n");
	        return (void*)0;
	   }
	}
    
    //如果代碼執(zhí)行到這里,則證明嘗試讀取了5次數(shù)據(jù),都是不準(zhǔn)確的數(shù)據(jù)
	blockFlag = 0;
	printf("get data fail\n");
	return (void*)2;
}
整體代碼
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include "contrlDevices.h"

typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef unsigned long uint32;
 
#define HIGH_TIME 32
 
int pinNumber = 6;  //use gpio1 to read data
uint32 databuf;
int blockFlag;


void GPIO_init(int gpio_pin)
{
    pinMode(gpio_pin, OUTPUT); // set mode to output
    digitalWrite(gpio_pin, 1); // output a high level
    delay(1000);
    //return;
}


void DHT11_Start_Sig()
{
	pinMode(pinNumber,OUTPUT);
	digitalWrite(pinNumber,HIGH);
	digitalWrite(pinNumber,LOW);
	delay(25);
	digitalWrite(pinNumber,HIGH);
	
	pinMode(pinNumber,INPUT);
	//響應(yīng)信號為80us電平與80us的準(zhǔn)備信號
	
	pullUpDnControl(pinNumber,PUD_UP);
	delayMicroseconds(35);
}
 
 
void* readSensorData(void *arg)
{
    uint8 crc; 	
    uint8 i;	
	int attempt = 5;	//調(diào)用一次最多嘗試測5次
	
	while(attempt)
	{
		databuf = 0;	//清空數(shù)據(jù)存儲buf
		crc = 0;		//清空校驗(yàn)位數(shù)據(jù)存儲buf
		DHT11_Start_Sig();	
        
	    if(digitalRead(pinNumber)==0) //檢測DHT11是否應(yīng)答,應(yīng)答則繼續(xù)下一步
	    {
	      while(!digitalRead(pinNumber)); //wait to high
          
          //讀取4個(gè)數(shù)據(jù),合計(jì)32位
	      for(i=0;i<32;i++)
	      {
		       while(digitalRead(pinNumber)); //data clock start
		       while(!digitalRead(pinNumber)); //data start
	           delayMicroseconds(HIGH_TIME);	//如果32微秒后,仍然檢測到是高電平,則該數(shù)據(jù)位為1
	           databuf*=2;		//移位到buf的更高位
	           if(digitalRead(pinNumber)==1) //1
	            {
	                databuf++;
	            }
	      }
          //讀取校驗(yàn)位
	      for(i=0;i<8;i++)
	      {
			  	while(digitalRead(pinNumber)); //data clock start
			    while(!digitalRead(pinNumber)); //data start
		        delayMicroseconds(HIGH_TIME);
		        crc*=2;  
		        if(digitalRead(pinNumber)==1) //1
		        {
		           crc++;
		        }
	      }
          
		  //用于校驗(yàn)數(shù)據(jù)的準(zhǔn)確性,當(dāng)溫度大于50時(shí),視為無效數(shù)據(jù)
	  	  if(((databuf>>8)&0xff) > 50)
		  {
			 attempt--;
			 delay(500);	//不加這段延遲,下一次傳感器來不及響應(yīng)
			 continue;
		  }	
		  else
		  {
            //打印數(shù)據(jù)
		  	printf("Congratulations ! Sensor data read ok!\n");
	       	printf("RH:%lu.%lu\n",(databuf>>24)&0xff,(databuf>>16)&0xff); 
	       	printf("TMP:%lu.%lu\n",(databuf>>8)&0xff,databuf&0xff);
			blockFlag = 0;	//用來避免程序有時(shí)候跑飛,卡在此函數(shù)中,無法跳出
			return (void*)1;
		  }
	   }
	   else		//dht not answer
	   {
	   		blockFlag = 0;
	   		printf("Sorry! Sensor dosent ans!\n");
	        return (void*)0;
	   }
	}
    
    //如果代碼執(zhí)行到這里,則證明嘗試讀取了5次數(shù)據(jù),都是不準(zhǔn)確的數(shù)據(jù)
	blockFlag = 0;
	printf("get data fail\n");
	return (void*)2;
}
 
int main ()
{

	pthread_t tid;
	int waitTimes = 10;
	char cmd[5] = {'\0'};
	
    if (wiringPiSetup() == -1) 
    {
    	printf("Setup wiringPi failed!");
    	return 1;
  	}
  	printf("Enter OS-------\n");
  
    while(1)
    {
     	waitTimes = 10;		
        blockFlag = 1;
        delay(1000);
        printf("input y\n");
        scanf("%s",cmd);
        getchar();
        if(strcmp(cmd,"y") == 0)
        {
            //創(chuàng)建一個(gè)線程用于讀取傳感器數(shù)據(jù);
            //嚴(yán)謹(jǐn)來說此處的tid并發(fā)時(shí)有bug;讀者可以自行優(yōu)化,可以用互斥鎖或者tid設(shè)為數(shù)組等都行
            //就當(dāng)作留給讀者的一個(gè)小作業(yè)吧
            if (pthread_create(&tid, NULL, readSensorData, NULL) != 0)
            {
                printf("thread create fail!\n");
                return -1;
            }
            
            //等待數(shù)據(jù)讀取線程10s鐘,如果10后blockFlag未置0,則說明讀數(shù)據(jù)時(shí)跑飛卡住了
            while(waitTimes && blockFlag)
            {
                delay(1000);
                waitTimes--;
            }
            //強(qiáng)行結(jié)束跑飛的線程
            if(blockFlag == 1)
            {
                pthread_cancel(tid);
                printf("線程超時(shí)退出.....\n");
            }
        }
        else
        {
            printf("go on\n");
            continue;
        }
    }
    return 0;
}


執(zhí)行結(jié)果

dht11驅(qū)動(dòng),單片機(jī),單片機(jī),stm32,嵌入式硬件


參考文章:
STM32一線協(xié)議-DHT11溫濕度傳感器采樣實(shí)現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-668280.html

到了這里,關(guān)于【香橙派+DHT11】香橙派(全志H616)+ DHT11溫濕度傳感器的驅(qū)動(dòng)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32+DHT11溫濕度傳感器

    STM32+DHT11溫濕度傳感器

    DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次 通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù) 部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下: 一次完整的數(shù)據(jù)傳輸為40bit,高位先出。 數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)

    2023年04月13日
    瀏覽(90)
  • STM32--DHT11溫濕度傳感器

    STM32--DHT11溫濕度傳感器

    本文介紹基于STM32F103實(shí)現(xiàn)的DHT11溫濕度傳感器數(shù)據(jù)采集及顯示,完整代碼見文末鏈接 一、DHT11傳感器簡介 DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期

    2024年02月16日
    瀏覽(94)
  • STM32—DHT11溫濕度傳感器

    STM32—DHT11溫濕度傳感器

    (1).下圖一是DHT11總的時(shí)序圖。 (2).圖二對應(yīng)圖一的左邊黑色部分,圖三對應(yīng)圖一的綠色部分,圖四的左部分圖對應(yīng)圖一的紅色部分,圖四的右部分對應(yīng)圖一的黃色部分。 (3).首先圖二部分是單片機(jī)向DHT11發(fā)送我要開始的信號,此時(shí)單片機(jī)IO口處于輸出模式,輸出低電平至少18MS,

    2024年02月19日
    瀏覽(90)
  • FPGA—DHT11數(shù)字溫濕度傳感器

    FPGA—DHT11數(shù)字溫濕度傳感器

    目錄 1. 理論學(xué)習(xí) 2.實(shí)操 2.1 頂層模塊 2.1.1 整體模塊框圖 2.1.2 頂層代碼 2.2?DHT11 控制模塊 2.2.1 模塊框圖 2.2.2 狀態(tài)轉(zhuǎn)換圖繪制 2.2.3?波形圖繪制 2.2.4?RTL代碼 2.3?上板驗(yàn)證 3. 總結(jié) DHT11簡介 ? ? ? ?DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)

    2024年02月06日
    瀏覽(495)
  • 51單片機(jī)(DHT11溫濕度傳感器)

    51單片機(jī)(DHT11溫濕度傳感器)

    DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器,應(yīng)用領(lǐng)域:暖通 空調(diào);汽車;消費(fèi)品;氣象站;濕度調(diào)節(jié)器;除濕器;家電;醫(yī)療;自動(dòng)控制 相對濕度和溫度測量 全部校準(zhǔn),數(shù)字輸出 長期穩(wěn)定性 超長的信號傳輸距離:20米 超低能耗:休眠 4 引腳

    2024年02月02日
    瀏覽(87)
  • stm32連接DHT11溫濕度傳感器

    stm32連接DHT11溫濕度傳感器

    目錄 1. DHT11簡介 1.1. 連接電路? 1.2. 串行接口 (單線雙向) ?2. cubeMX設(shè)置 3. 代碼開發(fā) ?3.1. 實(shí)現(xiàn)定時(shí)函數(shù) 3.2. 打開串口調(diào)試 3.4. 測試代碼實(shí)現(xiàn) 4. 運(yùn)行效果 信息如下: 建議連接線長度短于20米時(shí)用5K上拉電阻,大于20米時(shí)根據(jù)實(shí)際情況使 用合適的上拉電阻 ?DHT11的供電電壓為 3-5

    2023年04月16日
    瀏覽(93)
  • FPGA project : dht11 溫濕度傳感器

    FPGA project : dht11 溫濕度傳感器

    沒有硬件,過幾天上板測試。 ? ? ? ?其他模塊都是之前的,就不發(fā)了。 ? ?

    2024年02月08日
    瀏覽(101)
  • FPGA讀取DHT11數(shù)字溫濕度傳感器

    FPGA讀取DHT11數(shù)字溫濕度傳感器

    最近在做一個(gè)DHT11相關(guān)的東西,寫了一個(gè)DHT11控制模塊。參考了正點(diǎn)原子和野火電子的文檔資料后總覺得又亂又雜,所以自己跟著數(shù)據(jù)手冊寫了一遍,當(dāng)然了也很感謝正點(diǎn)原子和野火文檔的幫助。 DHT11是一種數(shù)字溫濕度傳感器,有4個(gè)引腳但只有三個(gè)有效引腳,分別是VDD,DATA和

    2024年02月05日
    瀏覽(99)
  • stm32讀取DHT11溫濕度傳感器

    stm32讀取DHT11溫濕度傳感器

    我們知道DHT11是單總線協(xié)議,只有一根數(shù)據(jù)線。 且內(nèi)部有個(gè)上拉電路(下圖)。那么數(shù)據(jù)線默認(rèn)就是高電平那接下來就可以講解主機(jī)如何和DHT11通訊的 讀取DHT11的芯片手冊,可以知道,DHT11一次完成的數(shù)據(jù)輸出是40bit,高位先出。 格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù) +8bi溫

    2024年02月09日
    瀏覽(94)
  • DHT11溫濕度傳感器(配合樹莓派使用)

    DHT11溫濕度傳感器(配合樹莓派使用)

    DHT11是一種數(shù)字溫濕度傳感器,可以測量周圍環(huán)境的溫度和相對濕度。該傳感器使用單個(gè)數(shù)字信號線與微控制器通信,具有較高的可靠性和穩(wěn)定性。它適用于許多應(yīng)用領(lǐng)域,如氣象觀測、室內(nèi)環(huán)境監(jiān)測、工業(yè)控制等。 DHT11傳感器使用的基本原理是通過感應(yīng)元件測量周圍環(huán)境的

    2024年02月06日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包