<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Openwrt開發指南 第28章 DHT11 溫濕度傳感器

嵌入式大雜燴 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-07-15 16:18 ? 次閱讀

開發環境:

主機:Ubuntu12.04

開發板:RT5350

Openwrt:Openwrt15.05

1 硬件原理

下圖是我們溫度傳感器的接入引腳,3.3V 供電,io 口接 P13 的 GP0( GPIO0 的簡稱 )。DHT11數字溫濕度傳感器 是一款含有已校準數字信號輸出的溫濕度復合傳感器,它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性和卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能 8 位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11 傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式存在OTP內存中,傳感器內部在檢測型號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,使其成為該類應用中,在苛刻應用場合的最佳選擇。

2 DHT11 相關時序

  • 初始化(復位)時序圖

1.png

  1. 控制器首先至少拉低 18ms,然后拉高 20-40us 后等待 DHT11 的應答
  2. 當 DHT11 檢測到信號后,首先將總線拉低約 80us 然后在拉高 80us 作為應答信號。
  • 讀取數據時序圖

2.png

  • 表示 0 的時序如下

3.png

  • 表示 1 的時序如下

4.png

  1. DHT11 以低電平應答主機,然后拉高總線準備輸出。輸出 0 信號和 1 信號都是以低電平開始高電平結束。
  2. DHT11 輸出 0、 1 信號的低電平時間相同,而高電平的時間不同,輸出 0 信號時高電平約 26-28us,而當輸出 1 信號時高電平約為 70us。

3 驅動程序

關于字符設備驅動程序的使用,我們可以參照點亮 led 燈的那個實驗,這里只給出跟DHT11 密切相關的驅動程序,詳細的程序請查看我們的驅動文件!

//配置連接溫度傳感器的引腳
#define DHT11_L	   	        *GPIO21_0_DATA &= ~(1< //低電平	
#define DHT11_H		        *GPIO21_0_DATA |=  (1< //高電平
#define DHT11_OUT	        *GPIO21_0_DIR  |=  (1< //輸出	
#define DHT11_IN		*GPIO21_0_DIR  &= ~(1< //輸入	
#define DHT11_STA		*GPIO21_0_DATA & 0x01	

//寄存器定義
volatile unsigned long *GPIO21_0_DIR;
volatile unsigned long *GPIO21_0_DATA;	


/****************  基本定義 **********************/
//初始化函數必要資源定義
//用于初始化函數當中
//device number;
	dev_t dev_num;
//struct dev
	struct cdev dht11_cdev;
//auto "mknode /dev/dht11 c dev_num minor_num"
struct class *dht11_class = NULL;
struct device *dht11_device = NULL;

/********************  dht11有關的函數   ****************************/
//從dht11中讀取一個字節
static unsigned char read_byte(void)
{
	unsigned char r_val = 0; 
	unsigned char t_count = 0; //計時器,防止超時;
        unsigned char i;

	for(i = 0 ; i < 8 ; i++)
	{
		t_count = 0;
		
		while(!DHT11_STA)
		{
			udelay(1);
			t_count++;
			if(t_count >250)
			{
				printk("read_byte error1n");
				return 100;
			}
		}
		t_count = 0;

		udelay(32);

		if(DHT11_STA == 1)
		{
			r_val < <= 1;
			r_val |= 1;
		}
		else
		{
			r_val < <= 1;
			continue;
		}

		while( DHT11_STA == 1 )
		{
			udelay(2);
			t_count++;
			if(t_count >250)
			{
				printk("read_byte error2n");
				return 100;
			}
	 	 }
	}

	return r_val;
}

//從dht11中讀出數據
static unsigned int read_dht11(void)
{
	 unsigned char t_count = 0; //計時器;
	 unsigned int  dht11 = 0;
	 unsigned char h_i = 0 , h_f = 0;
	 unsigned char t_i = 0 , t_f = 0;
	 unsigned char check_sum = 0;

	 DHT11_OUT;

	 DHT11_L;
	 mdelay(30); // >18ms;
	 DHT11_H;

	 udelay(30);

	 DHT11_IN;
	 while(DHT11_STA == 1)
	 {
	 	udelay(1);
		t_count++;

		if(t_count > 50)
		{
	 		printk("device error: dht11!n");
			return 0;
		}
	 }
	 t_count = 0;

 	 while(!DHT11_STA)
	 {
		udelay(1);
		t_count++;

		if(t_count > 250)
		{
			printk("read_dht11 error1n");
			return 0;
		}
	 }

	 t_count = 0;

	 udelay(50);

	 while(DHT11_STA)
	 {
		udelay(1);
		t_count++;
		if(t_count > 250)
		{
			printk("read_dht11 error2n");
			return 0;
		}
	 }

	 h_i = read_byte();
	 h_f = read_byte();
	 t_i = read_byte();
	 t_f = read_byte();
	 check_sum = read_byte();

	 if(check_sum == (h_i+h_f+t_i+t_f) || (h_i!=100 && t_i != 100))
	 {
		dht11 = t_i;
		dht11 < <= 8;
		dht11 += h_i;
	 }
	 else
	 {
		dht11 = 0;
		printk("read_dht11 error3n");
	 }

	 return dht11;
}


/**********************************************************************/

/**************** 結構體 file_operations 成員函數 *****************/
//open
static int dht11_open(struct inode *inode, struct file *file)
{
	printk("dht11 drive open...n");

	DHT11_OUT;
	DHT11_H;

	return 0;
}

//close
static int dht11_close(struct inode *inode , struct file *file)
{
	return 0;
}

//read
static ssize_t dht11_read(struct file *file, char __user *buffer,
			size_t len, loff_t *pos)
{
	unsigned int dht11; 
	printk("dht11 drive read...n");

	dht11 = read_dht11();
	copy_to_user(buffer, &dht11, 4);

	return 4;
}



/***************** 結構體: file_operations ************************/
//struct
static const struct file_operations dht11_fops = {
	.owner   = THIS_MODULE,
	.open	 = dht11_open,
	.release = dht11_close,	
	.read	 = dht11_read,
};


/*************  functions: init , exit*******************/
//條件值變量,用于指示資源是否正常使用
unsigned char init_flag = 0;
unsigned char add_code_flag = 0;

//init
static __init int dht11_init(void)
{
	int ret_v = 0;
	printk("dht11 drive init...n");

	//函數alloc_chrdev_region主要參數說明:
	//參數2: 次設備號
	//參數3: 創建多少個設備
	if( ( ret_v = alloc_chrdev_region(&dev_num,0,1,"dht11") ) < 0 )
	{
		goto dev_reg_error;
	}
	init_flag = 1; //標示設備創建成功;

	printk("The drive info of dht11:nmajor: %dnminor: %dn",
		MAJOR(dev_num),MINOR(dev_num));

	cdev_init(&dht11_cdev,&dht11_fops);
	if( (ret_v = cdev_add(&dht11_cdev,dev_num,1)) != 0 )
	{
		goto cdev_add_error;
	}

	dht11_class = class_create(THIS_MODULE,"dht11");
	if( IS_ERR(dht11_class) )
	{
		goto class_c_error;
	}

	dht11_device = device_create(dht11_class,NULL,dev_num,NULL,"dht11");
	if( IS_ERR(dht11_device) )
	{
		goto device_c_error;
	}
	printk("auto mknod success!n");

	//------------   請在此添加您的初始化程序  --------------//
       

	GPIO21_0_DATA = (volatile unsigned long *)ioremap(0x10000620, 4);
	GPIO21_0_DIR =  (volatile unsigned long *)ioremap(0x10000624, 4);

        //如果需要做錯誤處理,請:goto dht11_error;	

	 add_code_flag = 1;
	//----------------------  END  ---------------------------// 

	goto init_success;

dev_reg_error:
	printk("alloc_chrdev_region failedn");	
	return ret_v;

cdev_add_error:
	printk("cdev_add failedn");
 	unregister_chrdev_region(dev_num, 1);
	init_flag = 0;
	return ret_v;

class_c_error:
	printk("class_create failedn");
	cdev_del(&dht11_cdev);
 	unregister_chrdev_region(dev_num, 1);
	init_flag = 0;
	return PTR_ERR(dht11_class);

device_c_error:
	printk("device_create failedn");
	cdev_del(&dht11_cdev);
 	unregister_chrdev_region(dev_num, 1);
	class_destroy(dht11_class);
	init_flag = 0;
	return PTR_ERR(dht11_device);

//------------------ 請在此添加您的錯誤處理內容 ----------------//
dht11_error:
	add_code_flag = 0;
	return -1;
//--------------------          END         -------------------//
    
init_success:
	printk("dht11 init success!n");
	return 0;
}

//exit
static __exit void dht11_exit(void)
{
	printk("dht11 drive exit...n");	

	if(add_code_flag == 1)
 	{   
           //----------   請在這里釋放您的程序占有的資源   ---------//
	    printk("free your resources...n");	               

		iounmap(GPIO21_0_DATA);
		iounmap(GPIO21_0_DIR);

	    printk("free finishn");		               
	    //----------------------     END      -------------------//
	}					            

	if(init_flag == 1)
	{
		//釋放初始化使用到的資源;
		cdev_del(&dht11_cdev);
 		unregister_chrdev_region(dev_num, 1);
		device_unregister(dht11_device);
		class_destroy(dht11_class);
	}
}

/**************** module operations**********************/
//module loading
module_init(dht11_init);
module_exit(dht11_exit);

//some infomation
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("from Jafy");
MODULE_DESCRIPTION("dht11 drive");
/*********************  The End ***************************/

4 應用程序

int main(int argc, char **argv)
{
	int fd;
	unsigned int dht11 = 0;
	unsigned int humi,temp;

	//打開溫度傳感器驅動模塊
	fd = open("/dev/dht11", O_RDWR | O_NONBLOCK);
	if (fd < 0)
	{
		printf("can't open /dev/dht11n");
		return -1;
	}

	read(fd, &dht11, sizeof(dht11));

	temp = dht11 >>8;
	humi = dht11 &0x000000ff;
	printf("the current temperature is: %dn",temp);
	printf("the current humidity is:    %dn",humi);

	close(fd);
	
	return 0;
}

5 實驗結果

5.png
審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2528

    文章

    48296

    瀏覽量

    741142
  • 溫濕度傳感器

    關注

    5

    文章

    549

    瀏覽量

    35295
  • 開發板
    +關注

    關注

    25

    文章

    4506

    瀏覽量

    94458
  • OpenWrt
    +關注

    關注

    10

    文章

    118

    瀏覽量

    38935
  • DHT11
    +關注

    關注

    19

    文章

    264

    瀏覽量

    57226
收藏 人收藏

    評論

    相關推薦

    基于arduino的dht11溫濕度傳感器的使用

    本文介紹了DHT11溫濕度傳感器電氣特性、DHT11封裝形式及接口說明與典型應用電路,其次介紹了DHT11
    發表于 01-22 15:50 ?4.4w次閱讀
    基于arduino的<b class='flag-5'>dht11</b><b class='flag-5'>溫濕度</b><b class='flag-5'>傳感器</b>的使用

    DHT11溫濕度傳感器

    溫濕度傳感器資料(資料+程序)DHT11參考資料
    發表于 07-25 17:17

    DHT11溫濕度傳感器的原理資料

    附件味DHT11溫濕度傳感器的原理資料
    發表于 06-05 15:16

    Arduino開發板使用DHT11溫濕度傳感器的方法 精選資料分享

    在本篇文章中,我們將DHT11溫濕度傳感器與Arduino開發板和LCD顯示屏連接,設計一種能夠測量室溫和環境濕度的設備。簡單地說,我們將使
    發表于 07-13 09:35

    Arduino開發板使用DHT11溫濕度傳感器的方法 精選資料分享

    在本篇文章中,我們將DHT11溫濕度傳感器與Arduino開發板和LCD顯示屏連接,設計一種能夠測量室溫和環境濕度的設備。簡單地說,我們將使
    發表于 07-13 06:58

    DHT11溫濕度傳感器介紹

    DHT11溫濕度傳感器介紹,1.實物原理圖2.模塊說明2.1 DHT11產品概述DHT11數字溫濕度
    發表于 07-21 09:04

    使用DHT11溫濕度傳感器

    STM32F407ZGT6開發板進行項目開發,選用的傳感器為常見通用的DHT11溫濕度傳感器。
    發表于 08-10 06:14

    DHT11溫濕度傳感器

    DHT11溫濕度傳感器1. DHT11簡介2. 硬件設計3. 軟件設計3.1 STM32CubeMX設置3.2 MDK-ARM編程4. 下載驗證
    發表于 08-11 06:04

    如何使用nodemcu開發板與DHT11溫濕度傳感器獲取溫濕度數值?

    如何使用nodemcu開發板與DHT11溫濕度傳感器獲取溫濕度數值?
    發表于 10-28 06:12

    dht11溫濕度傳感器有什么特點?怎么使用?

    dht11溫濕度傳感器特點及使用介紹前言一、dht11溫濕度傳感器外觀二、原理圖三、相關參數講解
    發表于 01-10 06:27

    如何使用STM32F4來讀取DHT11數字溫濕度傳感器

    數字溫濕度傳感器實驗上一,我們介紹了數字溫度傳感器 DS18B20 的使用,本章我們將介紹數字溫濕度
    發表于 02-09 07:50

    DHT11溫濕度傳感器簡介

    DHT11溫濕度傳感器1、DHT11簡介DHT11數字溫濕度
    發表于 02-16 06:55

    DHT11數字溫濕度傳感器的相關資料推薦

    STM32采集DHT11溫濕度關于DHT11相關參數代碼篇接線和實驗結果總結關于DHT11DHT11是一款數字溫濕度
    發表于 02-21 07:34

    DHT11溫濕度傳感器程序下載

    DHT11溫濕度傳感器程序下載
    發表于 11-28 16:17 ?32次下載

    溫濕度傳感器DHT11資料匯總

    溫濕度傳感器DHT11資料匯總
    發表于 05-20 14:34 ?32次下載
    <b class='flag-5'>溫濕度</b><b class='flag-5'>傳感器</b><b class='flag-5'>DHT11</b>資料匯總
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>