As I mentioned in my previous blogs, I will be using an API to get the weather information. Specifically, I have used this tutorial.
ESP32 HTTP GET with Arduino IDE (OpenWeatherMap.org and ThingSpeak) | Random Nerd Tutorials
This tutorial is specifically for ESP32. I have tried first to run it with the Nicla Vision board and some libraries were not included/compatible for the Nicla Vision. Fortunately, I have a Huzzah32 feather board that I have used for a different project (link below).
I had some experience with JSON files so modifying the code from the tutorial was pretty straightforward. The OpenWeather API offers many information about the weather. For this demonstration I decided to just use min and max temperature, feels like and the weather in general. I don't think I will display the weather on the screen of the Expansion Board but rather an image from the Github library. I had to convert the temperature because it was in Kelvin and I use Celsius (no Fahrenheit here). Below you can see my edited code.
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
const char* ssid = "Your WiFi";
const char* password = "Your WiFi's Password";
// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "Your OpenWeather API string for your page";
// Example:
//String openWeatherMapApiKey = "bd939aa3d23ff33d3c8f5dd1dd435";
// Replace with your country code and city
String city = "Your City";
String countryCode = "Your Country Code";
// 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;
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 max: ");
double max_temp = myObject["main"]["temp_max"];
Serial.println(max_temp - 273.15);
Serial.print("Temperature min: ");
double min_temp = myObject["main"]["temp_min"];
Serial.println(min_temp - 273.15);
Serial.print("Feels like: ");
double feels = myObject["main"]["feels_like"];
Serial.println(feels - 273.15);
Serial.print("Weather: ");
Serial.println(myObject["weather"][0]["description"]);
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
http.begin(client, 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;
}
You can see below a video of the Huzzah32 that sends HTTP request to OpenWeather, read some data, and then print it on the Serial Monitor after some basic manipulation.
For next steps, I will need to connect via UART the Huzzah32 to either the Nicla Vision board or the Seeeduino XIAO. Having three board increases the complexity of the project and I am not sure if I can connect the three boards for communication. I am still looking for way to use just the Nicla Vision to access the API.