继续 树莓派+DHT11 温湿度传感器

Spoony 26.9m2020-05-09166 次点击

因为试过一些方法,不同的树莓派上、不同的传感器可能出现读出的数值有偏差。
只好多提供几种方案给大家选择。

编程使用WiringPi库,Vcc引脚连接物理接口2,DATA引脚连接物理接口40,GND引脚连接物理接口6。

#如果之前没有安装过 git,执行下面的命令安装一下
sudo apt-get install git-core
sudo apt-get update
#下载 wiringPi
#git clone git://git.drogon.net/wiringPi
git clone https://github.com/WiringPi/WiringPi
#编译 wiringPi
cd WiringPi
./build

源代码如下,保存为 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 = 29;
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 -Wall -o dht11 dht11.c -lwiringPi
sudo ./dht11

收藏 ♥ 感谢
RaspiSQH 47.7m 2020-05-09  ♥ 1
啊,永恒不变的主题.......
奇怪的是不同板子,不同型号的传感器,甚至不同os都会导致某种方法不能用。上次给一个人做dht11的就不能用我那个方法,Adafruit的反而可以用。真是迷惑。
顺便说一下天气,连下三天雨后下了一场小雪,一夜回到春节前......然后下午又在艳阳高照、万里无云下上完体育课.......真的是除了体育课那半天以外天天下雨/雪。
之前那个改成Json了:
http://echocraft.com.cn/dht
Spoony 小组长 2020-05-09 
@RaspiSQH 我今天用你之前介绍的方法直接读取,树莓派4B,读出的数据,但是数值很大。然后找了这个方法。

敢问你的传感器具体是哪款?
RaspiSQH 47.7m 2020-05-10 
我用的是am2301,但是那个readme.md里面写了支持这些,包括dht11。不知道以后的系统是不是变了。
Overlay for the DHT11/DHT21/DHT22 humidity/temperature sensors Also sometimes found with the part number(s) AM230x.

py脚本可能确实会读不出来,但c应该可以。
Spoony 小组长 2020-05-10 
@RaspiSQH 难怪,我用的 DHT11 实测下来是有问题的。而且换了两个款式的 DHT11,一个读不到一个度数异常。
最后用上面的方法读出来了。

登录注册 后可回复。