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

Spoony 54.7m2020-05-093342 次点击1 人收藏
因为试过一些方法,不同的树莓派上、不同的传感器可能出现读出的数值有偏差。
只好多提供几种方案给大家选择。

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

敢问你的传感器具体是哪款?
RaspiSQH 117.85m 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,一个读不到一个度数异常。
最后用上面的方法读出来了。
yfhaotian 10cm 2020-10-10 
哥有没有遇到这种情况
pi@raspberrypi:~/data/blink $ sudo gcc -Wall -o dht11.c -lwiringPi
/usr/bin/ld: /usr/lib/gcc/arm-linux-gnueabihf/8/../../../arm-linux-gnueabihf/crt1.o: in function `_start':
(.text+0x34): undefined reference to `main'
collect2: error: ld returned 1 exit status
yfhaotian 10cm 2020-10-10  ♥ 1
问题解决了,编译多几遍就好了
yfhaotian 10cm 2020-10-12 
大哥们有没有用Pi4j 来读过dht11 或其他传感器,能上Java就方便多了,可以开个讨论帖来看看怎么做,在网上有看到用Pi4J 读DS18B20 的,但这个只是温度传感器 ,这几天也调通串口了,看用Java怎么去读串口信息了,哥们有相关的帖子吗?
Spoony 小组长 2020-10-12  ♥ 1
yfhaotian 10cm 2020-10-12 
@Spoony 感谢
fall-rasp 2022-05-04 
我试了一下,这个有时候可能接触不好,会卡在while里面,

登录注册 后可回复。




› 相关内容关注微信公众号