RubyエンジニアがArduinoで電子工作やってみた~温湿度センサ編~


はじめに

皆様、こんにちは!
Toretaのサーバサイドエンジニア兼佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです!
最近、ひょろんなことから電子工作を始めたので、作成したものを整理・紹介したく、記事を書きました。
RubyエンジニアがArduinoで電子工作やってみた~超音波距離センサ編~の続編で、今回は温湿度センサを使いました。

使ったセンサ

  • DHT11

DHT11は温度と湿度をカリブレーション済みの状態で出荷されているセンサーです。信号はデジタル信号となっています。
温度は1°C程度の誤差、湿度は4%程度の誤差で測定可能ということになってます。
より高性能なDHT22もあります。

配線

  • + (DHT11) -> +5V (Arduino)
  • S (DHT11) -> Digital_Pin (Arduino)
  • - (DHT11) -> GROUND (Arduino)

作ったもの

温湿度から室内の不快指数を算出し、ディスプレイに表示します。
そして、不快指数に応じてLEDが灯ったりブザーが鳴ります。
また、スマホ用モバイルバッテリーと接続して持ち運べるようにしました。

不快指数というのは、下記の通りです。
不快指数 = 0.81*温度 + 0.01*湿度 × ( 0.99*温度 − 14.3 ) + 46.3
60より小さい:寒いと感じる→青色LEDが灯る。
61〜74:普通→黄色LEDが灯る。
75より大きい:暑いと感じる→赤色LEDが灯る&ブザーが鳴る。
参考:https://ja.wikipedia.org/wiki/不快指数

ソースコード

DHT11を操作するためにはライブラリを使用し、includeします。
DHT-sensor-library:https://github.com/adafruit/DHT-sensor-library


#include <LiquidCrystal.h>
#include <dht.h>                  
dht DHT;
const int dht11_data = 6;     
int temp=0;
int hum=0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int redLed = 10;
int greenLed = 9;
int blueLed = 8;
int buzzer = 7;

void setup() {
  lcd.begin(16,2);
  lcd.print("Welcome to");
  lcd.setCursor(0,1);
  lcd.print("Discomfort Check");
  delay(2000);
  lcd.clear();
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() { 
  DHT.read(dht11_data);
  temp=DHT.temperature;
  hum=DHT.humidity;
  float discomfortIndex = 0.81 * temp + 0.01 * hum * (0.99 * temp - 14.3) + 46.3;

  lcd.clear();
  lcd.print("H=");
  lcd.print(hum);
  lcd.print("%");
  lcd.setCursor(6,0);
  lcd.print("T=");           
  lcd.print(temp);
  lcd.write(0xDF);
  lcd.print("C");

  lcd.setCursor(0,1) ;
  lcd.print("Discomfort=");      
  lcd.print(discomfortIndex);

  if (discomfortIndex >= 75) {
   digitalWrite(redLed, HIGH); 
   digitalWrite(greenLed, LOW);
   digitalWrite(blueLed, LOW);
   digitalWrite(buzzer, HIGH);
  } else if(discomfortIndex >= 60 && discomfortIndex < 75) {
   digitalWrite(redLed, LOW); 
   digitalWrite(greenLed, HIGH);
   digitalWrite(blueLed, LOW);
   digitalWrite(buzzer, LOW);
  } else {
   digitalWrite(redLed, LOW); 
   digitalWrite(greenLed, LOW);
   digitalWrite(blueLed, HIGH);   
   digitalWrite(buzzer, LOW); 
  }
  delay(1000);
}

終わりに

より様々なセンサを使用して、実生活で使用できるハードウェアを作成したいです!
次回は人感センサをしようと思います(∩゚Д゚)∩