DHT11温湿度传感器

这是我买的第一个传感器,虽然买了有几个月,但是暑假才能玩起来,这也算是IOT华为杯前的一个小热身吧。

立创商城的DHT11基本参数:

产品链接:https://item.szlcsc.com/118309.html

1、VDD 供电 3.3~5.5V DC
2、DATA 串行数据,单总线
3、NC 空脚
4、GND 接地,电源负极

然后,我搜了一些教程,基于我原有的树莓派3B,得到了如下的操作。

Vcc 引脚接 5V
DATA 引脚接 WiringPi 编码 7
GND 引脚接树莓派的 GND

 

安装 WiringPi

这里使用了 WiringPi 库,如果已经安装过可以跳过这一步。

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

C语言源代码

需要保存为dht11.c到WiringPi文件中
#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 = 7;
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("PIN:%d\n", pinNumber);

if (-1 == wiringPiSetup()) {
printf("Setup wiringPi failed!");
return 1;
}

pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level

printf("Starting...\n");
while (1)
{
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
delay(3000);
if (readSensorData())
{
printf("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("Sensor dosent ans!\n");
databuf = 0;
}
}
return 0;
}

编译运行:

第一次:

gcc -Wall -o dht11 dht11.c -lwiringPi
sudo ./dht11

后续:

cd WiringPi

gcc -Wall -o dht11 dht11.c -lwiringPi
sudo ./dht11

展示:

(我在源代码里加上了小注释shidu   wendu)
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像