1. Project
Get current weather data for any city on Earth from OpenWeatherMap.org

2. Product
* PHPoC WiFi Shield for Arduino(P4S-347)
* Arduino MEGA2560
* MDP070N Color LCD.
Click image for larger version  Name:	resize.png Views:	1 Size:	296.5 KB ID:	149

3. How it works
OpenWeatherMap.org gives current weather data us for free.
Refer to the link below for detail information of price plan.
All data provided by OpenWeatherMap can be freely used through API with non-commercial or commercial purposes. Subscribe to current weather, forecasts, and historical data collections and enjoy our fast simple API.


You have to sign up and create API key to get current weather data.
Click image for larger version  Name:	20170310_000.png Views:	1 Size:	29.2 KB ID:	147
Click image for larger version  Name:	20170310_001.png Views:	1 Size:	56.1 KB ID:	148
Data is in JSON, XML, or HTML format. In this project, I use JSON format.

4. Source code
"YOUR_API_KEY" should be replaced your own API key.
List city names in cityNames array variable. E.g. char *cityNames[] = {"barcelona,es", "paris", "new york", "sydney", "london"};
Click image for larger version  Name:	20170310_002.png Views:	1 Size:	51.2 KB ID:	146
PHP Code:
#include <Arduino.h>
#include <Phpoc.h>
#include <SPI.h>
#include "Timer.h"

#include <ArduinoJson.h>

static PhpocClient phpocClient;

#define INTERVAL 4000

#define HTTP_QUERY_SIZE 1400
uint8_t httpQuery[HTTP_QUERY_SIZE];

int BUTTON_GPIO 3;

char *server "api.openweathermap.org";
char *apiKey "YOUR_API_KEY";
char *cityNames[] = {"CITY_NAME,COUNTRY_CODE"};
char *currentWeather "GET /data/2.5/weather?";

// Group 2xx: Thunderstorm weather5.png
// Group 3xx: Drizzle weather5.png
// Group 5xx: Rain weather5.png

// Group 6xx: Snow weather7.png

// Group 7xx: Atmosphere(안개) weather2.png

// Group 800: CLEAR SKY. weather1.png

// Group 801: FEW CLOUDS. weather4.png
// Group 802: SCATTERED CLOUDS. weather2.png
// Group 803: BROKEN CLOUDS. weather3.png
// Group 804: OVERCAST CLOUDS. weather3.png

uint16_t queryLength 0;
bool isRunning false;
String httpResponse "";
int numberOfCity 0;

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!
Serial);// wait for serial port to connect.
Serial.println();

Serial1.begin(115200);
while (!
Serial1);// wait for serial port to connect.

sendCmd("Clear\r\n");
sendCmd("LoadFont "/unbatang.ttf"\r\n");

Phpoc.begin(PF_LOG_SPI PF_LOG_NET);
Serial.println(Phpoc.localIP());

numberOfCity sizeof(cityNames) / sizeof(char*);

// LCD
initLCD();
}

void loop() {
// put your main code here, to run repeatedly:
apiLoop();
httpLoop();
}

void apiLoop()
{
static 
int index 0;
static 
unsigned long prevMills 0;
bool callApi false;

unsigned long currentMills millis();
if(
prevMills == || (currentMills prevMills >= INTERVAL))
{
prevMills currentMills;
callApi true;
}

if(
callApi)
{
queryLength getQueryCurrentWeather(httpQuerycityNames[index++], apiKey);
if(
index >= numberOfCity)
index 0;

httpResponse "";
if(
phpocClient.connect(server80))
{
isRunning true;
phpocClient.write(httpQueryqueryLength);
}
}
}

char buf[1024];
String f "\r\n\r\n";
void httpLoop()
{
if(
isRunning)
{
uint16_t cnt phpocClient.available();
if(
cnt 0)
{
uint8_t tryRead cnt 128 128 cnt;
memset(buf01024);
uint16_t recv phpocClient.read(buftryRead);

httpResponse httpResponse buf;

int idx httpResponse.lastIndexOf(f);
if(
idx >= 0)
httpResponse httpResponse.substring(idx 4);
}

if(!
phpocClient.connected())
{
isRunning false;
sendCmd("DisableFlush");

//----------------------------------------
// JSON
Serial.println(httpResponse.c_str());

DynamicJsonBuffer jsonBuffer;
JsonObjectroot jsonBuffer.parseObject(httpResponse);
if(!
root.success())
{
Serial.println("parseObject failed.");
phpocClient.stop();
isRunning false;
return;
}

uint16_t resultCode root["cod"];
Serial.println(resultCode);
if(
resultCode == 200)
{
//
JsonObjectweather root["weather"][0];
String weatherId weather["id"];
String cityName root["name"];
double temperature root["main"]["temp"];
String temp String(lround(temperature));
String humidity root["main"]["humidity"];
String weatherDesc weather["description"];

printIcon(weatherId);
printCity(cityName);
printTemperature(temp);
printHumidity(humidity);
printWeather(weatherDesc);

hidePopup();

sendCmd("EnableLayer 1");
sendCmd("EnableLayer 2");
sendCmd("EnableLayer 3");
sendCmd("EnableLayer 4");
sendCmd("EnableLayer 5");
}
else
{
// fail.
}
//----------------------------------------

Serial.println("disconnected");
phpocClient.stop();
sendCmd("EnableFlush");
}
}
}

uint16_t writeString(const charstringuint8_tbufuint16_t pos)
{
const 
charidp string;
uint16_t i 0;

while (*
idp)
{
buf[pos++] = *idp++;
i++;
}

return 
pos;
}

uint16_t getQueryCurrentWeather(uint8_tquerycharcityNamecharapiKey)
{
uint16_t queryLength 0;

queryLength writeString(currentWeatherqueryqueryLength);
queryLength writeString("q="queryqueryLength);
queryLength writeString(cityNamequeryqueryLength);
queryLength writeString("&units=metric&appid="httpQueryqueryLength);
queryLength writeString(apiKeyqueryqueryLength);

queryLength writeString(" HTTP/1.1\r\nHost: api.openweathermap.org\r\n"queryqueryLength);
queryLength writeString("Connection: Closed\r\n\r\n"queryqueryLength);

return 
queryLength;
}

void sendCmd(charcmd)
{
Serial1.println(cmd);
}

void initLCD()
{
sendCmd("Layer 0");
sendCmd("Clear");
//sendCmd("LoadFont "/unbatang.ttf"");

sendCmd("DestroyLayer 1");
sendCmd("DestroyLayer 2");
sendCmd("DestroyLayer 3");
sendCmd("DestroyLayer 4");
sendCmd("DestroyLayer 5");
sendCmd("DestroyLayer 6");
sendCmd("DestroyLayer 7");
sendCmd("DestroyLayer 8");
sendCmd("DestroyLayer 9");
sendCmd("DestroyLayer 10");
sendCmd("DestroyLayer 11");
sendCmd("DestroyLayer 12");
sendCmd("DestroyLayer 13");

createLayers();
createPopup();

showPopup("Loading...");

sendCmd("DisableFlush");
sendCmd("Layer 0");
sendCmd("FontSize 48");
sendCmd("Image 0 0 "/image/bk3.png"");
sendCmd("EnableFlush");
}

void createLayers()
{
// weather condition
sendCmd("CreateLayer 68 380 732 70 1");
// ICON
sendCmd("CreateLayer 68 108 265 245 2");
// City name
sendCmd("CreateLayer 460 60 320 80 3");
// Temperature
sendCmd("CreateLayer 460 170 340 120 4");
// Humidity
sendCmd("CreateLayer 460 310 340 70 5");
}

void createPopup()
{
sendCmd("CreateLayer 80 180 640 120 6");
sendCmd("Layer 6");
sendCmd("DisableLayer 6");
}

void showPopup(String msg)
{
String cmd;
sendCmd("Layer 6");
sendCmd("Clear");
sendCmd("FontSize 72");
sendCmd("Color FFFFFF");
cmd "Button 0 0 640 120 10 336699 336699 "" + msg + """;
sendCmd(cmd.c_str());
sendCmd("EnableLayer 6");
}

void hidePopup()
{
sendCmd("DisableLayer 6");
}

void printCity(String cityName)
{
String cmd;
sendCmd("Layer 3");
sendCmd("DisableLayer 3");
sendCmd("Clear");
sendCmd("FontSize 60");
sendCmd("Color FFFFFF");
cmd "FillText 0 60 ""; cmd = cmd + cityName + """;
sendCmd(cmd.c_str());
}

void printTemperature(String temperature)
{
String cmd;
sendCmd("Layer 4");
sendCmd("DisableLayer 4");
sendCmd("Clear");
sendCmd("FontSize 100");
sendCmd("Color FFFFFF");
cmd "FillText 0 90 ""; cmd = cmd + temperature + """;
sendCmd(cmd.c_str());
}

void printHumidity(String humidity)
{
String cmd;
sendCmd("Layer 5");
sendCmd("DisableLayer 5");
sendCmd("Clear");
sendCmd("FontSize 48");
sendCmd("Color FFFFFF");
cmd "FillText 0 50 ""; cmd = cmd + humidity + "%"";
sendCmd(cmd.c_str());
}

void printIcon(String id)
{
sendCmd("Layer 2");
sendCmd("DisableLayer 2");
sendCmd("Clear");

String cmdicon;
char code id.charAt(0);
switch(
code)
{
case 
'2':
case 
'3':
case 
'5':
icon "/image/weather5.png";
break;
case 
'6':
icon "/image/weather7.png";
break;
case 
'7':
icon "/image/weather2.png";
break;
case 
'8':
if(
id.equals("800"))
icon "/image/weather1.png";
else if(
id.equals("801"))
icon "/image/weather4.png";
else if(
id.equals("802"))
icon "/image/weather2.png";
else if(
id.equals("803"))
icon "/image/weather3.png";
else if(
id.equals("804"))
icon "/image/weather3.png";
break;
}

cmd "Image 0 0 "" + icon + """;
sendCmd(cmd.c_str());
}

void printWeather(String weather)
{
String cmd;
sendCmd("Layer 1");
sendCmd("DisableLayer 1");
sendCmd("Clear");
sendCmd("FontSize 48");
sendCmd("Color FFFFFF");
weather.toUpperCase();
cmd "FillText 0 50 ""; cmd = cmd + weather + """;
//sendCmd(cmd.c_str());