目录
【直接读取设备文件】
通过 vi 打开 /boot/overlays/README ,通过/dht11来检索,可以发现
大致意思是在config.txt 中添加上 dtoverlay=dht11 后重启,即可加载设备文件,具体步骤:
① dht11(或dht21 / dht22)信号引脚接gpio4(BCM编码),VCC接5V/3.3V,GND接地
② 编辑config.txt,在末尾另起一行,添加命令,随后重启
sudo nano /boot/config.txt
dtoverlay=dht11,gpiopin=4
sudo reboot
③ 读取设备文件,可获得温湿度值
cat /sys/bus/iio/devices/iio:device0/in_temp_input
cat /sys/bus/iio/devices/iio:device0/in_humidityrelative_input
注意:这样读取很可能读取不到数值,多次尝试方能读取成功,原因可参考下面博客
树莓派使用DHT11获取房间温湿度信息 - 知乎
树莓派直接读取 DHT11 温湿度的方法 | 树莓派实验室
【C语言开发】
需安装好wiringPi库(前面文章有介绍),接线与上面介绍的一样,代码如下
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
#define HIGH_TIME 32
int pinNumber = 7; //wiringPi编码的PIN 7,即为BCM编码的PIN 4
uint32 databuf;
uint8 readSensorData(void)
{
uint8 crc;
uint8 i;
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 0); // output a high level
delay(25);
digitalWrite(pinNumber, 1); // output a low level
pinMode(pinNumber, INPUT); // set mode to input
pullUpDnControl(pinNumber, PUD_UP);
delayMicroseconds(27);
if (digitalRead(pinNumber) == 0) //SENSOR ANS
{
while (!digitalRead(pinNumber))
; //wait to high
for (i = 0; i < 32; i++)
{
while (digitalRead(pinNumber))
; //data clock start
while (!digitalRead(pinNumber))
; //data start
delayMicroseconds(HIGH_TIME);
databuf *= 2;
if (digitalRead(pinNumber) == 1) //1
{
databuf++;
}
}
for (i = 0; i < 8; i++)
{
while (digitalRead(pinNumber))
; //data clock start
while (!digitalRead(pinNumber))
; //data start
delayMicroseconds(HIGH_TIME);
crc *= 2;
if (digitalRead(pinNumber) == 1) //1
{
crc++;
}
}
return 1;
}
else
{
return 0;
}
}
int main(void)
{
printf("PIN:%d\n", pinNumber);
if (-1 == wiringPiSetup()) {
printf("Setup wiringPi failed!");
return 1;
}
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
printf("Starting...\n");
while (1)
{
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
delay(3000);
if (readSensorData())
{
printf("Sensor data read ok!\n");
printf("RH:%d.%d\n", (databuf >> 24) & 0xff, (databuf >> 16) & 0xff);
printf("TMP:%d.%d\n", (databuf >> 8) & 0xff, databuf & 0xff);
databuf = 0;
}
else
{
printf("Sensor dosent ans!\n");
databuf = 0;
}
}
return 0;
}
编译:
gcc -Wall -o dht11 dht11.c -lwiringPi
运行:
./dht11