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.