개인용 기상관측 센서 (SEN0186)
개인용 기상대를 만들때 유용한 기상관측 센서(모듈)입니다. 온습도, 풍속, 강우량, 기압을 한번에 측정해주기 때문에 센서 여러개를 사서 조합할 필요없이 한번에 해결이 가능합니다! 대신 모듈 가격이 좀 비쌉니다;;;
기상관측 모듈에는 아래 부품들이 포함되어 있습니다.
대부분은 기구부 부품들이고 센서 회로 자체는 작습니다. (그림에서 우측 하단) 센서는 아래 정보들을 수집해서 출력해줍니다.
• 온도 (C)
• 습도 (%)
• 바람 방향
• 1분간 측정한 평균 풍속 (m/s)
• 5분간 측정한 평균 풍속 (m/s)
• 시간당 강우량 (mm)
• 하루 강우량 (mm)
• 기압 (hPa)
연결방법
기상관측 모듈은 시리얼 통신으로 데이터를 전송해줍니다. 따라서 아래 방법대로 4개 선만 연결해주면 됩니다.
- 기상관측 모듈 –> 아두이노
- 5V –> 5V
- GND –> GND
- TX –> RX
- RX –> TX
여기서는 아두이노의 하드웨어 시리얼(D0, D1) 핀을 이용하는데, 스케치 업로드 할 때 모듈이 연결되어 있으면 업로드가 되지 않습니다. 따라서 일단 TX, RX 연결은 해제한 상태에서 스케치 업로드를 해야합니다. 스케치 업로드가 끝나면 TX, RX 를 연결해서 쓰면 됩니다.
하지만 보통은 하드웨어 시리얼을 PC와 양방향 통신을 하는데 사용하므로 SoftwareSerial을 이용해서 제어하는 편이 좋아보입니다. 이때는 D0, D1 핀을 제외한 나머지 핀 중 2개를 사용하면 됩니다.
예제 코드 (스케치)
하드웨어 시리얼을 이용해서 제어하는 경우(D0, D1 핀 이용) 아래 코드를 이용하면 됩니다.
char databuffer[35]; double temp; void getBuffer() //Get weather status data { int index; for (index = 0;index < 35;index ++) { if(Serial.available()) { databuffer[index] = Serial.read(); if (databuffer[0] != 'c') { index = -1; } } else { index --; } } } int transCharToInt(char *_buffer,int _start,int _stop) //char to int { int _index; int result = 0; int num = _stop - _start + 1; int _temp[num]; for (_index = _start;_index <= _stop;_index ++) { _temp[_index - _start] = _buffer[_index] - '0'; result = 10*result + _temp[_index - _start]; } return result; } int WindDirection() //Wind Direction { return transCharToInt(databuffer,1,3); } float WindSpeedAverage() //air Speed (1 minute) { temp = 0.44704 * transCharToInt(databuffer,5,7); return temp; } float WindSpeedMax() //Max air speed (5 minutes) { temp = 0.44704 * transCharToInt(databuffer,9,11); return temp; } float Temperature() //Temperature ("C") { temp = (transCharToInt(databuffer,13,15) - 32.00) * 5.00 / 9.00; return temp; } float RainfallOneHour() //Rainfall (1 hour) { temp = transCharToInt(databuffer,17,19) * 25.40 * 0.01; return temp; } float RainfallOneDay() //Rainfall (24 hours) { temp = transCharToInt(databuffer,21,23) * 25.40 * 0.01; return temp; } int Humidity() //Humidity { return transCharToInt(databuffer,25,26); } float BarPressure() //Barometric Pressure { temp = transCharToInt(databuffer,28,32); return temp / 10.00; } void setup() { Serial.begin(9600); } void loop() { getBuffer(); //Begin! Serial.print("Wind Direction: "); Serial.print(WindDirection()); Serial.println(" "); Serial.print("Average Wind Speed (One Minute): "); Serial.print(WindSpeedAverage()); Serial.println("m/s "); Serial.print("Max Wind Speed (Five Minutes): "); Serial.print(WindSpeedMax()); Serial.println("m/s"); Serial.print("Rain Fall (One Hour): "); Serial.print(RainfallOneHour()); Serial.println("mm "); Serial.print("Rain Fall (24 Hour): "); Serial.print(RainfallOneDay()); Serial.println("mm"); Serial.print("Temperature: "); Serial.print(Temperature()); Serial.println("C "); Serial.print("Humidity: "); Serial.print(Humidity()); Serial.println("% "); Serial.print("Barometric Pressure: "); Serial.print(BarPressure()); Serial.println("hPa"); Serial.println(""); Serial.println(""); }
약간의 꼼수가 들어가 있습니다. 하드웨어 시리얼 D0(RX) 핀을 이용해서 기상관측 모듈이 전달해주는 데이터를 받습니다. 그리고 D1(TX) 핀은 PC에도 연결되어 있기 때문에 D1 핀으로 수집한 정보를 PC에 출력합니다. 두 개의 시리얼을 한번에 사용하는 셈입니다.
(따라서 기상관측 센서의 RX 핀은 연결하지 않아도 될 것입니다.)
SoftwareSerial을 사용하는 경우 아래처럼 코드들을 수정해줘야 합니다. (기상관측 모듈의 TX, RX 핀이 각각 D2, D3에 연결되었다고 가정)
// 추가되는 부분 #include <SoftwareSerial.h> SoftwareSerial softSerial(2, 3); // module's TX, RX void getBuffer() //Get weather status data { int index; for (index = 0;index < 35;index ++) { if(softSerial.available()) { databuffer[index] = softSerial.read(); if (databuffer[0] != 'c') { index = -1; } } else { index --; } } } void setup() { Serial.begin(9600); softSerial.begin(9600); }
참고자료