查看: 246|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-20 11:34
  • 签到天数: 16 天

    连续签到: 2 天

    [LV.4]偶尔看看III

    发表于 2024-4-13 14:21:34 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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安装.jpg
    图1:WiringPi安装

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

    3.开发板接好DHT11传感器
    3_接好DHT11.jpg
    图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_编译.jpg
    图4:编译

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


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


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-5-1 04:25 , Processed in 0.110267 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.