정밀 기압계 모니터: 아두이노 우노/나노 듀얼 다이얼 바로미터
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 나노 R3 |
1 |
3시간 기압 변화/예보 전용 |
| 아두이노 우노 (ATmega328 베어본, 베로보드 구현) |
1 |
메인 기압계 + 6시간 변화 표시용 |
프로젝트 개요
12인치(300mm) 아날로그 다이얼에 3개 스테퍼 모터로 기압 표시
아두이노 우노와 나노 두 대를 사용해 12인치(300mm) 아날로그 다이얼에 기압을 표시하는 정밀 바로미터입니다. 3개의 NEMA 17 스테퍼 모터(A4988 드라이버 구동)가 각각 메인 기압, 6시간 변화, 3시간 변화를 가리킵니다.
주요 기능
- 메인 다이얼: 해수면 보정 기압(hPa) 표시, 10분마다 업데이트
- 6시간 변화 다이얼: 최근 6시간 기압 변화량 표시
- 3시간 변화 다이얼: 0.5 hPa 해상도로 최근 3시간 변화 표시 (기상 예보 핵심 지표)
- 확장 범위 표시: 모든 다이얼에 ±확장 범위 LED 표시 (극한 기압 대응)
- 기상 예보 LED: 8개 LED로 현재 기압과 3시간 변화율 기반 예보 표시
- 듀얼 LCD: 20×4 LCD 2대로 각 MCU 상태·데이터 실시간 표시
- RTC(DS3231): 정확한 시각 동기화 및 1시간 펄스 생성
기존 아날로그 바로미터와의 차별점
일반 아날로그 바로미터는 현재 기압만 가리키고, 사용자가 별도 바늘로 기준점을 맞춰 변화를 직접 읽어야 합니다. 본 프로젝트는 자동으로 3시간/6시간 변화량을 별도 다이얼에 연속 표시하고, 기상 예보 알고리즘을 내장해 LED로 직관적으로 알려줍니다.
접근하는 폭풍에 반응하는 바늘과 예보 LED 타임랩스
확장 범위 다이얼 설계
일반 기압 범위(990~1050 hPa)에서는 고해상도 표시를, 극한 상황에서는 확장 스케일로 전환합니다.
- 메인 다이얼: 기본 990~1050 hPa, 확장 ±10 hPa (적색/녹색 LED로 범위 표시)
- 6시간 변화: 기본 ±5 hPa, 확장 ±10 hPa
- 3시간 변화: 기본 ±2.5 hPa (0.5 hPa 눈금), 확장 ±5 hPa
범위 초과 시 양쪽 LED 동시 점등으로 경고합니다. 2020년 1월 영국 남부 1050 hPa 기록 고기압 때 메인 다이얼 확장 범위가 실제 작동함을 검증했습니다.
LCD 정보 표시
- LCD 1 (메인/6시간): 현재 기압, 6시간 변화량, RTC 시각, 설정 메뉴
- LCD 2 (3시간/예보): 3시간 변화량, 기상 예보 텍스트, 시간별 기압 히스토리
기상 예보 알고리즘 (8개 LED)
해수면 기압과 3시간 변화율을 조합해 8가지 예보 상태를 LED 조합으로 표시:
| 기압 범위 |
3시간 변화 |
예보 |
점등 LED |
| < 1009 hPa |
상승/보합 (≥ 0) |
맑아지고 선선함 |
Clearing + Cool |
| < 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 |
| 1009~1022 hPa |
급격 하강 (< -1.5) |
비/눈 가능성 |
Rain + Change |
| > 1022 hPa |
상승/보합 (≥ 0) |
건조/맑음 지속 |
Dry + Fair |
| > 1022 hPa |
천천히 하강 (-1.5 ~ 0) |
맑음 |
Fair |
| > 1022 hPa |
급격 하강 (< -1.5) |
변화 임박 |
Change + Threat |
하드웨어 모듈 상세
마이크로컨트롤러
- ATmega328P (우노 호환, 베로보드 직납)
- 아두이노 나노 R3 (공간 제약으로 추가)
전원
- 소비 전류: 약 65mA (모터 동작 시 순간 증가)
- AMS1117 3.3V 레귤레이터: BMP180 센서 전용
- LM2596 벅 컨버터: 12V → 5V 변환 (전체 시스템)
센서: BMP180 × 2개
I2C 인터페이스 기압/온도 센서. 3.3V 전원 필수 (5V 연결 시 영구 손상). SCL/SDA는 5V MCU에 직결 가능 (오픈 드레인).
RTC: DS3231 AT24C32
고정밀 I2C RTC. UTC 기준 동작 (서머타임 미적용). 충전용 리튬이온 배터리 회로(R5 저항) 제거 후 비충전 코인셀(CR2032) 사용 권장.
스테퍼 모터: NEMA 17 1.8° × 3개
1.8°/스텝 (200스텝/회전) 필수. 28BYJ-48(5V, 5.625°) 사용 불가. A4988 드라이버로 1/16 마이크로스텝 구동 (3200마이크로스텝/회전).
드라이버: A4988 × 3개
- 1/16 마이크로스텝 설정 (MS1, MS2, MS3 = HIGH, HIGH, HIGH)
- 전류 제한: 모터 정격에 맞춰 Vref 조정 필수 (히트싱크 권장)
- VMOT 단자에 47μF 이상 전해 커패시터 필수 (LC 스파이크 방지)
- 모터 연결/해제 시 드라이버 전원 반드시 차단
기계적 제작
다이얼 제작
- 1.5mm 알루미늄 시트 준비 (보호 필름 부착 상태)
- CAD에서 다이얼 도면 출력 (A3, 모든 홀 센터 마크 포함) → 종이 템플릿으로 센터펀치 마킹
- 3mm LED 홀, 스테퍼 축 홀(확대) 드릴링
- 보호 필름 제거 → 디버링 → 프라이머 → 탑코트(엔틱 화이트) → 매트 클리어
- 워터슬라이드 데칼 전사지로 눈금/숫자 인쇄 전사 → 바니시 코팅
바늘 제작
시계용 초침 기성품을 조합/가공. 스테퍼 축에 블루택(Blu Tack)으로 고정 (탈착 용이). 메인 바늘은 3개 기성품 부품으로 직접 제작.
케이스: 두 가지 스타일
- 클래식: 12인치 다이얼 시계 케이스(이베이 "case only") 활용. 힌지형 다이얼 베젤로 유지보수 용이.
- 모던: 30×30cm 액자 2개를 앞뒤로 결합. 힌지+잠금핀으로 벽걸이 개폐식 구조.
GTV 270° 인셋 힌지로 벽면 마운트, 개폐 가능
베로보드 배선
메인 베로보드에 MCU, 드라이버, RTC, 센서, LCD, 설정 스위치 모두 실장. LED 전용 별도 베로보드로 분리해 다이얼 탈착 시 커넥터만 뽑으면 되게 설계.
소프트웨어 구조
두 MCU가 독립 펌웨어로 동작하며, 메인 MCU(우노)가 RTC 관리와 1시간 펄스를 나노(3시간용)로 전송.
메인 펌웨어 (BarometerA4988_23.ino)
- BMP180 읽기 → 해수면 보정 기압 계산
- 메인 바늘: 현재 기압 → 3200마이크로스텝/회전 비율로 위치 제어
- 6시간 바늘: 8시간 링버퍼(hour0~hour7)로 변화량 계산
- RTC 설정 메뉴: 포텐쇼미터 + 버튼으로 시각/바늘 캘리브레이션
- 확장 범위/예보 LED 제어
3시간/예보 펌웨어 (BarometerA4988_3hour__21.ino)
- 메인 MCU에서 1시간 펄스 수신 시 BMP180 읽기
- 4시간 링버퍼(hour0~hour4)로 3시간 변화량 계산
- 예보 알고리즘 실행 → 8개 LED 점등
- 수동 캘리브레이션 버튼(인치/스텝 전진/후진)
초기 설정 및 캘리브레이션
- RTC 설정: "Select Setting Enable" 스위치 ON → 포텐쇼미터로 메뉴 선택(시/분 전진/후진) → 빨간 버튼으로 변경
- 6시간 바늘: 인치 모드로 눈금 정렬 → 스텝 모드로 기준값(부팅 시 6시간 전 기압) 맞춤
- 메인 바늘: 동일하게 인치→스텝으로 현재 해수면 기압 맞춤
- 3시간 바늘: 나노 측 4개 버튼(인치 전진/후진, 스텝 전진/후진)으로 0점 정렬 후 기준값 맞춤
초기 6~8시간 동안은 히스토리 버퍼가 채워질 때까지 과거 데이터 수동 입력(코드 내 hour0~hour7 초기값 설정) 권장.
회로도
소스 코드 (요약)
전체 코드는 길어 주요 구조만 요약. 전체 파일은 첨부 참조.
메인 펌웨어 핵심 루틴
// 주요 라이브러리
#include
#include
#include
#include
// 스테퍼 설정 (1/16 마이크로스텝)
AccelStepper stepper(1, stepPin, dirPin); // 메인 바늘
AccelStepper stepper2(1, stepPin2, dirPin2); // 6시간 바늘
// 8시간 기압 히스토리 링버퍼
int hour0=1013, hour1=1014, hour2=1015, hour3=1016;
int hour4=1016, hour5=1016, hour6=1012, hour7=1013;
void loop() {
// RTC 읽기
readDS3231time(&second, &minute, &hour, ...);
// 10분마다 기압 측정 (분 0,10,20,30,40,50 초 59)
if (minute % 10 == 0 && second == 59 && checkStop == 0) {
getPressure(); // BMP180 읽기 → seaPressure 계산
checkStop = 1;
}
// 정시 15초: 3시간 MCU로 시간 펄스 전송
if (minute == 0 && second == 15) digitalWrite(hourPulse, HIGH);
// 정시: 6시간 바늘 업데이트
if ((minute == 59 && second > 50) || (minute == 0 && second < 10)) {
if (hour != hourPrevious) {
hourDiff = hour0 - hour6; // 6시간 전과 비교
hourChange = calculateSteps(hourDiff);
if (hourChange > 0) stephourFwd();
else if (hourChange < 0) stephourBwd();
hourPrevious = hour;
// 링버퍼 시프트
hour7=hour6; hour6=hour5; ... hour0=seaPressure;
}
}
// 설정 모드: 포텐쇼미터로 메뉴 선택, 버튼으로 실행
if (digitalRead(adjustOn) == HIGH) Settings();
}
3시간/예보 펌웨어 핵심 루틴
#include
#include
#include
AccelStepper stepper(1, stepPin, dirPin); // 3시간 바늘
float hour0=1036.0, hour1=1036.0, hour2=1036.0, hour3=1036.0, hour4=1036.0;
void loop() {
// 메인 MCU에서 1시간 펄스 수신
if (digitalRead(hourPulse) == HIGH && hourPulseOff == 0) {
getPressure(); // 기압 읽기
getForecast(); // 예보 계산 → LED 점등
showLCD(); // LCD 업데이트
hourPulseOff = 1;
} else if (digitalRead(hourPulse) == LOW) {
hourPulseOff = 0;
}
// 3시간 바늘 자동 업데이트
if (hourChange > 0 && hourChange < 20) { stephourFwd(); hourChange = 0; }
else if (hourChange < 0 && hourChange > -20) { stephourBwd(); hourChange = 0; }
// 수동 캘리브레이션 버튼 처리
// ...
}
void getForecast() {
// 기압 + 3시간 변화율로 8가지 예보 분기
if (seaPressure < 1009 && hourDiff >= 0) { ClearforecastLED(); digitalWrite(ledChange, HIGH); digitalWrite(ledClear, HIGH); }
else if (seaPressure < 1009 && hourDiff < 0 && hourDiff >= -1.5) { ClearforecastLED(); digitalWrite(ledRain, HIGH); digitalWrite(ledThreat, HIGH); }
else if (seaPressure < 1009 && hourDiff < -1.5) { ClearforecastLED(); digitalWrite(ledStormy, HIGH); digitalWrite(ledThreat, HIGH); }
else if (seaPressure >= 1009 && seaPressure <= 1022 && hourDiff >= -1.5 && hourDiff <= 1.5) { ClearforecastLED(); digitalWrite(ledNoChange, HIGH); digitalWrite(ledFair, HIGH); }
// ... 나머지 분기 생략
}
참고 자료 및 다운로드
이 프로젝트는 정밀 기계 가공, 임베디드 프로그래밍, 기상학 지식이 결합된 고급 메이커 프로젝트입니다. 단계별로 차근차근 따라 하면 나만의 정밀 아날로그 기압계를 완성할 수 있습니다.