树莓派开发之旅 (十四)【树莓派驱动DHT11的几种方法】

目录

【直接读取设备文件】

【C语言开发】

【Python开发】


【直接读取设备文件】

        通过 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

【Python开发】

        使用 Adafruit 读取 DHT11 温湿度传感器 | 树莓派实验室

        树莓派从 DHT11 温度湿度传感器读取数据 | 树莓派实验室

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Qt编写的DHT11传感器驱动代码,可以通过调用该驱动代码,获取DHT11传感器的温湿度数据: DHT11.h文件 ```c++ #ifndef DHT11_H #define DHT11_H #include <QObject> #include <wiringPi.h> class DHT11 : public QObject { Q_OBJECT public: explicit DHT11(QObject *parent = nullptr); public slots: void readData(); signals: void humidityAndTemperature(double humidity, double temperature); private: int dht11_val[5]={0,0,0,0,0}; }; #endif // DHT11_H ``` DHT11.cpp文件 ```c++ #include "DHT11.h" #include <iostream> using namespace std; #define DHT11PIN 7 DHT11::DHT11(QObject *parent) : QObject(parent) { if(wiringPiSetup()==-1) exit(1); } void DHT11::readData() { unsigned char lststate=HIGH; unsigned char counter=0; unsigned char j=0,i; for(i=0;i<5;i++) dht11_val[i]=0; pinMode(DHT11PIN,OUTPUT); digitalWrite(DHT11PIN,LOW); delay(18); digitalWrite(DHT11PIN,HIGH); delayMicroseconds(40); pinMode(DHT11PIN,INPUT); for(i=0;i<85;i++) { counter=0; while(digitalRead(DHT11PIN)==lststate) { counter++; delayMicroseconds(1); if(counter==255) break; } lststate=digitalRead(DHT11PIN); if(counter==255) break; if((i>=4)&&(i%2==0)) { dht11_val[j/8]<<=1; if(counter>16) dht11_val[j/8]|=1; j++; } } if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xff))) { double humidity = dht11_val[0] + dht11_val[1] * 0.1; double temperature = dht11_val[2] + dht11_val[3] * 0.1; emit humidityAndTemperature(humidity, temperature); } else cout << "Invalid Data!!" << endl; } ``` 在DHT11类中,实现了一个readData()函数,用于读取DHT11传感器的温湿度数据。在读取完数据后,通过信号humidityAndTemperature(),将温湿度数据发送出去。在主程序中,可以通过连接该信号,实现对温湿度数据的获取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值