撰写自己的 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); }
运行界面:
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; }