精帖  树莓派使用DHT11温湿度传感器获取数据教程 Python和C程序及原理图温度传感器,温湿度传感器,GPIO编程,Python,传感器

By 管理员8

2023-05-11 13:48:08

浏览量89889

已赞13

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,虽然并不是一款高效的传感器,但价格便宜,连接方便。

 ➥ DHT11传感器购买链接

一:DHT11的性能指标和特性

工作电压范围:3.5V-5.5V,工作电流 :平均 0.5mA,湿度测量范围:20-90%RH,温度测量范围:0-50℃,湿度分辨率 :1%RH 8 位,温度分辨率 :1℃ 8位,采样周期 :1S

二:DHT11 数据结构

DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,具体格式在下面说明。一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和校验和数据为前四个字节相加。

传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。如果,某次从传感器中读取如下5Byte数据:byte4 byte3 byte2 byte1 byte000101101 00000000 00011100 00000000 01001001整数 小数 整数 小数 校验和湿度 温度 校验和由以上数据就可得到湿度和温度的值,计算方法:

humi (湿度)= byte4 . byte3=45.0 (%RH)

temp (温度)= byte2 . byte1=28.0 ( ℃)

jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校验正确)

注意:DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。

三:树莓派接线

注意!勿将将正负极接反,否则DHT11模块必定烧毁,不可逆转。

传感器的正极VCC:连接树莓派的4号引脚(5V);

传感器DATA数据连:接树莓派18号引脚(BCM编码 24);

传感器GND负极:连接树莓派6号引脚(GND);

ImageImage

四:Python部分

我们这里使用的是已经编译好的库, Adafruit 来读取 DHT11 温湿度传感器

可以先更新下软件包

sudo apt-get update
sudo apt-get install build-essential python-dev

在从GitHub获取Adafruit库

sudo git clone https://github.com/adafruit/Adafruit_Python_DHT

安装完成后pi文件夹下新增Adafruit_Python_DHT文件夹,进入该文件夹安装该库。

cd Adafruit_Python_DHT
sudo python setup.py install
sudo python3 setup.py install

安装完成后进入examples文件夹运行AdfruitDHT.py可以获得结果。

cd examples

输入下面的执行命令查看测温数据(后面两个数值11代表使用的是DHT11模块,24代表着所接的GIPO引脚编号(BCM)

运行结果:

sudo python AdafruitDHT.py 11 24

Image

如果在其他Python 程序中使用这个库

参照下面的方法引入Adafruit库,可以使用 “read_retry” 方法来读取 DHT11 数据:

import Adafruit_DHT

# Set sensor type : Options are DHT11,DHT22 or AM2302

sensor=Adafruit_DHT.DHT11

# Set GPIO sensor is connected to

GPIO=24

# Use read_retry method. This will retry up to 15 times to

# get a sensor reading (waiting 2 seconds between each retry).

humidity, temperature = Adafruit_DHT.read_retry(sensor, GPIO)

# Reading the DHT11 is very sensitive to timings and occasionally

# the Pi might fail to get a valid reading. So check if readings are valid.

if humidity is not None and temperature is not None:

print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity))

else:

print('Failed to get reading. Try again!')

五:C程序部分

1.由于我们C程序的DHT11是将DATA接到GPIO1(BCM编码:18)参考下图,如果你需要更改接口需要将下面的C程序引脚编码也同步更改。才能正常显示!

Image

2.我们需要新建一个dht11.c文件,然后编写代码,具体如下;

sudo nano dht11.c

3.编译程序:

//
//
//mydht11.c
//
#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 =1;  //use gpio1 to read data
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("Use GPIO1 to read data!\n");
 
  if (-1 == wiringPiSetup()) {
    printf("Setup wiringPi failed!");
    return 1;
  }
 
  pinMode(pinNumber, OUTPUT); // set mode to output
  digitalWrite(pinNumber, 1); // output a high level 
 
  printf("Enter OS-------\n");
  while(1) {
    pinMode(pinNumber,OUTPUT); // set mode to output
    digitalWrite(pinNumber, 1); // output a high level 
    delay(3000);
    if(readSensorData())
    {
       printf("Congratulations ! 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("Sorry! Sensor dosent ans!\n");
       databuf=0;
      }
  }
  return 0;
}
//

Image

4.代码编写好后,按Ctrl+X按Y进行保存,然后在编译文件

gcc -Wall -o dht11 dht11.c -lwiringPi

5.执行命令查看数据:(每隔2秒刷新一次数据)

./dht11

Image

五:资源下载

 ➥ DHT11原理图及51系列测试程序  提取码:8888


本文章最后由 超级版主2023-11-12 21:41 编辑
发表评论
请先 注册/登录 后参与评论

已有2 发布

默认   热门   正序   倒序
查看更多评论
(13) 分享
分享

扫二维码或复制链接分享该篇文章

取消
已有0次打赏
本站免责声明
1、本站资源,均来自网络或个人用户发布,版权归原作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !

侵权删除请致信 E-Mail:cxg88@qq.com