回答

收藏

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

Raspberry Pi Raspberry Pi 2439 人阅读 | 0 人回复 | 2024-04-13

本帖最后由 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代码如下
  1. #include <wiringPi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. typedef unsigned char uint8;
  5. typedef unsigned int uint16;
  6. typedef unsigned long uint32;

  7. #define HIGH_TIME 32

  8. int pinNumber = 7;
  9. uint32 databuf;

  10. uint8 readSensorData(void)
  11. {
  12.         uint8 crc;
  13.         uint8 i;
  14.         
  15.         pinMode(pinNumber, OUTPUT); // set mode to output
  16.         digitalWrite(pinNumber, 0); // output a high level
  17.         delay(25);
  18.         digitalWrite(pinNumber, 1); // output a low level
  19.         pinMode(pinNumber, INPUT); // set mode to input
  20.         pullUpDnControl(pinNumber, PUD_UP);
  21.         
  22.         delayMicroseconds(27);
  23.         if (digitalRead(pinNumber) == 0) //SENSOR ANS
  24.         {
  25.                 while (!digitalRead(pinNumber))
  26.                         ; //wait to high
  27.         
  28.                 for (i = 0; i < 32; i++)
  29.                 {
  30.                         while (digitalRead(pinNumber))
  31.                                 ; //data clock start
  32.                         while (!digitalRead(pinNumber))
  33.                                 ; //data start
  34.                         delayMicroseconds(HIGH_TIME);
  35.                         databuf *= 2;
  36.                         if (digitalRead(pinNumber) == 1) //1
  37.                         {
  38.                                 databuf++;
  39.                         }
  40.                 }
  41.         
  42.                 for (i = 0; i < 8; i++)
  43.                 {
  44.                         while (digitalRead(pinNumber))
  45.                                 ; //data clock start
  46.                         while (!digitalRead(pinNumber))
  47.                                 ; //data start
  48.                         delayMicroseconds(HIGH_TIME);
  49.                         crc *= 2;
  50.                         if (digitalRead(pinNumber) == 1) //1
  51.                         {
  52.                                 crc++;
  53.                         }
  54.                 }
  55.                 return 1;
  56.         }
  57.         else
  58.         {
  59.                 return 0;
  60.         }
  61. }
  62.         
  63. int main(void)
  64. {
  65.         printf("PIN:%d\n", pinNumber);
  66.         
  67.         if (-1 == wiringPiSetup()) {
  68.                 printf("Setup wiringPi failed!");
  69.                 return 1;
  70.         }
  71.         
  72.         pinMode(pinNumber, OUTPUT); // set mode to output
  73.         digitalWrite(pinNumber, 1); // output a high level
  74.         
  75.         printf("Starting...\n");
  76.         while (1)
  77.         {
  78.                 pinMode(pinNumber, OUTPUT); // set mode to output
  79.                 digitalWrite(pinNumber, 1); // output a high level
  80.                 delay(3000);
  81.                 if (readSensorData())
  82.                 {
  83.                         printf("Sensor data read ok!\n");
  84.                         printf("RH:%d.%d\n", (databuf >> 24) & 0xff, (databuf >> 16) & 0xff);
  85.                         printf("TMP:%d.%d\n", (databuf >> 8) & 0xff, databuf & 0xff);
  86.                         databuf = 0;
  87.                 }
  88.                 else
  89.                 {
  90.                         printf("Sensor dosent ans!\n");
  91.                         databuf = 0;
  92.                 }
  93.         }
  94.         return 0;
  95. }
复制代码
2.编译
gcc -Wall -o dht11 dht11.c -lwiringPi
编译完出现可执行文件如下
图4:编译

3.运行
sudo ./dht11
这时可以看到读出的传感器DHT11的湿度与温度,如下
图5:传感器DHT11的湿度与温度


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


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条