关于树莓派3B DHT11温湿度模块 bcm2835 GPIO控制
程序员文章站
2024-02-26 09:57:16
...
现在网上有很多使用python脚本或者使用wiringPi库的DHT11数据获取的方法。但是很少有bcm2835 GPIO控制的方式获取DHT11数据。这篇文章也只是丰富这块的空缺。不多说,直接内容。
连线方式:
树莓派3b的引脚图:
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
结果显示:
上一篇: Yii2主题(Theme)用法详解