在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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
審核編輯:湯梓紅

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

    關注

    2551

    文章

    51090

    瀏覽量

    753479
  • 溫濕度傳感器

    關注

    5

    文章

    579

    瀏覽量

    35721
  • 開發板
    +關注

    關注

    25

    文章

    5049

    瀏覽量

    97444
  • OpenWrt
    +關注

    關注

    10

    文章

    130

    瀏覽量

    39302
  • DHT11
    +關注

    關注

    19

    文章

    277

    瀏覽量

    57589
收藏 人收藏

    評論

    相關推薦

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

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

    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數字溫濕度傳感器產品介紹

    DHT11數字溫濕度傳感器產品介紹 DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的
    發表于 02-26 17:19 ?256次下載

    溫濕度DHT11資料

    溫濕度DHT11資料匯總 DHT11是一款有已校準數字信號輸出的溫濕度傳感器。 其精度濕度+-5
    發表于 11-29 17:28 ?27次下載

    數字溫濕度傳感器 DHT11

    數字溫濕度傳感器 DHT11 ?相對濕度和溫度測量 ?全部校準,數字輸出 ?卓越的長期穩定性 ?無需額外部件 ?超長的信號傳輸距離 ?超低能耗 ?4 引腳安裝 ?完全互換
    發表于 12-02 11:06 ?4次下載

    使用ESP8266驅動DHT11溫濕度傳感器

    DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度綜合傳感器,在Arduino提高篇中已對其進行了介紹,本篇使用ESP8266來
    的頭像 發表于 05-19 14:20 ?6413次閱讀
    使用ESP8266驅動<b class='flag-5'>DHT11</b><b class='flag-5'>溫濕度</b><b class='flag-5'>傳感器</b>
    主站蜘蛛池模板: 1024国产欧美日韩精品| 欧美成年性色mmm| 欧美二级| 免费在线一区二区三区| 亚洲午夜久久久精品影院视色| 酒色成人| bl 高h文| 色多多在线观看视频| 久久婷婷五综合一区二区| www.999精品视频观看免费| 天天插视频| 91福利网| 综合天堂| 欧美色p| 成年片免费网址网站| 奇米影视狠狠| 一区二区三区在线观看免费| 亚洲第一色视频| 久青草国产免费观看| 夜夜夜夜夜夜夜猛噜噜噜噜噜噜| 久久国产免费观看| 日本免费不卡一区| 色婷婷激婷婷深爱五月老司机| 久久精品高清| 午夜精品久久久久久99热7777| 5060精品国产福利午夜| 婷婷了五月色香综合缴情| 久久国产视频一区| 国产精品青草久久久久福利99| 欧美三四级片| 黄色一级片网址| 日日干夜夜操视频| 亚洲一一在线| 色老头·com| 色屁屁www影院免费观看视频| 一级做a爱片特黄在线观看免费看| 明星三级国产免费播放| 天天做天天爱天天影视综合| 高清精品女厕在线观看| 四虎影视网站| 69pao强力打造免费高速|