Arduino Nanoで作るコンパクト気象ステーション - 温湿度・気圧をリアルタイム表示
必要な部品と用品
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| DHT11 モジュール(温湿度センサー) | 1 |
| BMP280 気圧センサーモジュール | 1 |
| 1.44インチ ST7735 TFT LCD ディスプレイ | 1 |
| 3Dプリント製ケース | 1 |
| USB A - mini B ケーブル | 1 |
必要な工具・機器
- はんだごて、はんだ
- 3Dプリンター
- 両面テープ
使用ソフトウェア
- Arduino IDE
- Autodesk Fusion 360(ケース設計)
プロジェクト概要
はじめに
リアルタイムで物理データを取得することは常に魅力的です。このプロジェクトでは、天気予報の基本パラメータである「温度」「湿度」「大気圧」の3つを取得し、TFT LCD画面にリアルタイム表示します。
仕様と動作原理
- BMP280: 温度(分解能 ±0.5℃)と大気圧を測定
- DHT11: 湿度のみを測定(温度分解能は±2℃と粗いためBMP280の温度を採用)
- コスト面: BME280(温湿度気圧一体型)より、BMP280+DHT11の組み合わせの方が安価
- Arduino Nano: UNOより小型・低価格で、この用途に十分な性能
- 1.44" ST7735 TFT: コンパクトでNanoのメモリ負荷も軽い
回路とプログラミング
回路図とブロック図を併記し、ピン配置表も用意しています。NanoのICSPヘッダーの5V/GNDピンも電源供給に活用し、外部電源不要でコンパクトにまとめています。
主要ライブラリ
SPI.h,Wire.h: 通信基盤Adafruit_GFX.h,Adafruit_ST7735.h: TFT描画Adafruit_BMP280.h: BMP280制御DHT.h: DHT11制御
初期化処理(setup)
- センサー初期化、TFT初期化(黒背景、シアン罫線、見出し表示)
- BMP280のI2Cアドレス指定(0x76または0x77、デフォルト0x77)
- 接続エラー時は赤文字で「Connection Error」表示して停止
メインループ(loop)
- 温度(℃)、湿度(%)、気圧(hPa)を取得
- 各値を書式整形してTFTの所定位置に色分け表示
- 温度: 黄色、湿度: マゼンタ、気圧: オレンジ
- 1秒ごとに更新
組み立てとテスト
- プロトタイプはジャンパーワイヤーでモジュール化、トラブルシューティング容易
- 3Dプリントケースに通気孔を設け、センサー露出と放熱を確保
- USB給電(PCまたはスマホ充電器)で数時間連続動作テスト済み
- 気象庁データと比較し、コストと開発時間を考慮すれば十分な精度
結論
低コスト・実用的・何よりポケットに入るサイズの気象ステーションを自作できる、楽しいプロジェクトです。
スケッチ
#include
#include
#include
#include
#include
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
#define TFT_RST 8
#define TFT_CS 10
#define TFT_DC 9
#define BMP280_I2C_ADDRESS 0x76
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
Adafruit_BMP280 bmp280;
DHT dht(DHTPIN, DHTTYPE);
void setup(void) {
dht.begin();
tft.initR(INITR_144GREENTAB);
tft.fillScreen(ST77XX_BLACK);
tft.drawFastHLine(0, 15, tft.width(), ST77XX_CYAN);
tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK);
tft.setTextSize(1);
tft.setCursor(25, 5); tft.print("WEATHER BUDDY");
if (!bmp280.begin(BMP280_I2C_ADDRESS)) {
tft.setTextColor(ST77XX_RED, ST77XX_CYAN);
tft.setTextSize(2);
tft.setCursor(5, 76); tft.print("Connection");
tft.setCursor(35, 100); tft.print("Error");
while (1);
}
tft.drawFastHLine(0, 55, tft.width(), ST77XX_CYAN);
tft.drawFastHLine(0, 95, tft.width(), ST77XX_CYAN);
tft.setTextColor(ST77XX_RED, ST77XX_BLACK); tft.setCursor(30, 20); tft.print("TEMPERATURE");
tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK); tft.setCursor(40, 60); tft.print("HUMIDITY");
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK); tft.setCursor(40, 100); tft.print("PRESSURE");
tft.setTextSize(2);
}
void loop() {
char buf[8];
float temp = bmp280.readTemperature();
float hum = dht.readHumidity();
float pres = bmp280.readPressure(); // Pa単位
// 温度表示(℃)
if (temp < 0) sprintf(buf, "-%02u.%02u", (int)abs(temp), (int)(abs(temp)*100)%100);
else sprintf(buf, " %02u.%02u", (int)temp, (int)(temp*100)%100);
tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);
tft.setCursor(11, 34); tft.print(buf);
tft.drawCircle(89, 34, 2, ST77XX_YELLOW); // 度記号
tft.setCursor(95, 34); tft.print("C");
// 湿度表示(%)
sprintf(buf, "%02u ", (int)hum);
tft.setTextColor(ST77XX_MAGENTA, ST77XX_BLACK);
tft.setCursor(45, 74); tft.print(buf);
tft.setCursor(75, 74); tft.print("%");
// 気圧表示(hPa)
sprintf(buf, "%04u.%02u", (int)(pres/100), (int)((uint32_t)pres % 100));
tft.setTextColor(ST77XX_ORANGE, ST77XX_BLACK);
tft.setCursor(3, 112); tft.print(buf);
tft.setCursor(91, 112); tft.print("hPa");
delay(1000);
}
3Dプリント用ケースデータ
STLファイルが提供されています。Fusion 360で設計されています。
回路図
製造プロセス
- Raspberry Pi 2とADS-WS1で屋外気象観測ステーションを構築
- Raspberry Piで気象観測ステーションを構築し、日次天気データをメール送信
- Raspberry Pi 3とPubNubでリモート気象監視
- 高度気象ステーション v2.0:温度・気圧・湿度・高度のリアルタイム監視
- Arduino Nano RP2040で作るDIY Photoshopコントロールコンソール
- Arduino Pro MiniとDS1302 RTCで作る高精度7セグメント時計
- 10ドルで作る携帯型Arduino気象観測ステーション – Nano、DHT22、BMP180、LCDで簡単DIY
- eDOT:高精度Arduino時計・気象ステーション(IRリモコン・自動輝度調整内蔵)
- Arduino NanoとRDA5807Mで作るコンパクトFMラジオ
- ArduinoとThingSpeakで作るリアルタイム気象モニタリングシステム
- Arduino Nano製ウェザーステーション:気圧・温湿度・UV・時計表示付き