封装 DHT21 传感器驱动为库

将昨日的驱动改成了一个 Arduino 的库,可以更方便的使用

库为两个文件: dh21.h 和 dh21.cpp

在 E:\arduino-0022\libraries\ 下建立 DH21 目录,把这两个文件置于其中即可使用(由此可见 Arduino 的库创建和使用都很方便),重启 Arduino 开发环境后,可在 Sketch –> Import Library 下看到 DH21

使用示例如下:

#include <dh21.h>

/* the data line of DH21 is pluged in digital pin #12 */
DH21 dh21(12);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if(dh21.get_data() == -1)
    Serial.println("Read DH21 error");
   else
   {
     Serial.print("Temperature: ");
     Serial.print(dh21.temperature());
     Serial.print("C   ");
     Serial.print("Humidity: ");
     Serial.print(dh21.humidity());
     Serial.println("%");
   }

   /* read after 5 seconds */
   delay(5000);
}

运行界面:

dh21.h:

/*
 * dh21.h - Library for DH21/AM2301 digital temperature sensor
 * Created by Jack Tan <jiankemeng@gmail.com>
 * Released into the public domain.
 */
#ifndef _DH21_H_
#define _DH21_H_

#include "WProgram.h"

class DH21
{
	public:
		DH21(int pin);
		float temperature();
		float humidity();
		byte get_data();
		byte data_check();

	private:
		byte read_8bits();
		int pin;
		byte RH_H;
		byte RH_L;
		byte T_H;
		byte T_L;
		byte crc;
};

#endif

dh21.cpp

/*
 * dh21.cpp - Library for DH21/AM2301 digital temperature sensor
 * Created by Jack Tan <jiankemeng@gmail.com>
 * Released into the public domain.
 */

#include "WProgram.h"
#include "dh21.h"

DH21::DH21(int p)
{
	pin = p;
	pinMode(pin, OUTPUT);
	digitalWrite(pin, HIGH);
}

byte DH21::get_data()
{
	byte flag;
	pinMode(pin, OUTPUT);

	/* Bus Low, delay 1 - 5ms */
	digitalWrite(pin, LOW);
	delay(4);

	/* Bus High, delay 40us */
	digitalWrite(pin, HIGH);
	delayMicroseconds(40);

	pinMode(pin, INPUT);
	if(digitalRead(pin) == 0)
	{
		flag = 2;
		/* waitting the ACK signal (Low, 80us) */
		while((digitalRead(pin) == 0) && flag++);
		flag = 2;
		/* waitting the DATA Start signal (High, 80us) */
		while((digitalRead(pin) == 1) && flag++);
		RH_H = read_8bits();
		RH_L = read_8bits();
		T_H = read_8bits();
		T_L = read_8bits();
		crc = read_8bits();

		pinMode(pin, OUTPUT);
		digitalWrite(pin, HIGH);
		return 0;
	}
	else
		return -1;
}

byte DH21::read_8bits()
{
	byte i, flag, data = 0;
	byte temp;
	for(i=0; i<8; i++)
	{
		flag = 2;
		while((digitalRead(pin) == 0) && flag++);
		delayMicroseconds(30);
		temp = 0;
		if(digitalRead(pin) == 1) temp = 1;
		flag = 2;
		while((digitalRead(pin) == 1) && flag++);
		if(flag == 1) break;
		data <<= 1;
		data |= temp;
	}
	return data;
}

byte DH21::data_check()
{
	byte tmp = (T_H + T_L + RH_H + RH_L);
	if(tmp != crc)
	{
		RH_H = 0;
		RH_L = 0;
		T_H = 0;
		T_L = 0;
		return -1;
	}
	else
		return 0;
}

float DH21::temperature()
{
	int T = (T_H << 8 ) | T_L;
	float tt;

	if(T >= 0)
		tt = T/10 + (T%10) * 0.1;
	else
	{
		T = T & 0x7fff;
		tt = -(T/10 + (T%10) * 0.1);
	}

	return tt;
}

float DH21::humidity()
{
	int RH = (RH_H << 8 ) | RH_L;
	float hum;
	hum = RH/10 + (RH%10) * 0.1;

	return hum;
}

发表评论

4 + 9 = ?