前回の 畑定点観測ロガー(2) – 気温と湿度の取得 で取得した気温と相対湿度から露点を計算によって求めます。
そのため、プログラムのみの変更で、回路等は 畑定点観測ロガー(2) – 気温と湿度の取得 と変わりありません。
ソースコード
dht22.h
//
// FILE: dht22.h
// VERSION: 1.0.1.0
// PURPOSE: DHT22 library for Arduino
// (Temperature & Humidity Sensor)
//
// URL: http://mwlab.net/2012/05/arduino_logger_03.html
//
// HISTORY:
// see dht.cpp file
//
#ifndef dht22_h
#define dht22_h
#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif
#define DHT22_LIB_VERSION "1.0.1.0"
#define DHT22_OK 0
#define DHT22_ERROR_CHECKSUM -1
#define DHT22_ERROR_TIMEOUT -2
class DHT22
{
public:
int get(uint8_t pin);
double humidity;
double temperature;
double dewpoint;
private:
uint8_t bits[5]; // buffer to receive data
int read(uint8_t pin);
};
#endif
dht22.cpp
//
// FILE: dht22.cpp
// VERSION: 1.0.1.0
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
//
// DATASHEET:
// http://pub.idisk-just.com/fview/Ofo5BntkKx3FZmmLkRMOsMRNS439HU6_QbdmJ9kpFT_svST6HEDy-obI8avf2qKAantH3a90pVj1c27ziNZVvWiyI-AvRLFc.pdf
//
// HISTORY:
// 1.0.1.0 by Ugetsu Yobane (2012/10/10)
// Add calculate Dewpoint
// 1.0.0.0 by Ugetsu Yobane (2012/05/20)
// rebuild by DHT library
// http://arduino.cc/playground/Main/DHTLib
//
#include "dht22.h"
#define TIMEOUTCOUNT 10000
/////////////////////////////////////////////////////
//
// PUBLIC
//
// return values:
// DHT22_OK
// DHT22_ERROR_CHECKSUM
// DHT22_ERROR_TIMEOUT
int DHT22::get(uint8_t pin)
{
// Read Values
int rv = read(pin);
if (rv != 0) return rv;
// Test Checksum
uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3];
if (bits[4] != sum) return DHT22_ERROR_CHECKSUM;
// Convert and Store
humidity = word(bits[0], bits[1]) * 0.1;
int sign = 1;
if (bits[2] & 0x80) // negative temperature
{
bits[2] = bits[2] & 0x7F;
sign = -1;
}
temperature = sign * word(bits[2], bits[3]) * 0.1;
// Calculate Dew point
float k;
k = log(humidity/100) + (17.62 * temperature) / (243.12 + temperature);
dewpoint = 243.12 * k / (17.62 - k);
return DHT22_OK;
}
/////////////////////////////////////////////////////
//
// PRIVATE
//
// return values:
// DHT22_OK
// DHT22_ERROR_TIMEOUT
int DHT22::read(uint8_t pin)
{
// Init Buffervar to Receive Data
uint8_t cnt = 7;
uint8_t idx = 0;
// Empty Buffer
bits[0] = bits[1] = bits[2] = bits[3] = bits[4] = 0;
// Start Singnal
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delayMicroseconds(1500); // 1ms < x
digitalWrite(pin, HIGH);
delayMicroseconds(40); // 20us < x < 40us
pinMode(pin, INPUT);
// Get Acknowledge or Timeout
unsigned int loopCnt = TIMEOUTCOUNT;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHT22_ERROR_TIMEOUT;
loopCnt = TIMEOUTCOUNT;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHT22_ERROR_TIMEOUT;
// Read the Output - 40 bits => 5 bytes
for (int i=0; i<40; i++)
{
loopCnt = TIMEOUTCOUNT;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHT22_ERROR_TIMEOUT;
unsigned long t = micros();
loopCnt = TIMEOUTCOUNT;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHT22_ERROR_TIMEOUT;
if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
if (cnt == 0) // next byte?
{
cnt = 7;
idx++;
}
else cnt--;
}
return DHT22_OK;
}
[/c]
DHT22Tester.ino
[c]
//
// FILE: DHT22Tester.ino
// PURPOSE: DHT22 library test sketch for Arduino
//
#include <dht22.h>
DHT22 DHT;
#define DHT22_PIN 2
void setup()
{
Serial.begin(115200);
Serial.print("DHT22 LIBRARY VERSION: ");
Serial.println(DHT22_LIB_VERSION);
Serial.println();
Serial.println("State,\tTemperature (C),\tHumidity (%),\tDewpoint (C)");
delay(2000); // Waits until a sensor is stabilized.
}
void loop()
{
// Read Data
int chk = DHT.get(DHT22_PIN);
switch (chk)
{
case DHT22_OK:
Serial.print("OK,\t");
// Display Data
Serial.print(DHT.temperature, 1);
Serial.print(",\t");
Serial.print(DHT.humidity, 1);
Serial.print(",\t");
Serial.println(DHT.dewpoint, 1);
break;
case DHT22_ERROR_CHECKSUM:
Serial.println("Checksum error,\t");
break;
case DHT22_ERROR_TIMEOUT:
Serial.println("Time out error,\t");
break;
default:
Serial.println("Unknown error,\t");
break;
}
delay(5000);
}
[wpdm_file id=2]