树莓派-DHT11温湿度传感器(基于wiringPi库)

 

数据格式(高位数据在前)

8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验位

通讯过程时序图

 检测模块是否存在:

 

data=1;

data=0;

delay30ms();

data=1; //主机信号发送完毕

while(data);

delay60us();//60us后检测是否电平被DHT拉低

while(!data);

while(data);//往后开始发送数据

数据传输时序分析:

传输0:

 传输1:

 注:按照时序图写的程序在51上可以正常使用,在树莓派上不能使用,原因未知

使用了他人代码

//
//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 = 25;  //use gpio1 to read data
uint32 databuf;

uint8 readSensorData(void)
{
	uint8 crc; 
	uint8 i;
	
	pinMode(pinNumber,OUTPUT); // set mode to output
	digitalWrite(pinNumber, 1); // output a low level
	delayMicroseconds(4);
	digitalWrite(pinNumber, 0); // output a high level 
	delay(25);
	digitalWrite(pinNumber, 1); // output a low level
	delayMicroseconds(60); 
	pinMode(pinNumber, INPUT); // set mode to input
	pullUpDnControl(pinNumber,PUD_UP);
	
	if(digitalRead(pinNumber)==0) //SENSOR ANS
	{
		while(!digitalRead(pinNumber)); //wait to high
		delayMicroseconds(80);
		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)
{
	if (-1 == wiringPiSetup()) {
		printf("Setup wiringPi failed!");
		return 1;
	}
	else
		printf("Setup wiringPi success!\n");
	pinMode(pinNumber, OUTPUT); // set mode to output
	digitalWrite(pinNumber, 1); // output a high level 
	
	while(1) 
	{
	pinMode(pinNumber,OUTPUT); // set mode to output
	digitalWrite(pinNumber, 1); // output a high level 
	//delay(3000);
	if(readSensorData())
	{
		printf("Sensor Read OK!\n");
		printf("RH:%d.%d\n",(databuf>>24)&0xff,(databuf>>16)&0xff); 
		printf("TMP:%d.%d\n",(databuf>>8)&0xff,databuf&0xff);
		//printf("{\"RH\":\"%d.%d\", \"TMP\":\"%d.%d\"}",(databuf>>24)&0xff,(databuf>>16)&0xff,(databuf>>8)&0xff,databuf&0xff);
		databuf=0;
	}
	else
	{
		databuf=0;
		printf("检测中\n");
	}
	}
	return 0;
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值