{"id":43469,"date":"2017-09-27T13:26:59","date_gmt":"2017-09-27T13:26:59","guid":{"rendered":"http:\/\/randomnerdtutorials.com\/?p=43469"},"modified":"2020-05-20T16:52:41","modified_gmt":"2020-05-20T16:52:41","slug":"esp8266-weather-forecaster","status":"publish","type":"post","link":"https:\/\/randomnerdtutorials.com\/esp8266-weather-forecaster\/","title":{"rendered":"ESP8266 Weather Forecaster"},"content":{"rendered":"<p>In this post you\u2019re going to build a weather forecaster with an ESP8266.<!--more--><\/p>\n<div style=\"padding: 10px; line-height: 1.2; text-align: center; background-color: #f5f5f5;\">This project was written by\u00a0<a href=\"https:\/\/www.linkedin.com\/in\/emmanuel-odunlade-2431b2b0\/\" target=\"_blank\" rel=\"noopener noreferrer\">Emmanuel Odunlade<\/a> and edited by <a href=\"https:\/\/randomnerdtutorials.com\/about\/\">Rui Santos<\/a>.<\/div>\n<p><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter size-full wp-image-43478\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster2.png?resize=750%2C438&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"\" width=\"750\" height=\"438\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster2.png?w=750&amp;quality=100&amp;strip=all&amp;ssl=1 750w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster2.png?resize=300%2C175&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/p>\n<p>I hate being out on a rainy day without an umbrella and I\u2019m pretty sure it\u2019s the same for everyone else.<\/p>\n<p>Often, the weather widget on our smartphones displays the weather forecast but when you&#8217;re in a hurry you forget to pay attention to it.<\/p>\n<p>So, it would be nice to have a device hanging at the back of the door which reminds you to leave your house with an umbrella on a day where it might rain. This device tells you the weather forecast with a change in the LED color. This device wouldn&#8217;t have an alarm neither a screen, just a few LEDs that would fit naturally into your environment.<\/p>\n<h2>Parts required<\/h2>\n<p>Here\u2019s a complete list of the components you need for this project (click the links below to find the best price at <a href=\"https:\/\/makeradvisor.com\/tools\/\" target=\"_blank\" rel=\"noopener noreferrer\">Maker Advisor<\/a>):<\/p>\n<ul>\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/esp8266-esp-12e-nodemcu-wi-fi-development-board\/\" target=\"_blank\" rel=\"noopener noreferrer\">ESP8266 12-E<\/a>\u00a0&#8211; read <a href=\"https:\/\/makeradvisor.com\/best-esp8266-wi-fi-development-board\/\" target=\"_blank\" rel=\"noopener noreferrer\">Best ESP8266 Wi-Fi Development Boards<\/a><\/li>\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/3mm-5mm-leds-kit-storage-box\/\" target=\"_blank\" rel=\"noopener noreferrer\">4x LEDs<\/a> (different colors to represent different weather conditions)<\/li>\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/resistors-kits\/\" target=\"_blank\" rel=\"noopener noreferrer\">4x Resistors<\/a> (220 or 330 ohms should do the trick)<\/li>\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/mb-102-solderless-breadboard-830-points\/\" target=\"_blank\" rel=\"noopener noreferrer\">Breadboard<\/a><\/li>\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/jumper-wires-kit-120-pieces\/\" target=\"_blank\" rel=\"noopener noreferrer\">Jumper wires<\/a><\/li>\n<\/ul>\n<p>You can use the preceding links or go directly to <a href=\"https:\/\/makeradvisor.com\/tools\/?utm_source=rnt&utm_medium=post&utm_campaign=post\" target=\"_blank\">MakerAdvisor.com\/tools<\/a> to find all the parts for your projects at the best price!<\/p><p style=\"text-align:center;\"><a href=\"https:\/\/makeradvisor.com\/tools\/?utm_source=rnt&utm_medium=post&utm_campaign=post\" target=\"_blank\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/10\/header-200.png?w=1200&#038;quality=100&#038;strip=all&#038;ssl=1\"><\/a><\/p>\n<h2>Open Weather Map<\/h2>\n<p>This project is based on the Open Weather Map API, so it\u2019s necessary to sign up on their platform and obtain an API key before we get down to putting together the schematics and writing the code.<\/p>\n<p>OpenWeatherMap\u2019s free plan provides everything you need for thins example. To use the API you need an API key, known as the APIID. To get an APIID:<\/p>\n<ol>\n<li>Open a browser and go to\u00a0<a href=\"https:\/\/openweathermap.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenWeatherMap<\/a><\/li>\n<li>Press the\u00a0<strong>Sign up<\/strong>\u00a0button and create a free account<\/li>\n<li>Once your account is created, you\u2019ll be presented with a dashboard that contains several tabs (see figure below)<\/li>\n<li>Select the\u00a0<strong>API Keys<\/strong>\u00a0tab and copy your unique\u00a0<strong>Key<\/strong><\/li>\n<\/ol>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-42468\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/08\/openWeatherMap-api-key.png?resize=998%2C474\" sizes=\"(max-width: 998px) 100vw, 998px\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/08\/openWeatherMap-api-key.png?w=998 998w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/08\/openWeatherMap-api-key.png?resize=300%2C142 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/08\/openWeatherMap-api-key.png?resize=768%2C365 768w\" alt=\"\" width=\"750\" height=\"356\" \/><\/p>\n<p>This is a unique key you need to pull information from the site. Copy and paste this key somewhere, you\u2019ll need it in a moment.<\/p>\n<p>To pull information on weather in your chosen location, enter the following URL with the sections in curly brackets replaced with your chosen location information and your unique API key:<\/p>\n<pre>http:\/\/api.openweathermap.org\/data\/2.5\/forecast?q=<span style=\"color: #ff0000;\"><strong>{your city}<\/strong><\/span>,<span style=\"color: #ff0000;\"><strong>{your country code}<\/strong><\/span>&amp;APPID=<span style=\"color: #ff0000;\"><strong>{your API Key}<\/strong><\/span>&amp;mode=json&amp;units=metric&amp;cnt=2<\/pre>\n<p>Replace\u00a0<span style=\"color: #ff0000;\"><strong>{your city}<\/strong><\/span>\u00a0with the city you want data for,\u00a0<span style=\"color: #ff0000;\"><strong>{your country code}<\/strong><\/span>\u00a0with the country code for that city, and\u00a0<span style=\"color: #ff0000;\"><strong>{your API key}<\/strong><\/span>\u00a0with your unique API key we found previously. For example, our API URL for the town of Porto in Portugal, after replacing with the details, would be:<\/p>\n<pre>http:\/\/api.openweathermap.org\/data\/2.5\/forecast?q=Porto,PT&amp;APPID=801d2603e9f2e1c70e042e4------&amp;mode=json&amp;units=metric&amp;cnt=2<\/pre>\n<p><strong>Note<\/strong>: more information on using the API to get weather information is available\u00a0<a href=\"https:\/\/openweathermap.org\/current\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p>Copy your URL into your browser and it should give you a bunch of information that corresponds to your local weather forecast information.<\/p>\n<p>Keep your unique API key safe and we can then move to the code section.<\/p>\n<h2>Installing the ArduinoJson library<\/h2>\n<p>For this project you need to install the ArduinoJson library in your Arduino IDE that allows you to <a href=\"https:\/\/randomnerdtutorials.com\/decoding-and-encoding-json-with-arduino-or-esp8266\/\">Decode and Encode JSON with Arduino or ESP8266<\/a>. Follow these next steps:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/bblanchon\/ArduinoJson\/archive\/v5.13.5.zip\" target=\"_blank\" rel=\"noopener noreferrer\">Click here to download the ArduinoJson<\/a>. You should have a .zip folder in your Downloads folder<\/li>\n<li>Unzip the .zip folder and you should get ArduinoJson-master folder<\/li>\n<li>Rename your folder from\u00a0<del>ArduinoJson-master<\/del>\u00a0to\u00a0<strong>ArduinoJson<\/strong><\/li>\n<li>Move the ArduinoJson folder to your Arduino IDE installation libraries folder<\/li>\n<li>Finally, re-open your Arduino IDE<\/li>\n<\/ol>\n<h2>Uploading code<\/h2>\n<p>Having the ESP8266 add-on for the Arduino IDE installed (<a href=\"https:\/\/randomnerdtutorials.com\/how-to-install-esp8266-board-arduino-ide\/\" target=\"_blank\" rel=\"noopener noreferrer\">how to Install the ESP8266 Board in Arduino IDE<\/a>), go to Tools and select \u201cNodeMCU (ESP-12E Module)\u201d.<\/p>\n<p>Copy the following code to your Arduino IDE and upload it to your ESP8266 board.<\/p>\n<p>Go through the code to add your SSID, password, city, country code and Open Weather Map API key.<\/p>\n<pre style=\"max-height: 40em; margin-bottom: 20px;\"><code class=\"language-c\"> \/*\n  * Author: Emmanuel Odunlade \n  * Complete Project Details http:\/\/randomnerdtutorials.com\n  *\/\n  \n#include &lt;ArduinoJson.h&gt;\n#include &lt;ESP8266WiFi.h&gt;\n#include &lt;WiFiClient.h&gt;\n\n\/\/ Replace with your SSID and password details\nchar ssid[] = &quot;REPLACE_WITH_YOUR_SSID&quot;;        \nchar pass[] = &quot;REPLACE_WITH_YOUR_PASSWORD&quot;;   \n\nWiFiClient client;\n\n\/\/ Open Weather Map API server name\nconst char server[] = &quot;api.openweathermap.org&quot;;\n\n\/\/ Replace the next line to match your city and 2 letter country code\nString nameOfCity = &quot;REPLACE_WITH_YOUR_CITY,REPLACE_WITH_YOUR_COUNTRY_CODE&quot;; \n\/\/ How your nameOfCity variable would look like for Lagos on Nigeria\n\/\/String nameOfCity = &quot;Lagos,NG&quot;; \n\n\/\/ Replace the next line with your API Key\nString apiKey = &quot;REPLACE_WITH_YOUR_API_KEY&quot;; \n\nString text;\n\nint jsonend = 0;\nboolean startJson = false;\nint status = WL_IDLE_STATUS;\n\nint rainLed = 2;  \/\/ Indicates rain\nint clearLed = 3; \/\/ Indicates clear sky or sunny\nint snowLed = 4;  \/\/ Indicates snow\nint hailLed = 5;  \/\/ Indicates hail\n\n#define JSON_BUFF_DIMENSION 2500\n\nunsigned long lastConnectionTime = 10 * 60 * 1000;     \/\/ last time you connected to the server, in milliseconds\nconst unsigned long postInterval = 10 * 60 * 1000;  \/\/ posting interval of 10 minutes  (10L * 1000L; 10 seconds delay for testing)\n\nvoid setup() {\n  pinMode(clearLed, OUTPUT);\n  pinMode(rainLed, OUTPUT);\n  pinMode(snowLed, OUTPUT);\n  pinMode(hailLed, OUTPUT);\n  Serial.begin(9600);\n  \n  text.reserve(JSON_BUFF_DIMENSION);\n  \n  WiFi.begin(ssid,pass);\n  Serial.println(&quot;connecting&quot;);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(&quot;.&quot;);\n  }\n  Serial.println(&quot;WiFi Connected&quot;);\n  printWiFiStatus();\n}\n\nvoid loop() { \n  \/\/OWM requires 10mins between request intervals\n  \/\/check if 10mins has passed then conect again and pull\n  if (millis() - lastConnectionTime &gt; postInterval) {\n    \/\/ note the time that the connection was made:\n    lastConnectionTime = millis();\n    makehttpRequest();\n  }\n}\n\n\/\/ print Wifi status\nvoid printWiFiStatus() {\n  \/\/ print the SSID of the network you're attached to:\n  Serial.print(&quot;SSID: &quot;);\n  Serial.println(WiFi.SSID());\n\n  \/\/ print your WiFi shield's IP address:\n  IPAddress ip = WiFi.localIP();\n  Serial.print(&quot;IP Address: &quot;);\n  Serial.println(ip);\n\n  \/\/ print the received signal strength:\n  long rssi = WiFi.RSSI();\n  Serial.print(&quot;signal strength (RSSI):&quot;);\n  Serial.print(rssi);\n  Serial.println(&quot; dBm&quot;);\n}\n\n\/\/ to request data from OWM\nvoid makehttpRequest() {\n  \/\/ close any connection before send a new request to allow client make connection to server\n  client.stop();\n\n  \/\/ if there's a successful connection:\n  if (client.connect(server, 80)) {\n    \/\/ Serial.println(&quot;connecting...&quot;);\n    \/\/ send the HTTP PUT request:\n    client.println(&quot;GET \/data\/2.5\/forecast?q=&quot; + nameOfCity + &quot;&amp;APPID=&quot; + apiKey + &quot;&amp;mode=json&amp;units=metric&amp;cnt=2 HTTP\/1.1&quot;);\n    client.println(&quot;Host: api.openweathermap.org&quot;);\n    client.println(&quot;User-Agent: ArduinoWiFi\/1.1&quot;);\n    client.println(&quot;Connection: close&quot;);\n    client.println();\n    \n    unsigned long timeout = millis();\n    while (client.available() == 0) {\n      if (millis() - timeout &gt; 5000) {\n        Serial.println(&quot;&gt;&gt;&gt; Client Timeout !&quot;);\n        client.stop();\n        return;\n      }\n    }\n    \n    char c = 0;\n    while (client.available()) {\n      c = client.read();\n      \/\/ since json contains equal number of open and close curly brackets, this means we can determine when a json is completely received  by counting\n      \/\/ the open and close occurences,\n      \/\/Serial.print(c);\n      if (c == '{') {\n        startJson = true;         \/\/ set startJson true to indicate json message has started\n        jsonend++;\n      }\n      if (c == '}') {\n        jsonend--;\n      }\n      if (startJson == true) {\n        text += c;\n      }\n      \/\/ if jsonend = 0 then we have have received equal number of curly braces \n      if (jsonend == 0 &amp;&amp; startJson == true) {\n        parseJson(text.c_str());  \/\/ parse c string text in parseJson function\n        text = &quot;&quot;;                \/\/ clear text string for the next time\n        startJson = false;        \/\/ set startJson to false to indicate that a new message has not yet started\n      }\n    }\n  }\n  else {\n    \/\/ if no connction was made:\n    Serial.println(&quot;connection failed&quot;);\n    return;\n  }\n}\n\n\/\/to parse json data recieved from OWM\nvoid parseJson(const char * jsonString) {\n  \/\/StaticJsonBuffer&lt;4000&gt; jsonBuffer;\n  const size_t bufferSize = 2*JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(2) + 4*JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(2) + 3*JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + 2*JSON_OBJECT_SIZE(7) + 2*JSON_OBJECT_SIZE(8) + 720;\n  DynamicJsonBuffer jsonBuffer(bufferSize);\n\n  \/\/ FIND FIELDS IN JSON TREE\n  JsonObject&amp; root = jsonBuffer.parseObject(jsonString);\n  if (!root.success()) {\n    Serial.println(&quot;parseObject() failed&quot;);\n    return;\n  }\n\n  JsonArray&amp; list = root[&quot;list&quot;];\n  JsonObject&amp; nowT = list[0];\n  JsonObject&amp; later = list[1];\n\n  \/\/ including temperature and humidity for those who may wish to hack it in\n  \n  String city = root[&quot;city&quot;][&quot;name&quot;];\n  \n  float tempNow = nowT[&quot;main&quot;][&quot;temp&quot;];\n  float humidityNow = nowT[&quot;main&quot;][&quot;humidity&quot;];\n  String weatherNow = nowT[&quot;weather&quot;][0][&quot;description&quot;];\n\n  float tempLater = later[&quot;main&quot;][&quot;temp&quot;];\n  float humidityLater = later[&quot;main&quot;][&quot;humidity&quot;];\n  String weatherLater = later[&quot;weather&quot;][0][&quot;description&quot;];\n\n  \/\/ checking for four main weather possibilities\n  diffDataAction(weatherNow, weatherLater, &quot;clear&quot;);\n  diffDataAction(weatherNow, weatherLater, &quot;rain&quot;);\n  diffDataAction(weatherNow, weatherLater, &quot;snow&quot;);\n  diffDataAction(weatherNow, weatherLater, &quot;hail&quot;);\n  \n  Serial.println();\n}\n\n\/\/representing the data\nvoid diffDataAction(String nowT, String later, String weatherType) {\n  int indexNow = nowT.indexOf(weatherType);\n  int indexLater = later.indexOf(weatherType);\n  \/\/ if weather type = rain, if the current weather does not contain the weather type and the later message does, send notification\n  if (weatherType == &quot;rain&quot;) { \n    if (indexNow == -1 &amp;&amp; indexLater != -1) {\n      digitalWrite(rainLed,HIGH);\n      digitalWrite(clearLed,LOW);\n      digitalWrite(snowLed,LOW);\n      digitalWrite(hailLed,LOW);\n      Serial.println(&quot;Oh no! It is going to &quot; + weatherType + &quot; later! Predicted &quot; + later);\n    }\n  }\n  \/\/ for snow\n  else if (weatherType == &quot;snow&quot;) {\n    if (indexNow == -1 &amp;&amp; indexLater != -1) {\n      digitalWrite(snowLed,HIGH);\n      digitalWrite(clearLed,LOW);\n      digitalWrite(rainLed,LOW);\n      digitalWrite(hailLed,LOW);\n      Serial.println(&quot;Oh no! It is going to &quot; + weatherType + &quot; later! Predicted &quot; + later);\n    }\n    \n  }\n  \/\/ can't remember last time I saw hail anywhere but just in case\n  else if (weatherType == &quot;hail&quot;) { \n   if (indexNow == -1 &amp;&amp; indexLater != -1) {\n      digitalWrite(hailLed,HIGH);\n      digitalWrite(clearLed,LOW);\n      digitalWrite(rainLed,LOW);\n      digitalWrite(snowLed,LOW);\n      Serial.println(&quot;Oh no! It is going to &quot; + weatherType + &quot; later! Predicted &quot; + later);\n   }\n\n  }\n  \/\/ for clear sky, if the current weather does not contain the word clear and the later message does, send notification that it will be sunny later\n  else {\n    if (indexNow == -1 &amp;&amp; indexLater != -1) {\n      Serial.println(&quot;It is going to be sunny later! Predicted &quot; + later);\n      digitalWrite(clearLed,HIGH);\n      digitalWrite(rainLed,LOW);\n      digitalWrite(snowLed,LOW);\n      digitalWrite(hailLed,LOW);\n    }\n  }\n}\n<\/code><\/pre>\n\t<p style=\"text-align:center\"><a class=\"rntwhite\" href=\"https:\/\/github.com\/RuiSantosdotme\/RNT-guest-posts\/raw\/master\/Emmanuel_Odunlade\/ESP8266_Weather_Forecaster.ino\" target=\"_blank\">View raw code<\/a><\/p>\n<h2>Schematics<\/h2>\n<p>Wire your circuit accordingly to the schematic below:<\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" class=\"aligncenter size-full wp-image-43500\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/ESP8266-forecaster-schematics.png?resize=800%2C468&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"\" width=\"800\" height=\"468\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/ESP8266-forecaster-schematics.png?w=800&amp;quality=100&amp;strip=all&amp;ssl=1 800w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/ESP8266-forecaster-schematics.png?resize=300%2C176&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/ESP8266-forecaster-schematics.png?resize=768%2C449&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<h2>Demonstration<\/h2>\n<p>The next figure describes what each LED indicates: (D2) Rain, (D3) Clear sky, (D4) Snow and (D5) Hail:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-43476\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster-how-it-works.png?resize=815%2C503&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"\" width=\"815\" height=\"503\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster-how-it-works.png?w=1086&amp;quality=100&amp;strip=all&amp;ssl=1 1086w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster-how-it-works.png?resize=300%2C185&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster-how-it-works.png?resize=768%2C474&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster-how-it-works.png?resize=1024%2C632&amp;quality=100&amp;strip=all&amp;ssl=1 1024w\" sizes=\"(max-width: 815px) 100vw, 815px\" \/><\/p>\n<p>Here&#8217;s a photo of the final circuit:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-43473\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/esp8266-rain-forecaster.jpg?resize=605%2C390&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"\" width=\"605\" height=\"390\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/esp8266-rain-forecaster.jpg?w=605&amp;quality=100&amp;strip=all&amp;ssl=1 605w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/esp8266-rain-forecaster.jpg?resize=300%2C193&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p>\n<h2>Wrapping up<\/h2>\n<p>Nowadays, the goal of computing is to create a natural user interface between man and computers. We are looking to things like AR (Augmented Reality) to make that reality, but the truth is we are all getting tired of constantly looking at our phones and PCs for the tiniest piece of information.<\/p>\n<p>I think having this project hanged somewhere around the house where you can easily know the weather on your way out is extremely useful.<\/p>\n<p>To take this project further, I may throw in a 3D printed enclosure with a battery back up to make this look more neat. I will certainly share with you when that is done.<\/p>\n<p>Thanks for reading!<\/p>\n<p><strong>You might also like reading our <a href=\"https:\/\/randomnerdtutorials.com\/home-automation-using-esp8266\/\">Home Automation using ESP8266 eBook<\/a>.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post you\u2019re going to build a weather forecaster with an ESP8266. I hate being out on a rainy day without an umbrella and I\u2019m pretty sure it\u2019s the same for everyone else. <\/p>\n<p class=\"read-more-container\"><a href=\"https:\/\/randomnerdtutorials.com\/esp8266-weather-forecaster\/\" class=\"read-more button\">CONTINUE READING \u00bb<\/a><\/p>\n","protected":false},"author":1,"featured_media":43477,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[265,214,300,264],"tags":[],"class_list":["post-43469","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp8266-project","category-esp8266","category-0-esp8266","category-project"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/09\/forecaster1.png?fit=1280%2C720&quality=100&strip=all&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/43469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/comments?post=43469"}],"version-history":[{"count":0,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/43469\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media\/43477"}],"wp:attachment":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media?parent=43469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/categories?post=43469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/tags?post=43469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}