텐서플로우 기반 IoT 기상 관측소로 강우 강도 정확히 예측하기
부품 및 소모품
| 부품 |
수량 |
비고 |
| DFRobot 기상 관측소 키트 (풍속계, 풍향계, 강우량계 포함) |
1 |
시리얼 통신으로 37바이트/초 출력 |
| NodeMCU ESP8266 (ESP-12E) |
1 |
와이파이 전송용 |
| DFRobot SIM808 GPS/GPRS/GSM 실드 |
1 |
LTE/GPRS 전송용 (원거리) |
| 아두이노 우노 |
1 |
SIM808 실드 호스트 |
| 라즈베리 파이 3 모델 B+ 또는 4 |
1 |
웹 서버 + 데이터 수집용 |
| 납땜 가능 미니 브레드보드 |
2 |
|
필수 도구
앱 및 온라인 서비스
- 아두이노 IDE
- 텐서플로우 / 케라스
- 마이크로소프트 비주얼 스튜디오 2017 (PHP 개발용)
프로젝트 배경
2020년 갑작스러운 폭우로 온실과 농작물 피해가 빈번해졌습니다. 기후 변화로 국지성 호우가 늘어나면서 농업 생산성 손실이 커지고 있습니다. 조기 경보 시스템만으로는 부족하며, 각 온실/농장별 초지역 날씨 데이터가 필요합니다. 이를 위해 저비용 원격 기상 관측소로 현장 데이터를 수집하고, 텐서플로우 신경망으로 강우 강도를 5단계로 분류 예측하는 시스템을 구축했습니다.
연구에 따르면 신경망은 1~3시간 후 강수량 예측, 토네이도/안개 예측 등 기상 현상 예측에 높은 정확도를 보입니다.
1단계: 기상 관측소 키트 조립
DFRobot 키트(풍속계, 풍향계, 강우량계, 센서 보드)를 조립합니다. 센서 보드는 방수가 안 되므로 플라스틱 박스로 보호합니다.
데이터 포맷 (초당 37바이트): c000s000g000t086r000p000h53b10020
- c: 풍향 (도), s: 평균 풍속 (0.1 mph), g: 최대 풍속 (0.1 mph)
- t: 온도 (℉), r: 1시간 강우량 (0.01 inch), p: 24시간 강우량 (0.01 inch)
- h: 습도 (% , 00=100%), b: 기압 (0.1 hPa)
2단계: 구글 시트에 데이터 수집 (PHP 웹앱 + 구글 시트 API)
- 구글 개발자 콘솔에서 프로젝트 생성 → 구글 시트 API 활성화
- 서비스 계정 생성 → OAuth 클라이언트 ID 발급 →
credentials.json 다운로드
- 구글 시트 생성, 컬럼: WD, Av_WS, Mx_WS, 1h_RF, 24h_RF, Tem, Hum, b_PR
- 라즈베리 파이(또는 일반 PHP 서버)에 웹앱 배포:
index.php, account_verification_token.php, credentials.json, token.json
- 최초 접속 시 인증 URL 따라가 검증 코드 받아
account_verification_token.php에 입력 → token.json 자동 생성
- 테스트:
https://서버/remote_weather_station/?wd=12&a_ws=8&m_ws=11&1_rf=14&24_rf=84&tem=24&hum=32&b_pr=57
3단계: ESP8266(와이파이) / SIM808(GPRS)로 데이터 전송
ESP8266 (발코니 근거리)
- 5분마다 센서 데이터 파싱 → 단위 변환(℉→℃, mph→m/s, inch→mm) → HTTP GET으로 PHP 웹앱에 전송
- 연결 핀: ESP8266 D5←RX, D6←TX, VV→5V, G→GND
SIM808 + 아두이노 우노 (마당 원거리)
- SIM808 실드 초기화 → DHCP 가입 → TCP 연결 → HTTP GET 전송 → 연결 종료
- 핀: 우노 D0←RX, D1←TX, D12←POWER / 기상관측소 5V, D5←RX, D6←TX, GND
- 외부 배터리(7-23V) 필수, GPS/GSM 안테나 장착, SIM 카드 삽입
4단계: 3개월 이상 데이터 수집 → 데이터셋 구축
5분 간격으로 32,219행 수집. CSV로 내보내 Remote Weather Station.csv로 저장.
5단계: 텐서플로우/케라스로 ANN 모델 구축 및 학습
데이터 전처리 (Python)
- 풍향/풍속 → 벡터 변환: 각도(360°=0°) 연속성 위해
WX = WS*cos(WD), WY = WS*sin(WD) (최대 풍속도 동일)
- 정규화: 온도/25, 습도/70, 기압/1013, 24시간 강우량/24
- 입력 피처 7개:
[scaled_WX, scaled_WY, scaled_max_WX, scaled_max_WY, scaled_Tem, scaled_Hum, scaled_bPR]
- 레이블 생성 (강우 강도 5클래스): 근사 강우율
(1h_RF + scaled_24h_RF)*100 기준
- 0: 강우 없음 (0 mm/h)
- 1: 약한 비 (< 2.5 mm/h)
- 2: 보통 비 (2.5~7.6 mm/h)
- 3: 강한 비 (7.6~50 mm/h)
- 4: 폭우 (> 50 mm/h)
- 학습 60% / 테스트 40% 분할
신경망 구조
Input(7) → Dense(16, relu) → Dense(32, relu) → Dense(64, relu) → Dense(128, relu) → Dense(5, softmax)
Optimizer: Adam, Loss: sparse_categorical_crossentropy, Epochs: 19
학습 정확도: 0.83~0.85, 테스트 정확도: 0.72~0.73 (과적합 경향, 데이터 추가 수집 중)
예측 예시
입력: [0, 0, 0.318, 0.318, 0.699, 0.815, 0.993] → 예측: 0 (None)
입력: [0, 0, 0.45, 0, 0.876, 0.959, 1.001] → 예측: 4 (Violent Rain)
6단계: 향후 개선 방향
- 풍속/풍향 센서 추가 (현재 키트에 포함됨)
- 자외선, 가스, 미세먼지 센서 실험
- 여러 관측소 배치로 공간적 평균 향상
- 수년 치 데이터 축적
- 외부 공식 기상 데이터(기상청, Dark Sky 등) 융합
- 케라스 하이퍼파라미터 튜닝 (레이어, 뉴런, 드롭아웃, 옵티마이저, 배치, 에폭)
- LSTM 등 시계열 특화 아키텍처 시도
코드
- IoT_weather_station_neural_network.py: 전체 파이썬 학습/예측 코드 (데이터 시각화, 정규화, 모델 정의, 학습, 평가, 예측, 저장 포함)
- ESP12E_remote_weather_station.ino: ESP8266 와이파이 전송 펌웨어
- SIM808_remote_weather_station.ino: SIM808 GPRS 전송 펌웨어
- index.php: 구글 시트 API 연동 웹앱
- account_verification_token.php: 인증 토큰 저장
커스텀 파트
수집된 데이터 CSV 파일: remote_weather_station_OobOCQNPSW.csv
회로도
ESP8266 연결도, SIM808+우노 연결도 이미지 참조
참고 문헌
- NIWA: Extreme weather - heavy rainfall
- Univ. of Illinois: Excessive rainfall as damaging to corn yield as extreme heat, drought (ScienceDaily, 2019)
- Andrew Culclasure: Using Neural Networks to Provide Local Weather Forecasts (Georgia Southern Univ., 2013)