見出し画像

KUMIKOMI NO SEKAI ~ #6 今何℃!?そうね 大体ね~

と言うことで、今回は温湿度気圧計を作ります。単純に温度、湿度、気圧をセンサーから読み出して表示するだけでは面白くないので、照度センサーとボタンの状態に依って動きを付けてみましょうか。少しだけシステムっぽくなります。

関連モジュール

今回関連するモジュールを以下の通り。

温湿度

システムの仕様

周囲の明るさが一定以上(普通に照明を付けている状態)であれば、温湿度または気圧をOLEDディスプレイに表示します。最初は温湿度を表示し、ボタンが押される度に温湿度/気圧の表示を切り替えます。部屋の電気を消すとOLEDディスプレイの表示も消えます。

ライブラリの準備

照度センサーはアナログ信号で状態を読み出せるので特別なライブラリは不要です。温度/湿度と気圧については各ライブラリのインストールが必要です。前回と同じ要領でArduino IDEのライブラリマネージャから検索ワード、Grove Temperature and Humidity Sensor(DHT11)Grove BMP280でヒットしたライブラリをインストールして下さい。DHT11が温湿度用、BMP280が気圧用です。

プログラム設計

今回のプログラムは以下のフローになります。

画像2

ソースコード

それでは設計に従ってソースコードを書いて行きましょう。今回もライブラリが賢いのでそれらの関数を呼び出せばやりたいことが全部できてしまいます。ボタン状態取得はKUMIKOMI NO SEKAI #2で作った処理を関数化して移殖します。

 #include <Arduino.h>
 #include <U8x8lib.h>
 #include "DHT.h"
 #include "Seeed_BMP280.h"

#define DHTPIN 3            // 温湿度ピン番号
#define DHTTYPE DHT11       // DHTタイプ 11
#define MODE_TEMP_HUMI  0   // 温湿度を表示モード
#define MODE_AIR_PRESS  1   // 気圧表示モード

// ボタン関連のDefine定義
#define WAIT_HIGH   0   // High待ち
#define CHECK_HIGH  1   // Highチャタリングチェック中
#define WAIT_LOW    2   // Low待ち
#define CHECK_LOW   3   // Lowチャタリングチェック中
#define CONFIRM     4   // 確定

// 温湿度・気圧ライブラリ
DHT dht(DHTPIN, DHTTYPE); // 温湿度センサーライブラリ
BMP280 bmp280;            // 圧力センサーライブラリ

// OLEDライブラリ
U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

int mode;                // 表示モード
int Lightpin = A6;       // 照度センサーピン
int Buttonpin = 6;       // ボタンピン
int buttonState = 0;     // ボタンのH/L状態
int buttonCheck = 0;     // チャタリングチェック状態

void setup(void) {
 
 mode = MODE_TEMP_HUMI;  // 最初は温湿度表示モード

 bmp280.init();          // 気圧ライブラリ初期化
 dht.begin();            // 温湿度ライブラリ初期化
 u8x8.begin();           // OLEDライブラリ初期化
 u8x8.setPowerSave(0);   // パワーセーブモード
 u8x8.setFlipMode(1);    // 表示180度反転
 
 pinMode(Buttonpin, OUTPUT);
}


void loop(void) {
 int light;
 
 light = analogRead(Lightpin);   // 照度センサーの状態を取得

 if (45 < light) {  // 明るい場合
   
   if (mode == MODE_TEMP_HUMI) {
     DisplayTempHumi();    // 温湿度を表示
   } else {
     DisplayAirPressure(); // 気圧を表示
   }
   
 } else {            // 暗い場合
   u8x8.clear();
 }

 // ボタン押下チェック
 ButtonCheck();
}

//--------------------------------
//  温湿度を表示する
//--------------------------------
void DisplayTempHumi(void) {
 float temp, humi;
 temp = dht.readTemperature();   // 温度取得
 humi = dht.readHumidity();      // 気圧取得

 // OLEDに表示
 u8x8.setFont(u8x8_font_chroma48medium8_r);
 u8x8.setCursor(0, 33);
 u8x8.print("Temp:");
 u8x8.print(temp);
 u8x8.print("C");
 u8x8.setCursor(0,50);
 u8x8.print("Humidity:");
 u8x8.print(humi);
 u8x8.print("%");
 u8x8.refreshDisplay();
}

//---------------------------------
//  気圧を表示する
//---------------------------------
void DisplayAirPressure(void) {
 float pressure;
 pressure = bmp280.getPressure();  // 気圧取得

 // OLEDに表示
 u8x8.setCursor(0,33);
 u8x8.print("Pressure:");
 u8x8.setCursor(0,50);
 u8x8.print(pressure);
 u8x8.print("Pa");
 u8x8.refreshDisplay();
}

//----------------------------------
//  ボタンの押下判定
//----------------------------------
void ButtonCheck(void)
{
 buttonState = digitalRead(Buttonpin);  // ボタンのピンの状態を取得する

 if (buttonCheck == WAIT_HIGH) {       // High待ち
   if (buttonState == HIGH) {
     buttonCheck = CHECK_HIGH;
     delay(50);
   }    
 }
 else if (buttonCheck == CHECK_HIGH) {  // Highチャタリングチェック中
   if (buttonState == HIGH) {
     buttonCheck = WAIT_LOW;
   }
 }
 else if (buttonCheck == WAIT_LOW) {   // Low待ち
   if (buttonState == LOW) {
     buttonCheck = CHECK_LOW;
     delay(50);
   }
 }
 else if (buttonCheck == CHECK_LOW) {  // Lowチャタリングチェック中
   if (buttonState == LOW) {
     buttonCheck = CONFIRM;
   }
 }

 if (buttonCheck == CONFIRM) {
   // ボタン押下確定でモードチェンジ
   ChangeMode();
   buttonCheck = WAIT_HIGH;
 }
}

//--------------------------
//  表示モードを切り替える
//--------------------------
void ChangeMode(void)
{
 if (mode == MODE_TEMP_HUMI) {
   mode = MODE_AIR_PRESS;
   u8x8.clear();
 } else {
   mode = MODE_TEMP_HUMI;
   u8x8.clear();
 }
}

実行結果

温湿度表示モード

気温:26.40℃、湿度:53%快適な外部環境ですな。ずっとこれくらいの気温やったらええのにねぇ。

温湿度モード


気圧表示モード

101056Paでした。1気圧 = 101325Pa(パスカル)= 1013.25hPa(ヘクトパスカル)なので、こんなもんですよね。富士山の上で動かすと、63000Paぐらいになるはず。

気圧モード


暗室モード

モードの一部ではないですが、照度センサーに覆いを被せるとOLEDの表示がちゃんと消えました。

モード切替

ボタンを押したらモードが意図通りモードが切り替わりました。

これを踏まえて何かできね~か?

【熱中症対策くん】
パッと思いついたのは熱中症アラームです。このキットには温湿度センサーの他にブザーが付いています。例えば室温が30℃で湿度が70%を超えたらブザーを鳴らすようにプログラムを組めば、それだけで熱中症の対策になります。「ピーピー鳴ってる!やべ!冷房入れんと倒れてまう。」と言う感じです。この程度であれば簡単に作れますな。

【熱帯夜?俺には関係のない話だ】
私は寝てる間に冷房をつけっぱなしなのが嫌いで、OFFタイマーをかけて寝るのですが、朝方気温が上がりだすと暑くて起きてしまいます。ええ感じに空調してくれる奴は居らんのかい!居らん。では、造ればよい。温度と湿度は取れる。自分にとって何℃から暑いと感じるのかも分かっている。後はそのタイミングで冷房のスイッチをONすれば良いだけ。冷房のスイッチは赤外線の信号を本体の受信部に入力すれば良い。リモコンからどんな信号が出ているのかをハッキングして、その信号と同じ信号をArduinoボードから送信できれば勝ちや。赤外線を送信するモジュールはあるのかなぁ・・ある!Groveすげーな。これもケーブルで繋げるだけかいな。来年の夏に向けて造ったろうかい。

まとめ

温湿度計って部屋についてないので、これは普通に使えるかも知れません。ボードにプログラムが書き込まれているので、パソコンとわざわざ接続しなくても、携帯の充電とかで使っているUSBアダプターにケーブルを繋げば動かせます。今何℃かなぁ?の瞬間にパッと気温を確認できます。こんな感じで。

画像5

次回はサウンドセンサーと加速度センサーを扱う予定です。これで一通り全部触ったことになりますね。それでは、今回はこの辺で。お疲れ様でした。

この記事が気に入ったらサポートをしてみませんか?