撰写自己的 Arduino 库

来自Jack's Lab
跳转到: 导航, 搜索

DHT21/AM2301 数字温湿度传感器 为例,示例如下

Arduino 封装的库都在 /PATH/TO/Arduino-1.0.1/libraries 下,因此我们自己写的库也要放在这个目录下

在 /PATH/TO/Arduino-1.0.1/libraries 下建立 DH21 这个目录,把 dh21.h dh21.cpp 这两个文件置于其中即可使用(由此可见 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);
}


运行界面:


Create-arduino-dh21-lib.png


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 <Arduino.h>

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

	private:
		char read_8bits();
		int pin;
		char RH_H;
		char RH_L;
		char T_H;
		char T_L;
		char 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 "dh21.h"

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

char DH21::get_data()
{
	char 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;
}

char DH21::read_8bits()
{
	char i, flag, data = 0;
	char 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;
}


char DH21::data_check()
{
	char 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()
{
	uint16_t 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()
{
	uint16_t RH = (uint16_t)(RH_H << 8) | RH_L;
	float hum;
	hum = RH/10 + (RH%10) * 0.1;

	return hum;
}














个人工具
名字空间

变换
操作
导航
工具箱