まずは、気温と湿度を取得する。
材料リスト
- DHT22 ¥1,260
- 炭素被膜抵抗 1/4w 4.7kΩ ¥1 (100本入りの販売のため¥100)
- 絶縁型ラジアルリードタイプ積層セラミックコンデンサー0.1μF ¥10(10本入りの販売のため¥100)
データシート
抵抗はプルアップと呼ばれるもので、信号線の信号を正しい状態に保つためのもです。
コンデンサはバイパスコンデンサと呼ばれるもので、電流を安定させるためのものです。
抵抗値およびコンデンサ容量はデータシートに書かれていますので確認してください。
ソースコード
dht22.h
//
// FILE: dht22.h
// VERSION: 1.0.0.0
// PURPOSE: DHT22 library for Arduino
// (Temperature & Humidity Sensor)
//
// URL: http://mwlab.net/2012/05/arduino_logger_02.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.0.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;
private:
uint8_t bits[5]; // buffer to receive data
int read(uint8_t pin);
};
#endif
dht22.cpp
//
// FILE: dht22.cpp
// VERSION: 1.0.0.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.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;
// 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;
// Test Checksum
uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3];
if (bits[4] != sum) return DHT22_ERROR_CHECKSUM;
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
for (int i=0; i< 5; i++) bits[i] = 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 (%)");
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.println(DHT.humidity, 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=1]
ソースコードは基本的にはDHTLibと一緒です。
ただ、今後いろいろ機能を追加するのでいらない部分は削除して保守性を向上させ容量の節約したいので内容把握のため手を入れました。

