mirror of
https://github.com/niesteszeck/idDHT11.git
synced 2025-03-15 04:27:29 +03:00
First commit library created
This commit is contained in:
commit
931a40fb41
173
idDHT11.cpp
Normal file
173
idDHT11.cpp
Normal file
@ -0,0 +1,173 @@
|
||||
/*
|
||||
FILE: idDHT11.cpp
|
||||
VERSION: 0.1
|
||||
PURPOSE: Interrupt driven Lib for DHT11 with Arduino.
|
||||
LICENCE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
|
||||
DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf
|
||||
|
||||
Based on DHT11 library: http://playground.arduino.cc/Main/DHT11Lib
|
||||
*/
|
||||
|
||||
#include "idDHT11.h"
|
||||
#define DEBUG_IDDHT11
|
||||
|
||||
idDHT11::idDHT11(int pin, int intNumber,void (*callback_wrapper)()) {
|
||||
init(pin, intNumber,callback_wrapper);
|
||||
}
|
||||
|
||||
void idDHT11::init(int pin, int intNumber, void (*callback_wrapper) ()) {
|
||||
this->intNumber = intNumber;
|
||||
this->pin = pin;
|
||||
this->isrCallback_wrapper = callback_wrapper;
|
||||
hum = 0;
|
||||
temp = 0;
|
||||
pinMode(pin, OUTPUT);
|
||||
digitalWrite(pin, HIGH);
|
||||
state = STOPED;
|
||||
status = IDDHTLIB_ERROR_NOTSTARTED;
|
||||
}
|
||||
|
||||
int idDHT11::acquire() {
|
||||
if (state == STOPED || state == ACQUIRED) {
|
||||
|
||||
//set the state machine for interruptions analisis of the signal
|
||||
state = RESPONSE;
|
||||
|
||||
// EMPTY BUFFER and vars
|
||||
for (int i=0; i< 5; i++) bits[i] = 0;
|
||||
cnt = 7;
|
||||
idx = 0;
|
||||
hum = 0;
|
||||
temp = 0;
|
||||
|
||||
// REQUEST SAMPLE
|
||||
pinMode(pin, OUTPUT);
|
||||
digitalWrite(pin, LOW);
|
||||
delay(18);
|
||||
digitalWrite(pin, HIGH);
|
||||
delayMicroseconds(40);
|
||||
pinMode(pin, INPUT);
|
||||
|
||||
// Analize the data in an interrupt
|
||||
us = micros();
|
||||
attachInterrupt(intNumber,isrCallback_wrapper,FALLING);
|
||||
|
||||
return IDDHTLIB_ACQUIRING;
|
||||
} else
|
||||
return IDDHTLIB_ERROR_ACQUIRING;
|
||||
}
|
||||
void idDHT11::isrCallback() {
|
||||
int newUs = micros();
|
||||
int delta = (newUs-us);
|
||||
us = newUs;
|
||||
if (delta>6000) {
|
||||
status = IDDHTLIB_ERROR_TIMEOUT;
|
||||
state = STOPED;
|
||||
detachInterrupt(intNumber);
|
||||
return;
|
||||
}
|
||||
switch(state) {
|
||||
case RESPONSE:
|
||||
if(delta<25)
|
||||
return; //do nothing, it started the response signal
|
||||
if(125<delta && delta<170) {
|
||||
state = DATA;
|
||||
} else {
|
||||
detachInterrupt(intNumber);
|
||||
status = IDDHTLIB_ERROR_TIMEOUT;
|
||||
state = STOPED;
|
||||
}
|
||||
break;
|
||||
case DATA:
|
||||
if(delta<10) {
|
||||
detachInterrupt(intNumber);
|
||||
status = IDDHTLIB_ERROR_DELTA;
|
||||
state = STOPED;
|
||||
// return;
|
||||
} else if(60<delta && delta<135) { //valid in timing
|
||||
if(delta>90) //is a one
|
||||
bits[idx] |= (1 << cnt);
|
||||
if (cnt == 0) { // whe have fullfilled the byte, go to next
|
||||
cnt = 7; // restart at MSB
|
||||
if(idx++ == 4) { // go to next byte, if whe have got 5 bytes stop.
|
||||
detachInterrupt(intNumber);
|
||||
// WRITE TO RIGHT VARS
|
||||
// as bits[1] and bits[3] are allways zero they are omitted in formulas.
|
||||
hum = bits[0];
|
||||
temp = bits[2];
|
||||
uint8_t sum = bits[0] + bits[2];
|
||||
if (bits[4] != sum) {
|
||||
status = IDDHTLIB_ERROR_CHECKSUM;
|
||||
state = STOPED;
|
||||
} else {
|
||||
status = IDDHTLIB_OK;
|
||||
state = ACQUIRED;
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else cnt--;
|
||||
} else {
|
||||
detachInterrupt(intNumber);
|
||||
status = IDDHTLIB_ERROR_TIMEOUT;
|
||||
state = STOPED;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
bool idDHT11::acquiring() {
|
||||
if (state != ACQUIRED && state != STOPED)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
int idDHT11::getStatus() {
|
||||
return status;
|
||||
}
|
||||
float idDHT11::getCelsius() {
|
||||
IDDHT11_CHECK_STATE;
|
||||
return temp;
|
||||
}
|
||||
|
||||
float idDHT11::getHumidity() {
|
||||
IDDHT11_CHECK_STATE;
|
||||
return hum;
|
||||
}
|
||||
|
||||
float idDHT11::getFahrenheit() {
|
||||
IDDHT11_CHECK_STATE;
|
||||
return temp * 1.8 + 32;
|
||||
}
|
||||
|
||||
float idDHT11::getKelvin() {
|
||||
IDDHT11_CHECK_STATE;
|
||||
return temp + 273.15;
|
||||
}
|
||||
|
||||
// delta max = 0.6544 wrt dewPoint()
|
||||
// 5x faster than dewPoint()
|
||||
// reference: http://en.wikipedia.org/wiki/Dew_point
|
||||
double idDHT11::getDewPoint() {
|
||||
IDDHT11_CHECK_STATE;
|
||||
double a = 17.271;
|
||||
double b = 237.7;
|
||||
double temp_ = (a * (double) temp) / (b + (double) temp) + log( (double) hum/100);
|
||||
double Td = (b * temp_) / (a - temp_);
|
||||
return Td;
|
||||
|
||||
}
|
||||
// dewPoint function NOAA
|
||||
// reference: http://wahiduddin.net/calc/density_algorithms.htm
|
||||
double idDHT11::getDewPointSlow() {
|
||||
IDDHT11_CHECK_STATE;
|
||||
double A0= 373.15/(273.15 + (double) temp);
|
||||
double SUM = -7.90298 * (A0-1);
|
||||
SUM += 5.02808 * log10(A0);
|
||||
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
|
||||
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
|
||||
SUM += log10(1013.246);
|
||||
double VP = pow(10, SUM-3) * (double) hum;
|
||||
double T = log(VP/0.61078); // temp var
|
||||
return (241.88 * T) / (17.558-T);
|
||||
}
|
||||
// EOF
|
73
idDHT11.h
Normal file
73
idDHT11.h
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
FILE: idDHT11.h
|
||||
VERSION: 0.1
|
||||
PURPOSE: Interrupt driven Lib for DHT11 with Arduino.
|
||||
LICENCE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
|
||||
DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf
|
||||
|
||||
Based on DHT11 library: http://playground.arduino.cc/Main/DHT11Lib
|
||||
*/
|
||||
|
||||
|
||||
#ifndef idDHT11_H__
|
||||
#define idDHT11_H__
|
||||
|
||||
#if defined(ARDUINO) && (ARDUINO >= 100)
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
#define IDDHT11LIB_VERSION "0.1"
|
||||
|
||||
// state codes
|
||||
#define IDDHTLIB_OK 0
|
||||
#define IDDHTLIB_ACQUIRING 1
|
||||
#define IDDHTLIB_ACQUIRED 2
|
||||
#define IDDHTLIB_RESPONSE_OK 3
|
||||
|
||||
// error codes
|
||||
#define IDDHTLIB_ERROR_CHECKSUM -1
|
||||
#define IDDHTLIB_ERROR_TIMEOUT -2
|
||||
#define IDDHTLIB_ERROR_ACQUIRING -3
|
||||
#define IDDHTLIB_ERROR_DELTA -4
|
||||
#define IDDHTLIB_ERROR_NOTSTARTED -5
|
||||
|
||||
#define IDDHT11_CHECK_STATE if(state == STOPED) \
|
||||
return status; \
|
||||
else if(state != ACQUIRED) \
|
||||
return IDDHTLIB_ERROR_ACQUIRING;
|
||||
|
||||
class idDHT11
|
||||
{
|
||||
public:
|
||||
idDHT11(int pin, int intNumber,void (*isrCallback_wrapper)());
|
||||
void init(int pin, int intNumber,void (*isrCallback_wrapper)());
|
||||
void isrCallback();
|
||||
int acquire();
|
||||
float getCelsius();
|
||||
float getFahrenheit();
|
||||
float getKelvin();
|
||||
double getDewPoint();
|
||||
double getDewPointSlow();
|
||||
float getHumidity();
|
||||
bool acquiring();
|
||||
int getStatus();
|
||||
|
||||
private:
|
||||
|
||||
void (*isrCallback_wrapper)(void);
|
||||
|
||||
enum states{RESPONSE=0,DATA=1,ACQUIRED=2,STOPED=3,ACQUIRING=4};
|
||||
volatile states state;
|
||||
volatile int status;
|
||||
volatile byte bits[5];
|
||||
volatile byte cnt;
|
||||
volatile byte idx;
|
||||
volatile int us;
|
||||
int intNumber;
|
||||
int pin;
|
||||
volatile float hum;
|
||||
volatile float temp;
|
||||
};
|
||||
#endif // idDHT11_H__
|
Loading…
x
Reference in New Issue
Block a user