아두이노로 날씨정보 출력하기[esp8266/OpenWeatherMap]
아두이노

아두이노로 날씨정보 출력하기[esp8266/OpenWeatherMap]

반응형

아두이노로 날씨정보를 출력하는 방법은 다양하지만 크게 기상청 RSS, 공공데이터 포털, 그리고 OpenWeatherMap을 이용하는 방법이 주로 쓰인다. 이 중에서 OpenWeatherMap을 이용해 현재 날씨 정보를 출력해볼 것이다. 아래는 실제 작동사진이다.

 

 

 

우선 OpenWeatherMap의 API 키를 발급받아야 하는데 받는 방법은 블로그 초창기에 올린적이 있다. 아래 링크를 참고한다.

 

http://diy-project.tistory.com/5

 

API 키 발급이 완료됬다면 아래와 같이 회로를 꾸민다.

 

 

I2C 통신모듈을 장착한 LCD가 필요한데 해당 LCD에 대해서는 아래 링크를 참고하면 된다.

 

http://diy-project.tistory.com/24

 

다음으로 아래의 라이브러리를 추가한다.

반응형

ArduinoJson-master.zip
다운로드

 

이제 아래 코드를 Wemos D1에 업로드하면 된다. (http://educ8s.tv/esp8266-weather-display/ 를 참고했다.)

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);

const char* ssid     = "*****";      // SSID of local network
const char* password = "*****";   // Password on network
String APIKEY = "*****";
String CityID = "1835848"; // Seoul, KR

WiFiClient client;
char servername[]="api.openweathermap.org";
String result;

int  counter = 60;

String weatherDescription ="";
String weatherLocation = "";
String Country;
float Temperature;
float Humidity;
float Pressure;

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    lcd.setCursor(cursorPosition,2); 
    lcd.print(".");
    cursorPosition++;
  }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);

}

void loop() {
    if(counter == 60) //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure);
      delay(5000);
    }
}

void getWeatherData() //client function to send/receive GET request data.
{
  if (client.connect(servername, 80)) {  //starts client connection, checks for connection
    client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
    client.println("Host: api.openweathermap.org");
    client.println("User-Agent: ArduinoWiFi/1.1");
    client.println("Connection: close");
    client.println();
  } 
  else {
    Serial.println("connection failed"); //error message if no client connect
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1); //waits for data
  while (client.connected() || client.available()) { //connected or data available
    char c = client.read(); //gets byte from ethernet buffer
      result = result+c;
    }

  client.stop(); //stop client
  result.replace('[', ' ');
  result.replace(']', ' ');
  Serial.println(result);

char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';

StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);
if (!root.success())
{
  Serial.println("parseObject() failed");
}

String location = root["name"];
String country = root["sys"]["country"];
float temperature = root["main"]["temp"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];

weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;

}

void displayWeather(String location,String description)
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);
}

void displayConditions(float Temperature,float Humidity, float Pressure)
{
  lcd.clear();
  lcd.print("T:"); 
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");

 //Printing Humidity
 lcd.print(" H:");
 lcd.print(Humidity,0);
 lcd.print(" %");

 //Printing Pressure
 lcd.setCursor(0,1);
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");

}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
String APIKEY = "*****";
String CityID = "1835848"// Seoul, KR

 

코드중 위에 두개의 부분을 설명하자면 APIKEY는 본인이 발급받은 것을 입력하면 되며. CityID는 서울로 설정되있는 상태이다. 만약 바꾸고 싶다면, 부산을 예로 들자면,

 

 

OpenWeatherMap에 부산을 검색하고 위와 같이 주소창에 맨 마지막 숫자가 해당 국가, 도시의 CityID 이다.

 

반응형
    # 테스트용