반응형
아두이노로 날씨정보를 출력하는 방법은 다양하지만 크게 기상청 RSS, 공공데이터 포털, 그리고 OpenWeatherMap을 이용하는 방법이 주로 쓰인다. 이 중에서 OpenWeatherMap을 이용해 현재 날씨 정보를 출력해볼 것이다. 아래는 실제 작동사진이다.
우선 OpenWeatherMap의 API 키를 발급받아야 하는데 받는 방법은 블로그 초창기에 올린적이 있다. 아래 링크를 참고한다.
http://diy-project.tistory.com/5
API 키 발급이 완료됬다면 아래와 같이 회로를 꾸민다.
I2C 통신모듈을 장착한 LCD가 필요한데 해당 LCD에 대해서는 아래 링크를 참고하면 된다.
http://diy-project.tistory.com/24
다음으로 아래의 라이브러리를 추가한다.
반응형
이제 아래 코드를 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 이다.
반응형
'아두이노' 카테고리의 다른 글
아두이노 I2C통신하기 (0) | 2018.08.26 |
---|---|
아두이노에서 지자기센서 사용하기 [HMC5883L] (0) | 2018.08.25 |
휴대용 미세먼지 측정기 자작 #1 (준비) (0) | 2018.07.19 |
esp8266에 서보모터를 연결할때 주의점... (0) | 2018.07.16 |
아두이노로 ESC제어 (0) | 2018.07.10 |