树莓派温湿度监测终极指南:DHT11+wiringPi驱动深度解析
基于树莓派与DHT11的温湿度监测实验(使用wiringPi驱动)
引言
温湿度检测是物联网和嵌入式开发中常见的应用场景。本文将介绍如何利用树莓派(Raspberry Pi)和DHT11传感器搭建一个简单的温湿度监测系统,通过C语言和wiringPi库实现数据采集与处理。本实验成本低廉且代码开源,适合嵌入式开发初学者实践。
硬件准备
所需材料
- 树莓派(任意型号,需安装Raspbian系统)
- DHT11温湿度传感器模块
- 杜邦线若干
- 10kΩ电阻(部分模块已集成)
接线说明
- VCC → 3.3V(物理引脚1)
- DATA → GPIO0(wiringPi编号,对应物理引脚11)
- GND → GND(物理引脚9)
注意:DHT11为单总线协议,DATA引脚需上拉10kΩ电阻至VCC(已集成电阻的模块无需额外连接)
软件配置
安装wiringPi库
# 若未预装,可通过以下命令安装(注意:官方仓库已停止维护,建议从GitHub获取)
git clone https://github.com/WiringPi/WiringPi
cd WiringPi
./build
验证安装
gpio -v
代码实现
核心代码(dht11.c)
//
//
//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;
}
//
编译与运行
gcc -o dht11 dht11.c -lwiringPi
sudo ./dht11
实验结果
正常运行时将输出:
湿度: 45.0 %
温度: 25.0 ℃
常见问题排查
-
返回-1或错误值:
- 检查接线是否松动
- 确保使用sudo权限运行
- 验证上拉电阻连接
-
精度问题:DHT11温度误差±2℃,湿度误差±5%
扩展应用
- 结合LCD模块显示实时数据
- 通过HTTP协议上传至物联网平台
- 设置温湿度报警阈值
结语
本实验演示了树莓派与DHT11传感器的典型应用。虽然DHT11精度有限,但其低成本易用性使其成为入门级项目的理想选择。后续可尝试升级到DHT22传感器或使用Python版本实现更复杂的功能。
参考资料:DHT11官方数据手册
希望这篇博客能帮助您快速上手温湿度监测项目!如有疑问欢迎在评论区留言讨论。