前言
由于我给我弟弟(小学生)买了一个树莓派,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;
}