高精度気圧計:Arduino UNO & Nano搭載、デュアルダイヤルで気圧変化を表示
必要な部品と用品
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | 3時間表示・予報担当 |
| Arduino UNO(ATmega328 ベアチップ) | 1 | メイン気圧計・6時間表示担当、ベロボード実装 |
プロジェクト概要
Arduino UNOとNanoの2台構成で、直径12インチ(300mm)のアナログダイヤル3つをステッピングモーターで駆動し、気圧を表示します。
- メインダイヤル:現在の海面更正気圧(hPa)、10分ごと更新
- サブダイヤル1:過去6時間の気圧変化
- サブダイヤル2:過去3時間の気圧変化(0.5hPa分解能、天気予報用)
全ダイヤルに拡張レンジ機能(±5hPa以上でLED点灯)と、3時間変化に基づく天気予報LED(8色)を搭載。ケース内部に20×4 LCDを2台設置し、詳細データを表示。RTC(DS3231)で時刻管理し、1時間パルスで3時間側と同期。
ステップ1:従来のアナログ気圧計との比較
一般的なアナログ気圧計は現在気圧のみ表示し、可動針を手動で合わせて変化を読み取ります。天気予報は針の位置と記憶頼みで複雑。本機は3時間・6時間変化を自動記録・独立表示し、予報もLEDで自動判定します。
ステップ2:嵐予測のデモ
タイムラプス動画で、接近する嵐に対する針と予報LEDの反応を確認できます。
ステップ3:拡張レンジダイヤル
通常時は高分解能で表示。極端な気圧変化時は自動的に拡張レンジ(±5hPa以上)に切替、LEDで知らせます。さらに±9hPa超で両LED点灯し「レンジオーバー」を警告。実運用でメインダイヤルも拡張レンジ使用例あり(2020年1月、英国南部で1050hPa記録)。
ステップ4:LCD情報表示
- 3時間側LCD:現在値、3時間変化、天気予報詳細
- 6時間側LCD:メイン気圧、6時間変化、RTC時刻
ステップ5:天気予報ロジック
気圧(hPa)と3時間変化の組み合わせで8パターンの予報LEDを点灯:
| 条件 | 予報 | 点灯LED |
|---|---|---|
| <1009 hPa かつ 変化≥0 | 回復・涼しく | Clear + Change |
| <1009 hPa かつ -1.5≤変化<0 | 雨 | Rain + Threat |
| <1009 hPa かつ 変化<-1.5 | 嵐 | Stormy + Threat |
| 1009-1022 hPa かつ |変化|≤1.5 | 変化なし・公平 | Fair + No Change |
| 1009-1022 hPa かつ 変化>1.5 | 回復傾向 | Clear + Fair |
| 1009-1022 hPa かつ 変化<-1.5 | 雨・雪 | Rain + Change |
| >1022 hPa かつ 変化≥0 | 乾燥・好天継続 | Dry + Fair |
| >1022 hPa かつ -1.5≤変化<0 | 好天 | Fair + Dry |
| >1022 hPa かつ 変化<-1.5 | 変化の兆し | Change + Threat |
ステップ6〜10:初期セットアップ手順
- 起動時LEDテスト → 針が初期位置へ移動
- RTC設定:UTC固定、夏時間変更なし。セレクトノブとボタンで時・分を調整
- 6時間針設定:インチング(微調整)で目盛合わせ → RTC設定時にメモした値へ整数ステップで合わせ
- メイン針設定:同様にインチング後、LCD表示の四捨五入海面更正気圧へ整数ステップで合わせ
- 3時間針設定:専用ボタン(緑・白・青・黄)で0.5hPa単位調整 → LCDの「D」値へ合わせ
※ 6時間表示は8時間、3時間表示は4時間経過後に正常動作。過去データをコードに埋め込めば即時運用可能。
ステップ11:主要モジュール
- マイコン:ATmega328(UNO互換、ベロボード実装)+ Arduino Nano
- 電源:LM2596バックコンバータ(12V→5V)、AMS1117(3.3V、BMP180用)
- 気圧センサー:BMP180 ×2(I2C、3.3V駆動必須)
- RTC:DS3231 AT24C32(I2C、リチウム電池バックアップ。充電回路抵抗R5除去で非充電電池対応)
- ステッピングモーター:NEMA 17、1.8°(200ステップ/回転)、1A、13N·cm ×3台。1/16マイクロステップ駆動
- LCD:20×4 I2C ×2台(バックライトスイッチ付きで省電力)
- ドライバー:A4988 ×3(1/16ステップ、電流制限調整必須、VMOT-GND間に47μF以上の電解コンデンサ推奨)
ステップ12:A4988ドライバー詳細
マイクロステップ設定(MS1〜3ピン)、電流制限(Vref調整)、電源保護(セラミックコンデンサのLCスパイク対策)など重要事項を解説。コードは1/16ステップ前提。
ステップ13〜24:製作プロセス
- ハードボード試作ダイヤルで配線確認
- RTCモジュール改造(充電抵抗除去)
- モジュール・基板のダイヤル直付け(木製ブロックでスペーサー兼マウント)
- 3mm LEDの均一取り付け(治具使用)
- クラシックスタイル:既製の12インチ掛け時計ケース(オーク材、ヒンジ付きダイヤルベゼル)を流用
- モダンスタイル:同サイズ額縁2つを背中合わせ、ヒンジとロックピンで壁掛けメンテナンス対応
- ダイヤル:1.5mmアルミ板にウォータースライドデカール転写、マットクリア塗装
- 針:市販クォーツ秒針を加工・組み合わせ自作、ブルータックで固定
- ベロボード配線:メイン基板、LED接続基板の2枚構成
ステップ25:回路図
メイン回路図と電源回路図を掲載。12V 1A以上のACアダプター必要。LCDバックライトはスイッチでON/OFF可能(99.99%見えないため省電力)。
ステップ26:ベロボードレイアウト
部品面・ハンダ面・モジュール実装状態・配線中の写真を掲載。LED基板はダイヤル着脱用にコネクタ接続。
ステップ27:コード
2つのスケッチに分割:
BarometerA4988_23.ino:メイン気圧計+6時間表示(UNO側)BarometerA4988_3hour__21.ino:3時間表示+天気予報(Nano側)
主要ライブラリ:SFE_BMP180、AccelStepper、LiquidCrystal_I2C、Wire。RTC直読み書き関数、ステッピングモーター制御(マイクロステップ対応)、気圧取得・海面更正・履歴管理・予報ロジック・設定モード等を含む。
ステップ28:タイムラプス動画
雨雲レーダーと気圧計の予報連動を4K動画で記録。ダイヤルとLEDの詳細が確認可能。
コード(抜粋)
BarometerA4988_23.ino(メイン・6時間表示用)
/* バージョン履歴:v23まで改良
- 6時間変化を毎時ステップ、拡張レンジLED、スリープ制御等 */
#include <SFE_BMP180.h>
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
SFE_BMP180 pressure;
#define ALTITUDE 118.0 // 神奈川県寒川町付近の標高(m)
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define DS3231_I2C_ADDRESS 0x68
// ステッピングモーター設定(A4988 1/16ステップ)
#define dirPin 8
#define stepPin 9
#define dirPin2 10
#define stepPin2 11
#define motorInterfaceType 1
AccelStepper stepper(motorInterfaceType, stepPin, dirPin); // メイン
AccelStepper stepper2(motorInterfaceType, stepPin2, dirPin2); // 6時間
// 変数群(気圧履歴8時間分、RTC、設定モード、LED制御等)
// ... 詳細はダウンロードファイル参照
void setup() {
// ピンモード、LCD、RTC、BMP180初期化、LEDテスト、モーター無効化
getPressure(); // 初回測定
// 起動時LCDに設定用情報表示
}
void loop() {
// 設定モード(セレクトノブ+ボタン)処理
// RTC時刻表示(秒更新)
// 10分ごとの気圧測定・メイン/6時間針ステップ
// 毎時15秒に1時間パルス出力(3時間側へ)
// 6時間履歴更新・差分計算・ステップ実行
}
// 設定モード、RTC操作、モーターステップ関数群...
// 全文は添付ファイル参照
BarometerA4988_3hour__21.ino(3時間・予報用)
/* v21:予報LED8色、LCD表示、1/16ステップ、手動調整ボタン対応 */
#include <SFE_BMP180.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
SFE_BMP180 pressure;
#define ALTITUDE 125.0
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define dirPin 11
#define stepPin 10
#define motorInterfaceType 1
AccelStepper stepper(motorInterfaceType, stepPin, dirPin);
// 予報LEDピン割り当て
int ledStormy = 8, ledRain = 7, ledChange = 6, ledFair = 2;
int ledDry = 13, ledClear = 12, ledThreat = 17, ledNoChange = 16;
// 3時間レンジLED
int hour3LowLED = 5, hour3HighLED = 4;
// 手動調整入力
int stepFwd1 = 14, stepBwd1 = 15, maninchFwdBwd = A7;
// メイン側からの1時間パルス入力
int hourPulse = 3;
void setup() {
// LEDピン初期化、LCD、BMP180、LEDテスト、初回測定・予報・表示
// モーター無効化
}
void loop() {
// 1時間パルス検知→測定・予報・表示更新・3時間針ステップ
// 手動調整ボタン(整数ステップ・インチング)対応
// 3時間履歴管理・差分計算・ステップ実行
}
// 気圧取得、海面更正、3時間差分計算、予報判定、LCD表示、モーター制御関数群...
// 全文は添付ファイル参照
回路図
製造プロセス
- アネロイド気圧計:設計、歴史、圧力測定の未来
- 血圧計:設計、製造、将来動向
- 消火器:種類、設計、将来動向
- 産業・安全用途向け精密圧力計
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- コンパクト気象ステーション:Arduino Nano & ESP8266 + BMP280 + OLED/Nokia LCD
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション