色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Openwrt開發(fā)指南 第28章 DHT11 溫濕度傳感器

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

開發(fā)環(huán)境:

主機(jī):Ubuntu12.04

開發(fā)板:RT5350

Openwrt:Openwrt15.05

1 硬件原理

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

2 DHT11 相關(guān)時(shí)序

  • 初始化(復(fù)位)時(shí)序圖

1.png

  1. 控制器首先至少拉低 18ms,然后拉高 20-40us 后等待 DHT11 的應(yīng)答
  2. 當(dāng) DHT11 檢測(cè)到信號(hào)后,首先將總線拉低約 80us 然后在拉高 80us 作為應(yīng)答信號(hào)。
  • 讀取數(shù)據(jù)時(shí)序圖

2.png

  • 表示 0 的時(shí)序如下

3.png

  • 表示 1 的時(shí)序如下

4.png

  1. DHT11 以低電平應(yīng)答主機(jī),然后拉高總線準(zhǔn)備輸出。輸出 0 信號(hào)和 1 信號(hào)都是以低電平開始高電平結(jié)束。
  2. DHT11 輸出 0、 1 信號(hào)的低電平時(shí)間相同,而高電平的時(shí)間不同,輸出 0 信號(hào)時(shí)高電平約 26-28us,而當(dāng)輸出 1 信號(hào)時(shí)高電平約為 70us。

3 驅(qū)動(dòng)程序

關(guān)于字符設(shè)備驅(qū)動(dòng)程序的使用,我們可以參照點(diǎn)亮 led 燈的那個(gè)實(shí)驗(yàn),這里只給出跟DHT11 密切相關(guān)的驅(qū)動(dòng)程序,詳細(xì)的程序請(qǐng)查看我們的驅(qū)動(dòng)文件!

//配置連接溫度傳感器的引腳
#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;	


/****************  基本定義 **********************/
//初始化函數(shù)必要資源定義
//用于初始化函數(shù)當(dāng)中
//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有關(guān)的函數(shù)   ****************************/
//從dht11中讀取一個(gè)字節(jié)
static unsigned char read_byte(void)
{
	unsigned char r_val = 0; 
	unsigned char t_count = 0; //計(jì)時(shí)器,防止超時(shí);
        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中讀出數(shù)據(jù)
static unsigned int read_dht11(void)
{
	 unsigned char t_count = 0; //計(jì)時(shí)器;
	 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;
}


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

/**************** 結(jié)構(gòu)體 file_operations 成員函數(shù) *****************/
//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;
}



/***************** 結(jié)構(gòu)體: 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");

	//函數(shù)alloc_chrdev_region主要參數(shù)說(shuō)明:
	//參數(shù)2: 次設(shè)備號(hào)
	//參數(shù)3: 創(chuàng)建多少個(gè)設(shè)備
	if( ( ret_v = alloc_chrdev_region(&dev_num,0,1,"dht11") ) < 0 )
	{
		goto dev_reg_error;
	}
	init_flag = 1; //標(biāo)示設(shè)備創(chuàng)建成功;

	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");

	//------------   請(qǐng)?jiān)诖颂砑幽某跏蓟绦? --------------//
       

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

        //如果需要做錯(cuò)誤處理,請(qǐng):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);

//------------------ 請(qǐng)?jiān)诖颂砑幽腻e(cuò)誤處理內(nèi)容 ----------------//
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)
 	{   
           //----------   請(qǐng)?jiān)谶@里釋放您的程序占有的資源   ---------//
	    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 應(yīng)用程序

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

	//打開溫度傳感器驅(qū)動(dòng)模塊
	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 實(shí)驗(yàn)結(jié)果

5.png
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2550

    文章

    51035

    瀏覽量

    753063
  • 溫濕度傳感器
    +關(guān)注

    關(guān)注

    5

    文章

    579

    瀏覽量

    35706
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5032

    瀏覽量

    97371
  • OpenWrt
    +關(guān)注

    關(guān)注

    10

    文章

    130

    瀏覽量

    39296
  • DHT11
    +關(guān)注

    關(guān)注

    19

    文章

    277

    瀏覽量

    57580
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

    在本篇文章中,我們將DHT11溫濕度傳感器與Arduino開發(fā)板和LCD顯示屏連接,設(shè)計(jì)一種能夠測(cè)量室溫和環(huán)境濕度的設(shè)備。簡(jiǎn)單地說(shuō),我們將使
    發(fā)表于 07-13 09:35

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

    在本篇文章中,我們將DHT11溫濕度傳感器與Arduino開發(fā)板和LCD顯示屏連接,設(shè)計(jì)一種能夠測(cè)量室溫和環(huán)境濕度的設(shè)備。簡(jiǎn)單地說(shuō),我們將使
    發(fā)表于 07-13 06:58

    DHT11溫濕度傳感器介紹

    DHT11溫濕度傳感器介紹,1.實(shí)物原理圖2.模塊說(shuō)明2.1 DHT11產(chǎn)品概述DHT11數(shù)字溫濕度
    發(fā)表于 07-21 09:04

    使用DHT11溫濕度傳感器

    STM32F407ZGT6開發(fā)板進(jìn)行項(xiàng)目開發(fā),選用的傳感器為常見(jiàn)通用的DHT11溫濕度傳感器
    發(fā)表于 08-10 06:14

    DHT11溫濕度傳感器

    DHT11溫濕度傳感器1. DHT11簡(jiǎn)介2. 硬件設(shè)計(jì)3. 軟件設(shè)計(jì)3.1 STM32CubeMX設(shè)置3.2 MDK-ARM編程4. 下載驗(yàn)證
    發(fā)表于 08-11 06:04

    如何使用nodemcu開發(fā)板與DHT11溫濕度傳感器獲取溫濕度數(shù)值?

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

    dht11溫濕度傳感器有什么特點(diǎn)?怎么使用?

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

    如何使用STM32F4來(lái)讀取DHT11數(shù)字溫濕度傳感器

    數(shù)字溫濕度傳感器實(shí)驗(yàn)上一,我們介紹了數(shù)字溫度傳感器 DS18B20 的使用,本章我們將介紹數(shù)字溫濕度
    發(fā)表于 02-09 07:50

    DHT11溫濕度傳感器簡(jiǎn)介

    DHT11溫濕度傳感器1、DHT11簡(jiǎn)介DHT11數(shù)字溫濕度
    發(fā)表于 02-16 06:55

    DHT11數(shù)字溫濕度傳感器產(chǎn)品介紹

    DHT11數(shù)字溫濕度傳感器產(chǎn)品介紹 DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的
    發(fā)表于 02-26 17:19 ?256次下載

    DHT11數(shù)字式溫濕度傳感器的應(yīng)用性研究

    基于DHT11溫濕度傳感器具有測(cè)量精度高、響應(yīng)速度快、抗干擾能力強(qiáng)等優(yōu)點(diǎn)。通過(guò)介紹DHT11數(shù)字式溫濕度
    發(fā)表于 07-25 17:03 ?216次下載
    <b class='flag-5'>DHT11</b>數(shù)字式<b class='flag-5'>溫濕度</b><b class='flag-5'>傳感器</b>的應(yīng)用性研究

    溫濕度DHT11資料

    溫濕度DHT11資料匯總 DHT11是一款有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度傳感器。 其精度濕度+-5
    發(fā)表于 11-29 17:28 ?27次下載

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

    數(shù)字溫濕度傳感器 DHT11 ?相對(duì)濕度和溫度測(cè)量 ?全部校準(zhǔn),數(shù)字輸出 ?卓越的長(zhǎng)期穩(wěn)定性 ?無(wú)需額外部件 ?超長(zhǎng)的信號(hào)傳輸距離 ?超低能耗 ?4 引腳安裝 ?完全互換
    發(fā)表于 12-02 11:06 ?4次下載

    使用ESP8266驅(qū)動(dòng)DHT11溫濕度傳感器

    DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度綜合傳感器,在Arduino提高篇中已對(duì)其進(jìn)行了介紹,本篇使用ESP8266來(lái)
    的頭像 發(fā)表于 05-19 14:20 ?6377次閱讀
    使用ESP8266驅(qū)動(dòng)<b class='flag-5'>DHT11</b><b class='flag-5'>溫濕度</b><b class='flag-5'>傳感器</b>
    主站蜘蛛池模板: 国产老肥熟xxxx| 一级特黄aa大片欧美| 国产精品成人观看视频免费| 日日操夜夜操狠狠操| 丰满的美女射精动态图| 日本护士性生活| 调教椅上的调教SM总裁被调教 | 无遮挡h肉3d动漫在线观看| 国产精品1区在线播放| 乌克兰少妇大胆大BBW| 国产色偷偷男人的天堂| 亚洲AV精品无码国产一区| 狠狠色狠狠色综合日日小说| 亚洲日韩国产成网站在线| 久久婷婷五月免费综合色啪| 最新 国产 精品 精品 视频| 男男肉肉互插腐文| 白丝女仆被强扒内裤| 丝瓜视频樱桃视频在线观看免费| 亚洲精品久久久无码| 国产午夜精品福利久久| 同时和两老师双飞| 国产手机在线精品| 野花日本韩国视频免费高清观看| 久久精品小视频| 99久久蜜臀亚洲AV无码精品| 拍戏被CAO翻了H| 国产成人小视频| 亚洲日韩视频免费观看| 久久最新地址获取| JLZZJLZZJLZ老师好多的水| 色偷偷伊人| 好男人在线观看视频观看高清视频免费| 艳照门在线观看| 欧美精品v欧洲高清| 国产成人啪精视频精东传媒网站| 亚洲国产在线午夜视频无| 两性午夜刺激爽爽视频| 变形金刚7免费观看完整| 午夜在线播放免费人成无| 久久视频这里只精品6国产|