개인용 기상대를 만들때 유용한 기상관측 센서(모듈)입니다. 온습도, 풍속, 강우량, 기압을 한번에 측정해주기 때문에 센서 여러개를 사서 조합할 필요없이 한번에 해결이 가능합니다! 대신 모듈 가격이 좀 비쌉니다;;;

기상관측 모듈에는 아래 부품들이 포함되어 있습니다.

02

대부분은 기구부 부품들이고 센서 회로 자체는 작습니다. (그림에서 우측 하단) 센서는 아래 정보들을 수집해서 출력해줍니다.

•    온도 (C)
•    습도 (%)
•    바람 방향
•    1분간 측정한 평균 풍속 (m/s)
•    5분간 측정한 평균 풍속 (m/s)
•    시간당 강우량 (mm)
•    하루 강우량 (mm)
•    기압 (hPa)

연결방법

기상관측 모듈은 시리얼 통신으로 데이터를 전송해줍니다. 따라서 아래 방법대로 4개 선만 연결해주면 됩니다.

  • 기상관측 모듈 –> 아두이노
  • 5V –> 5V
  • GND –> GND
  • TX –> RX
  • RX –> TX

500px-sen0186_connection_diagram

여기서는 아두이노의 하드웨어 시리얼(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);
}

참고자료