Arduinoで温湿度計

公開日: 電子工作 | , , ,

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。
以前「パソコンで温度計」と言うものを作りましたが、今回はパソコン無しでArduino単体で動作するものを作っていきたいと思います。

 

AE-HDC1000

AE-HDC1000

AE-HDC1000

今回使った、秋月電子で販売されている温湿度センサーモジュールです。

HDC1000使用 温湿度センサーモジュール – 秋月電子

仕様

電源電圧:3~5V
インターフェース:I2C
I2Cアドレス:0×40
I2Cスピード: 最大400kHz

温度分解能:11bit(0.078125℃)、14bit(0.009765625℃)
温度計測精度:±0.2℃
温度測定レンジ:-20~+85℃

湿度分解能:8bit(0.390625%)、11bit(0.048828125%)、14bit(0.006103515625%)
湿度計測精度:±3%
湿度測定レンジ:0~100%(無結露状態)

※注意点

このモジュールには、I2Cのプルアップ用抵抗(10k)が基板に搭載されています。
他のI2Cモジュールであれば、この抵抗は半田ジャンパー等で有効にしたり無効にしたりできたのですが、このモジュールに限っては無効にすることが出来ません。

 

接続

Arduinoで温湿度計

LCDも同じく秋月で購入した16x2のものを使っています。

 

プログラム

#include <Wire.h><br />
<br />
#define LCD_ADRS  0x3E<br />
#define HDC1000_ADRS  0x40<br />
<br />
void setup()<br />
{<br />
  Wire.begin();<br />
  <br />
  LCD_init();<br />
  <br />
  LCD_command(0x80+0x0);<br />
  LCD_write('T');<br />
  LCD_write('e');<br />
  LCD_write('m');<br />
  LCD_write('p');<br />
  <br />
  LCD_command(0x80+0x40);<br />
  LCD_write('H');<br />
  LCD_write('u');<br />
  LCD_write('m');<br />
  LCD_write('i');<br />
  LCD_write('d');<br />
  LCD_write('i');<br />
  LCD_write('t');<br />
  LCD_write('y');<br />
}<br />
<br />
void loop()<br />
{<br />
    Wire.beginTransmission(HDC1000_ADRS);<br />
    Wire.write(0x00);<br />
    Wire.endTransmission(false);<br />
    delay(15);<br />
    Wire.requestFrom(HDC1000_ADRS,4);<br />
<br />
    volatile int temperature,humidity;<br />
    volatile unsigned long ul;<br />
    volatile byte *p1 = (byte*)&ul;<br />
    <br />
    ul=0;<br />
    *(p1+1) = Wire.read();<br />
    *p1 = Wire.read();<br />
   <br />
    ul*=100;<br />
    ul<<=4;<br />
    temperature=*(((int *)&ul)+1);<br />
    temperature-=400;<br />
<br />
    ul=0;<br />
    *(p1+1) = Wire.read();<br />
    *p1 = Wire.read();<br />
<br />
    ul*=1000;<br />
    humidity=*(((int *)&ul)+1);<br />
<br />
    LCD_command(0x80+0x08);<br />
    if(temperature<0)<br />
    {<br />
      LCD_write('-');<br />
      temperature=abs(temperature);<br />
    }<br />
    else<br />
    {<br />
      LCD_write('+');<br />
    }<br />
    <br />
    LCD_write('0'+(temperature/1000));<br />
    temperature%=1000;<br />
    LCD_write('0'+(temperature/100));<br />
    temperature%=100;<br />
    LCD_write('0'+(temperature/10));<br />
    temperature%=10;<br />
    LCD_write('.');<br />
    LCD_write('0'+temperature);<br />
    LCD_write(0xDF);<br />
    LCD_write('C');<br />
    <br />
    LCD_command(0x80+0x49);<br />
    LCD_write('0'+(humidity/1000));<br />
    humidity%=1000;<br />
    LCD_write('0'+(humidity/100));<br />
    humidity%=100;<br />
    LCD_write('0'+(humidity/10));<br />
    humidity%=10;<br />
    LCD_write('.');<br />
    LCD_write('0'+humidity);<br />
    LCD_write('%');<br />
<br />
    delay(1000);<br />
}<br />
<br />
void LCD_write(byte t_data)<br />
{<br />
  Wire.beginTransmission(LCD_ADRS);<br />
  Wire.write(0x40);<br />
  Wire.write(t_data);<br />
  Wire.endTransmission();<br />
  delay(1);<br />
}<br />
<br />
void LCD_command(byte t_command)<br />
{<br />
  Wire.beginTransmission(LCD_ADRS);<br />
  Wire.write(0x00);<br />
  Wire.write(t_command);<br />
  Wire.endTransmission();<br />
  delay(10);<br />
}<br />
<br />
void LCD_init()<br />
{<br />
  LCD_command(0x38);<br />
  LCD_command(0x39);<br />
  LCD_command(0x14);<br />
  LCD_command(0x73);<br />
  LCD_command(0x52);  // 5V<br />
  //LCD_command(0x56);  // 3V<br />
  LCD_command(0x6C);<br />
  LCD_command(0x38);<br />
  LCD_command(0x01);<br />
  LCD_command(0x0C);<br />
}<br />

※Arduino UNO / Duemilanoveで動作確認しています。

 

プログラムの動作

このプログラムを走らせると、約1秒毎に温度・湿度を計測し、LCD上に表示します。

Arduinoで温湿度計

Arduinoで温湿度計

この日は雨だったので湿度が高めでした。

個人的な感想ですが、AE-HDC1000は分解能が温度・湿度共に14ビットと高いのですが、実際に試してみると数値の揺れが結構あるので、温度は0.1℃、湿度1%程度なのかなと感じました。

 

関連記事

raspi-pin-header

そうだ、Raspberry Pi用にピンヘッダーのオス・メス変換アダプタを作ろう

  Raspberry PiのI/O端子は、ピンヘッダーとなっていて、電極が出っ張ってる

記事を読む

Androidで気圧高度計

androidで気圧・高度計(LPS331AP使用)

Androidと大気圧センサー(LPS331AP)をイヤフォンジャックで繋いで気圧と高度、ついで

記事を読む

no image

米粒AVRのEAGLEライブラリ

EAGLEを使って米粒AVR(ATtiny10)の回路図を書こうと思ったら何か様子がおかしい。

記事を読む

no image

PIC24FJ64GB002でADKを試す(その2)

 前回「PIC24FJ64GB002でADKを試す(その1)」では回路の説明までしたので、

記事を読む

no image

PIC24FJ64GB002でADKを試す(その1)

先日、MicrochipからPIC向けのAndroid Open Accessoryのライブラリが公

記事を読む

Androidから米粒AVRへデータを送る

米粒AVRでSoftModem的なこと その2

前回は「米粒AVRからAndroidへデータを送る」ことを試しました。 今回はその逆の「And

記事を読む

米粒AVRで温度計

米粒AVRで温度計(STTS751使用)

前回までに紹介したI2CライブラリとLCDライブラリを使って作る、温度計のサンプルです。 温度

記事を読む

no image

Android Open Accessory開発時のWiFiデバッグ

Android Open Accessory開発時のデバッグは、ADBをWiFiで接続しろと、USB

記事を読む

X-Window

Raspberry Piのスクリーンショット

  ブログで使う用に、Raspberry Piのスクリーンショットを撮りたいと思った時、

記事を読む

no image

AndroidとArduinoの接続で使えそうなBluetoothモジュール

1ヶ月ほど前に書いた、Android + Bluetooth + Arduino が割と人気があるよ

記事を読む

Arduinoで温湿度データロガー
Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを

Arduinoで温湿度計
Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前

SDカード・マイクロSDカード
ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduin

秋月電子 リアルタイムクロック(RTC)モジュール
秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを

秋月電子 キャラクタLCD
秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、

PAGE TOP ↑