DTH111 温度传感器 获取温度 驱动 树莓派

前言

由于我给我弟弟(小学生)买了一个树莓派,So,需要一个例子激发他的兴趣(哭但是好像没啥用)于是我就写了这个

正文开始--------

DTH111.h

/*
2018-02-13 1.0
*/

#ifndef __DTH111_H__
#define __DTH111_H__
#include <sys/time.h>
#include <unistd.h>
#include <wiringPi.h>
typedef struct DTH111 {
	double Temperature;//温度
	int    Humidity;   //湿度
}DTH111;
int GetDTH111Data(int GPIO, DTH111 *UDTH111);
#endif //__DTH111_H__

DTH111.c

#include "DTH111.h"

int GetDTH111Data(int GPIO, DTH111 * UDTH111)
{
	wiringPiSetup();

	//变量声明在前面是为了避免后期在读数据过程中产生内存分配,花费不必要的时间,因为GPIO的操作都是微妙级别的

	struct timeval tv_start;			//开始时间
	struct timeval tv_stop;				//结束时间
	int i = 0;					//for需要的临时变量
	int Musleep = 0;			        //防止读取电平的时候进入死循环
	int data = 0;					//数据
	int Effective = 0;				//效验值

	//唤醒DTH111
	pinMode(GPIO, OUTPUT);
	digitalWrite(GPIO, LOW);
	delay(20);//延时19ms
	digitalWrite(GPIO, HIGH);
	usleep(20);//延时25us
	pinMode(GPIO, INPUT);

	//判断传感器回应
	Musleep = 300000;
	while(digitalRead(GPIO) == LOW && Musleep--){
	}
	usleep(80);//延时80微秒
	Musleep = 300000;
	while(digitalRead(GPIO) == HIGH && Musleep--){
	}
	
	//开始接收数据
	for (i = 31; i > -1; i--) {
		Musleep = 300000;
		while (digitalRead(GPIO) == LOW && Musleep--){
		}
		Musleep = 300000;
		gettimeofday(&tv_start, NULL);//开始计时
		while (digitalRead(GPIO) == HIGH && Musleep--){
		}
		gettimeofday(&tv_stop, NULL);//结束计时

		if ((tv_stop.tv_sec - tv_start.tv_sec) * 1000000 + (tv_stop.tv_usec - tv_start.tv_usec) > 30) {
			data |= (1 << i);
		}
	}
	
	//获取效验值
	for (i = 7; i > -1; i--) {
		Musleep = 300000;
		while (digitalRead(GPIO) == LOW && Musleep--){
		}
		Musleep = 300000;
		gettimeofday(&tv_start, NULL);//开始计时
		while (digitalRead(GPIO) == HIGH && Musleep--){
		}
		gettimeofday(&tv_stop, NULL);//结束计时

		if ((tv_stop.tv_sec - tv_start.tv_sec) * 1000000 + (tv_stop.tv_usec - tv_start.tv_usec) > 30) {
			Effective |= (1 << i);
		}
	}

	//数据效验
	if (*(((char*)(&data)) + 3) + *(((char*)(&data)) + 2) + *(((char*)(&data)) + 1) + *(((char*)(&data)) + 0) != Effective ) {
		return -1;
	}

	//填充数据
	UDTH111->Humidity = 1 +  *((char *)(&data) + 3);
	if (*((char *)(&data)) + 1 >= 10 ){
		UDTH111->Temperature = (*((char *)(&data)) + 1) * 0.01;
	}else{
		UDTH111->Temperature = (*((char *)(&data)) + 1) * 0.1;
	}
	UDTH111->Temperature = 1 + ((*((char *)(&data) + 1)) * 1.0) + UDTH111->Temperature;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值