dirty123 发表于 2024-4-13 14:21:34

【树莓派5 测评】--4.DHT11温湿度读取

本帖最后由 dirty123 于 2024-4-14 09:55 编辑

      树莓派5有多种方式读取使用传感器,本篇讲述使用WiringPi 库,编写C语言代码,驱动实现对DHT11传感器温湿度的读取。
一.环境、硬件准备
1.安装 WiringPi:
①系统更新sudo apt-get update②这里需要使用到WiringPi库,通过git克隆.通过git --version查询安装及版本,若没安装如下安装git
sudo apt-get install git-core
③接着下载 wiringPi库,如下
git clone https://github.com/WiringPi/WiringPi
④编译安装 wiringPi
cd WiringPi
sudo ./build

图1:WiringPi安装
2.安装好WiringPi后,命令gpio readall查询开发板WiringPi引脚编号对应情况,这里选择7脚作为与DHT11的数据通讯引脚
图2:引脚编号
3.开发板接好DHT11传感器
图3:开发板接好DHT11传感器

二.代码编写编译运行
1.编写dht11.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 = 7;
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;
}
2.编译
gcc -Wall -o dht11 dht11.c -lwiringPi
编译完出现可执行文件如下
图4:编译
3.运行
sudo ./dht11
这时可以看到读出的传感器DHT11的湿度与温度,如下
图5:传感器DHT11的湿度与温度

      至此实现对DHT11传感器温湿度的读取。


页: [1]
查看完整版本: 【树莓派5 测评】--4.DHT11温湿度读取

Baidu
map