关于树莓派3B DHT11温湿度模块 bcm2835 GPIO控制

现在网上有很多使用python脚本或者使用wiringPi库的DHT11数据获取的方法。但是很少有bcm2835 GPIO控制的方式获取DHT11数据。这篇文章也只是丰富这块的空缺。不多说,直接内容。



连线方式:

树莓派3b的引脚图:

关于树莓派3B DHT11温湿度模块 bcm2835 GPIO控制_第1张图片


DHT11三个接口 VCC(电源)、GND (地线)、DATA (控制和读取时间端口)

本文如上图 DATA 连接的是第7接口GPIO 4,VCC连接3.3V板载电源,GND连接板载GND。


准备工作:

bcm2835库的下载,把bcm2835库安装到树莓派上,怎么安装,自己百度下。这边不做陈述。已经安装过的不需要再安装。


C代码:

下面直接上代码。

int readDHT(int pin){  
	int laststate = HIGH;
	int index = 0;
	int data[5];
	memset(data, 0, 5*sizeof(int));
	bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_write(pin, HIGH);
	usleep(500000); // 500ms 
	bcm2835_gpio_write(pin, LOW); 
	usleep(20000);  // 20ms 

	bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT);
	//接收DHT11的响应信号、准备信号
	while(bcm2835_gpio_lev(pin) == 1){
		continue;
	}
	while(bcm2835_gpio_lev(pin) == 0){
		continue;
	}
	while(bcm2835_gpio_lev(pin) == 1){
		continue;
	}
	//读取数据信号
	while (index<40){	
		long umcount = 0;
		while(bcm2835_gpio_lev(pin) == 0){
			continue;
		}
		while(bcm2835_gpio_lev(pin) == 1){
			umcount++;
			if(umcount>=1000)
				break;
		}
		if(umcount >= 1000)
			break;
		data[index/8] <<= 1;
		if (umcount>200){
			data[index/8] |= 1;
		}
		index++;
	}
	//验证数据是否正确
	if (data[4] == ((data[0]+data[1]+data[2])+data[3]) & 0xFF){
		printf("Temp = %d.%d *C, Hum = %d.%d \%\n",data[2],data[3],data[0],data[1]);
		return 1;
	}
	
	return 0;  
}

编译方法:

gcc xxx.c -o xxx -l bcm2835 编译的时候因为使用了bcm2835库所以一定要带上。

源码地址:http://download.csdn.net/download/danwufeiyang/9965344


结果显示:

关于树莓派3B DHT11温湿度模块 bcm2835 GPIO控制_第2张图片


你可能感兴趣的:(嵌入式,单片机)