(IOT Project) Get Weather Data Using ESP8266 and Openweather API

Introduction: (IOT Project) Get Weather Data Using ESP8266 and Openweather API

About: Page owner Sameen Solkar Email : tinkerbuildlearn@gmail.com

In this instructable we are going to build a simple IOT project in which fetch the weather data of our city from openweather.com/api and display it using Processing software.

Supplies

  1. Arduino
  2. ESP8266 or any other esp module
  3. Arduino IDE
  4. Processing software
  5. Breadboard
  6. Jumperwires Male to Male and Male to Female

Step 1: Obtain API Key and URL From Openweather.org

  1. Create account in https://openweathermap.org (Image 1)
  2. After you login go to API keys and you will get the API key as shown in image.(Image 2)
  3. Copy the API key and save it in a notepad file.(Image 3)
  4. Go to the API option (Image 4)
  5. Go to API doc option as shown in image (Image 5)
  6. Copy the url from the and shown and save it in a notepad file (Image 6)

Step 2: Connection Diagram

Step 3: Arduino Code

Before copying this code into Arduino make sure you have downloaded ESP8266 board into arduino ide using Boards manager.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Arduino_JSON.h>

const char* ssid = "Your SSID";
const char* password = "Your SSID PASSWORD";// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "Paste your API key here";

// Replace with your country code and city
String city = "Mumbai";
String countryCode = "IN";
String data[16];
// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;

String jsonBuffer;

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  //Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
   // Serial.print(".");
  }
//  Serial.println("");
//  Serial.print("Connected to WiFi network with IP Address: ");
//  Serial.println(WiFi.localIP());
// 
//  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
}

void loop() {
  // Send an HTTP GET request
  if ((millis() - lastTime) > timerDelay) {
    // Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey + "&units=metric";
      jsonBuffer = httpGETRequest(serverPath.c_str());
      //Serial.println(jsonBuffer);
      JSONVar myObject = JSON.parse(jsonBuffer);
  
      // JSON.typeof(jsonVar) can be used to get the type of the var
      if (JSON.typeof(myObject) == "undefined") {
        //Serial.println("Parsing input failed!");
        return;
      }
//      Serial.print("JSON object = ");
//      Serial.println(myObject);
//      Serial.print("Temperature: ");
//      Serial.println(myObject["main"]["temp"]);
//      Serial.print("Pressure: ");
//      Serial.println(myObject["main"]["pressure"]);
//      Serial.print("Humidity: ");
//      Serial.println(myObject["main"]["humidity"]);
//      Serial.print("Wind Speed: ");
//      Serial.println(myObject["wind"]["speed"]);
 int temp = myObject["main"]["temp"];
  long pres = myObject["main"]["pressure"];
    int humid = myObject["main"]["humidity"];
     int wind = myObject["wind"]["speed"];
      
     
     
      String country = JSON.stringify(myObject["sys"]["country"]);
        String city1 = JSON.stringify(myObject["name"]); 
         String weather = JSON.stringify(myObject["weather"][0]["description"]);
          String icon = JSON.stringify(myObject["weather"][0]["icon"]);
          
          
     
      data[0]= String(temp);
      data[1]= "/";
      data[2]= String(pres);
      data[3]= "/";
      data[4]= String(humid);
      data[5]= "/";
      data[6]= String(wind);
      data[7]= "/";
      data[8]= country;
      data[9]= "/";
      data[10]= city1;
      data[11]= "/";
      data[12]= weather;
      data[13]= "/";
      data[14]= icon;
      data[15]= "\n";
      
  for(int i=0;i<=15;i++){
      Serial.print(data[i]);
  }
    }
    else {
      //Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

String httpGETRequest(const char* serverName) {
  HTTPClient http;
    
  // Your IP address with path or Domain name with URL path 
  http.begin(serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
//    Serial.print("HTTP Response code: ");
//    Serial.println(httpResponseCode);
    payload = http.getString(); 
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();

  return payload;
} 

Step 4: Processing Code

Before running this code download the given icon images which will be used to show weather. And keep the images and code in the same folder.

import processing.serial.*; 
Serial myPort;
PImage img;
PImage img2;
PImage img3;
PImage img4;
PImage img5;
PImage img6;
PImage img7;  
PImage img8;
PImage img9;
PImage img10;
PImage img11;
PImage img12;
PImage img13;
PImage img14;
PImage img15;
PImage img16;
PImage img17;
PImage img18;

int temp;
int pres;
int humid;
int wind;
String city = " ";
String country = " "; 
String weather =" ";
String icon = " "; 
void setup(){
 size(500,500);
 myPort = new Serial(this,"COM3",115200);
 img = loadImage("01d.png");
 img2 = loadImage("01n.png");
 img3 = loadImage("02d.png");
 img4 = loadImage("02n.png");
 img5 = loadImage("03d.png");
 img6 = loadImage("03n.png");
 img7 = loadImage("04d.png");
 img8 = loadImage("04n.png");
 img9 = loadImage("09d.png");
 img10 = loadImage("09n.png");
 img11 = loadImage("10d.png");
 img12 = loadImage("10n.png");
 img13 = loadImage("11d.png");
 img14 = loadImage("11n.png");
 img15 = loadImage("13d.png");
 img16 = loadImage("13n.png");
 img17 = loadImage("50d.png");
 img18 = loadImage("50n.png"); 
}

void draw(){
     background(72,209,204);
     textSize(22); 
     fill(54, 69, 79);
     text("Temperature: ",25,100);
     text(temp +"°C",200,100);
     text("Pressure:",25,150);
     text(pres + " hpa",200,150);
     text("Humidity: ",25,200);
     text(humid+" %",200,200);
     text("Wind: ",25,250); 
     text(wind+" m/s",200,250);
     text("Country/City: ",25,300); 
     text(country +"-"+ city,200,300);
     text("Weather: ",25,350); 
     text(weather,200,350);
     
     if(icon.contains("01d")){
         image(img, 380, 15);
         
       }
      else if(icon.contains("01n")){
         image(img2,  380, 15);
         
       }
       else if(icon.contains("02d")){
         image(img3,  380, 15);
         
       }
       else if(icon.contains("02n")){
         image(img4,  380, 15);
         
       }
       else if(icon.contains("03d")){
         image(img5, 380, 15);
         
       }
       else if(icon.contains("03n")){
         image(img6, 380, 15);
         
       }
       else if(icon.contains("04d")){
         image(img7, 380, 15);
         
       }
       else if(icon.contains("04n")){
         image(img8, 380, 15);
         
       }
       else if(icon.contains("09d")){
         image(img9,  380, 15);
         
       }
       else if(icon.contains("09n")){
         image(img10, 380, 15);
         
       }
       else if(icon.contains("10d")){
         image(img11, 380, 15);
         
       }
       else if(icon.contains("10n")){
         image(img12,  380, 15);
         
       }
       else if(icon.contains("11d")){
         image(img13,  380, 15);
         
       }
       else if(icon.contains("11n")){
         image(img14,  380, 15);
         
       }
       else if(icon == "13d"){
         image(img15,  380, 15);
         
       }
       else if(icon.contains("13n")){
         image(img16,  380, 15);
         
       }
       else if(icon.contains("50d")){
         image(img17, 380, 15);
         
       }
       else if(icon.contains( "50n")){
         image(img18, 380, 15);
         
       }
     
}

 
void serialEvent(Serial myPort){
  if (myPort.available() > 0){
     String data = myPort.readStringUntil('\n');
  if(data != null){  
    data = trim(data);
    String items[] = split(data, '/');
    if (items.length > 1) {
      temp = int(items[0]);
       pres = int(items[1]);
       humid = int(items[2]);
       wind = int(items[3]);
       city = items[4].replace("\"","");
       country = items[5].replace("\"","");
       weather = items[6].replace("\"","");
       icon =  items[7].replace("\"","");    
     }   
}
}
}<strong>
    <br></strong>

Step 5: Project Output

Be the First to Share

    Recommendations

    • Fandom Contest

      Fandom Contest
    • First Time Author Contest

      First Time Author Contest
    • Water Speed Challenge

      Water Speed Challenge

    2 Comments

    0
    tednunn
    tednunn

    6 days ago

    Dude - It looks like you pasted your API key into the code. You may want to update using the variable instead. Also, thanks for the tutorial!

    0
    tinkerbuildlearn
    tinkerbuildlearn

    Reply 5 days ago

    Yes bro I forgot to change api key to variable while posting anyways corrections made, Thanks ! for point this out.