Previsioni

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 14

================================================================================

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#include <ArduinoJson.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include "bitmaps.h"

//ESP82266 Board Manager -


https://arduino.esp8266.com/stable/package_esp8266com_index.json

// WIFI INFORMATION
#define WIFI_SSID "YOUR WIFI SSIDE"
#define WIFI_PASSWORD "YOUR WIFI PASSWORD"
#define JSON_MEMORY_BUFFER 1024*2

// DISPLAY PINS

#define TFT_CS 15
#define TFT_DC 4
#define TFT_RST 2
#define TFT_BL 5

// You can get API KEY and HOST KEY from RapidAPI, Search weatherapi.com and
subscribe.
const char* API_KEY = "YOUR API KEY";
const char* API_HOST = "YOUR HOST KEY";

// Display and WiFiUdp


Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
WiFiUDP ntpUDP;

// NTP pool link:-


// in.pool.ntp.org is for India
// You can visit pool.ntp.org to find your server
NTPClient timeClient(ntpUDP, "in.pool.ntp.org");

// Latitude and Longitude of you location.


float lat = 28.63;
float lon = 77.22;

// API endpoint.
String weather_url = "https://weatherapi-com.p.rapidapi.com/current.json?q=" +
String(lat) + "%2C" + String(lon);

// Global variables
String current_time;
String hour;
String minute;
String alternative;
String weekDay;
String month;
int day;
int year;
int temp;
// Array for days and months
String weekDays[7]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
String months[12]={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"};

// For delay in fetching weather data.


unsigned long lastTime = 0;
unsigned long fetch_delay = 5000;

void setup(void)
{
// Initialization
Serial.begin(9600);
tft.init(240, 240);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
timeClient.begin();

// Set this to you timezone in seconds i.e 5:30 = 19800 seconds;


timeClient.setTimeOffset(19800);

// Set display rotation


tft.setRotation(3);

// Clear display
tft.fillScreen(0);

// Set text color


tft.setTextColor(ST77XX_CYAN);

// Set font size


tft.setTextSize(2);

String loading = ".";

// While connecting to wifi


while(WiFi.status() != WL_CONNECTED)
{
tft.setCursor(40, 90);
tft.println("Connecting to ");
tft.setCursor(40, 125);
tft.print(WIFI_SSID);
tft.println(loading);
loading += ".";
delay(500);
}

// Clear display
tft.fillScreen(0);

// Show connected
tft.setCursor(60, 110);
tft.println("Connected!");
delay(3000);

// Clear display and fetch tempurature


tft.fillRect(60, 110, 130, 50, ST77XX_BLACK);
fetchTemp();
}
void loop()
{
// Update time.
timeClient.update();

// Fetching weather after delay


if((millis() - lastTime) > fetch_delay)
{
currentTime();
fetchTemp();
lastTime = millis();
}

// Displaying items.
display();
}

void display()
{
// default font size = 6x8px
int font_w = 6;
int font_h = 8;

// UI size
int time_size = 6;
int alt_size = 2;
int day_size = 3;

// Display WxH
int display_w = 240;
int display_h = 240;

// Distance between items


int padding = 8;

tft.setTextSize(time_size); // ie. 6x8 * 5 = 30x40


tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);

// X and Y of time on screen


int time_x = (display_w/2) - ((font_w*time_size)*5)/2 - (font_w * alt_size);
int time_y = 40;

tft.setCursor(time_x, time_y);
tft.println(current_time);
tft.setTextSize(alt_size);
tft.setCursor((time_x + (font_w*time_size)*5), time_y);
tft.println(alternative);
tft.drawBitmap((time_x + (font_w*time_size)*4 + 14), (time_y + (font_h*time_size)
+ padding), wifi, 31, 24, ST77XX_WHITE);
tft.setTextSize(day_size);
tft.setCursor(20, time_y+(font_h*time_size) + padding + 10);
tft.println(weekDay);
tft.setCursor(20, time_y+(font_h*time_size) + (font_h*day_size) + padding * 2 +
10);
tft.println(day);
tft.setCursor(20 + (font_w * day_size)*2 + padding, time_y+(font_h*time_size) +
(font_h*day_size) + padding * 2 + 10);
tft.println(month);
tft.setTextSize(4);
tft.setCursor(20, time_y+(font_h*time_size) + (font_h*day_size) * 2 + padding *
3 + 10);
tft.println(year);
int temp_x = display_w - (font_w * 4)*2 - padding - (font_w * alt_size);
tft.setCursor(temp_x, time_y+(font_h*time_size) + (font_h*day_size) + padding *
2 + 10);
tft.println(temp);
tft.setTextSize(alt_size);
tft.setCursor(temp_x +(font_w * 4) *2 , time_y+(font_h*time_size) +
(font_h*day_size) + padding * 2 + 10);
tft.println("o");
tft.setTextSize(4);
tft.setCursor(temp_x + 10 ,time_y+(font_h*time_size) + (font_h*day_size) * 2 +
padding * 3 + 10);
tft.println("C");
}

// Formatting and setting time


void currentTime()
{
hour = String(timeClient.getHours());
minute = String(timeClient.getMinutes());
weekDay = weekDays[timeClient.getDay()];
time_t epochTime = timeClient.getEpochTime();
struct tm *ptm = gmtime ((time_t *)&epochTime);
day = ptm->tm_mday;
int current_month = ptm->tm_mon+1;
month = months[current_month-1];
year = ptm->tm_year+1900;
if(hour.toInt() >= 12)
alternative = "PM";
else
alternative = "AM";
if(hour.toInt() > 12)
hour = map(hour.toInt(), 13, 24, 1, 12);
if(hour.toInt() < 10)
hour = "0" + hour;
if(minute.toInt() < 10)
minute = "0" + minute;
current_time = String(hour) + ":" + minute;
}

// Getting tempurature from API using Https request


void fetchTemp()
{
WiFiClientSecure client;
HTTPClient https;
client.setInsecure();
https.useHTTP10(true);
if(https.begin(client, weather_url.c_str()))
{
https.addHeader("x-rapidapi-key", API_KEY);
https.addHeader("x-rapidapi-host", API_HOST);

int httpCode = https.GET();


if(httpCode > 0)
{
if(httpCode == 200)
{
DynamicJsonDocument doc(JSON_MEMORY_BUFFER);
DeserializationError error = deserializeJson(doc,
https.getStream());
Serial.print(https.getStream());
if(error)
{
Serial.println("deserialization error");
Serial.println(error.f_str());
temp = -1;
}
else
temp = doc["current"]
["temp_c"].as<int>();
}
}
}
https.end();
}

// ==============================================================================
curl --request GET --url 'https://weatherapi-com.p.rapidapi.com/current.json?
q=TERRACINA%2CIT' --header 'X-RapidAPI-Host: weatherapi-com.p.rapidapi.com' --
header 'X-RapidAPI-Key:b2536c47femshf06cb50511bb415p1227fbjsndd36d384894d'
[root@portatile2009 ~] #
[root@portatile2009 ~] # [root@portatile2009 ~] # curl --request GET \
--url 'https://weatherapi-com.p.rapidapi.com/current.json?q=TERRACINA%2CIT'
\
--header 'X-RapidAPI-Host: weatherapi-com.p.rapidapi.com' \
--header 'X-RapidAPI-Key:
b2536c47femshf06cb50511bb415p1227fbjsndd36d384894d'
bash: [root@portatile2009: comando non trovato
bash: --url: comando non trovato
[root@portatile2009 ~] # curl --request GET \
--url 'https://weatherapi-com.p.rapidapi.com/current.json?q=TERRACINA%2CIT'
\
--header 'X-RapidAPI-Host: weatherapi-com.p.rapidapi.com' \
--header 'X-RapidAPI-Key:
b2536c47femshf06cb50511bb415p1227fbjsndd36d384894d'
[root@portatile2009 ~] # b2536c47femshf06cb50511bb415p1227fbjsndd36d384894d
https://api.openweathermap.org/data/2.5/weather?
appid=ed681b02a54b389f681cb7261e53f703&q=terracina,it&units=metric

================================================================================
WHEATHER,SH
================================================================================
#!/bin/bash
# Questo script preleva il tempo da openweathermap.com nella forma di un file json
in modo da effetuare il display dei dati anche se posto offline
# https://api.openweathermap.org/data/2.5/weather?
appid=ed681b02a54b389f681cb7261e53f703&q=terracina,it&units=metric&lang=it
# Replace 'CITY_NAME' with the name of the city you want to get the ID for
CITY_NAME="terracina,it"
API_KEY="ed681b02a54b389f681cb7261e53f703"
CITY_ID=6691831
LOCATION="Vatican City,VA"
#// url="api.openweathermap.org/data/2.5/weather?q=Città del
Vaticano,VA&appid=ed681b02a54b389f681cb7261e53f703&lang=it&units=metric"
# City and country code for the location (e.g., London,uk)
# cercare la citta-id in https://openweathermap.org/find
#API_ENDPOINT="api.openweathermap.org/data/2.5/weather?q=${LOCATION}&appid=$
{API_KEY}&cnt=5&units=metric&lang=it"
API_ENDPOINT="api.openweathermap.org/data/2.5/weather?q=${CITY_NAME}&appid=$
{API_KEY}&cnt=5&units=metric&lang=it"

# Construct the API URL with the city name and API key
API_URL="https://${API_ENDPOINT}"

# url="api.openweathermap.org/data/2.5/weather?id=${CITY_ID}&appid=$
{API_KEY}&cnt=5&units=metric&lang=it"
# curl ${url} -s -o weather.json
# exit

# Get today's date


TODAY=$(date +'%d/%B/%Y Week %A ' )

# Download the weather forecast JSON


curl -s "$API_ENDPOINT" -o weather.json

# Extract the weather icon code from the JSON response


ICON_CODE=$(jq -r '.weather[0].icon' weather.json)

# Download the weather icon


curl -s "http://openweathermap.org/img/wn/$ICON_CODE.png" -o weather_icon.png

echo "Previsioni del tempo per [${CITY_NAME}] di oggi [${TODAY}]"


jq '.weather[0].description' weather.json
echo "Icona Weather [${ICON_CODE}] salvata come [weather_icon.png]"
jq . weather.json

# Make the API request and store the response in a variable


API_RESPONSE=$(curl -s "$API_URL")

# Extract the city ID from the API response (assuming the API response is in JSON
format)
CITY_ID=$(echo "$API_RESPONSE" | jq -r '.id')

# Check if the city ID is valid


if [[ -n "$CITY_ID" ]]; then
echo "City ID per [${CITY_NAME}] e\': [$CITY_ID]"
else
echo "ERRORE PRELEVO City ID per [${CITY_NAME}] "
fi
================================================================================
PROCEDURA LANCIATA PRIMA DI CONKY
================================================================================

# weather.sh
Previsioni del tempo per [terracina,it] di oggi [21/luglio/2023 Week venerdì ]
"cielo sereno"
Icona Weather [01d] salvata come [weather_icon.png]
{
"coord":
{
"lon": 13.2217,
"lat": 41.2863
},
"weather":
[
{
"id": 800,
"main": "Clear",
"description": "cielo sereno",
"icon": "01d"
}
],
"base": "stations",
"main":
{
"temp": 31.85,
"feels_like": 38.85,
"temp_min": 30.51,
"temp_max": 35.16,
"pressure": 1007,
"humidity": 83
},
"visibility": 10000,
"wind":
{
"speed": 1.34,
"deg": 135,
"gust": 2.68
},
"clouds":
{
"all": 3
},
"dt": 1689954895,
"sys":
{
"type": 2,
"id": 2041426,
"country": "IT",
"sunrise": 1689911488,
"sunset": 1689964509
},
"timezone": 7200,
"id": 6541893,
"name": "Comune di Terracina",
"cod": 200
}

================================================================================
RISPOSTA DELLA CALL
================================================================================
{"coord":{"lon":12.4533,"lat":41.9024},"weather":
[{"id":800,"main":"Clear","description":"cielo
sereno","icon":"01n"}],"base":"stations","main":
{"temp":20.01,"feels_like":19.71,"temp_min":17.16,"temp_max":23.58,"pressure":1017,
"humidity":63},"visibility":10000,"wind":{"speed":1.03,"deg":0},"clouds":
{"all":0},"dt":1694922025,"sys":
{"type":2,"id":2000926,"country":"VA","sunrise":1694926314,"sunset":1694971081},"ti
mezone":7200,"id":6691831,"name":"Città del Vaticano","cod":200}
================================================================================

-----------------------------------------------------------------------------------
------------------------------------------------------------
ESP8266 Weather Forecaster
In this post you’re going to build a weather forecaster with an ESP8266.
-----------------------------------------------------------------------------------
-------------------------------------------------------------
https://randomnerdtutorials.com/esp8266-weather-forecaster/
This project was written by Emmanuel Odunlade and edited by Rui Santos.

I hate being out on a rainy day without an umbrella and I’m pretty sure it’s the
same for everyone else.

Often, the weather widget on our smartphones displays the weather forecast but when
you’re in
a hurry you forget to pay attention to it.

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’t have an alarm neither a
screen, just a few LEDs
that would fit naturally into your environment.

Parts required

Here’s a complete list of the components you need for this project (click the links
below to find
the best price at Maker Advisor):

ESP8266 12-E – read Best ESP8266 Wi-Fi Development Boards


4x LEDs (different colors to represent different weather conditions)
4x Resistors (220 or 330 ohms should do the trick)
Breadboard
Jumper wires

You can use the preceding links or go directly to MakerAdvisor.com/tools to find


all the parts for
your projects at the best price!

Open Weather Map

This project is based on the Open Weather Map API, so it’s 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.

OpenWeatherMap’s 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:

Open a browser and go to OpenWeatherMap


Press the Sign up button and create a free account
Once your account is created, you’ll be presented with a dashboard that contains
several tabs
(see figure below)
Select the API Keys tab and copy your unique Key

This is a unique key you need to pull information from the site.
Copy and paste this key somewhere, you’ll need it in a moment.

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:

http://api.openweathermap.org/data/2.5/forecast?q={your city},{your country


code}&APPID={your API Key}&mode=json&units=metric&cnt=2

Replace {your city} with the city you want data for, {your country code} with the
country code
for that city, and {your API key} with 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:

http://api.openweathermap.org/data/2.5/forecast?
q=Porto,PT&APPID=801d2603e9f2e1c70e042e4------&mode=json&units=metric&cnt=2
https://api.openweathermap.org/data/2.5/weather?q=Città%20del
%20Vaticano,VA&appid=ed681b02a54b389f681cb7261e53f703&lang=it&units=metric

Note: more information on using the API to get weather information is available
here.
https://openweathermap.org/current

Copy your URL into your browser and it should give you a bunch of information that
corresponds
to your local weather forecast information.

Keep your unique API key safe and we can then move to the code section.

Installing the ArduinoJson library


---------------------------------------------------
For this project you need to install the ArduinoJson library in your Arduino IDE
that allows you to
Decode and Encode JSON with Arduino or ESP8266.
Follow these next steps:

Click here to download the ArduinoJson. You should have a .zip folder in your
Downloads folder
Unzip the .zip folder and you should get ArduinoJson-master folder
Rename your folder from ArduinoJson-master to ArduinoJson

Move the ArduinoJson folder to your Arduino IDE installation libraries folder
Finally, re-open your Arduino IDE

Uploading code

Having the ESP8266 add-on for the Arduino IDE installed (how to Install the ESP8266
Board in Arduino IDE),
go to Tools and select “NodeMCU (ESP-12E Module)”.

Copy the following code to your Arduino IDE and upload it to your ESP8266 board.

Go through the code to add your SSID, password, city, country code and Open Weather
Map API key.

/*
* Author: Emmanuel Odunlade
* Complete Project Details https://randomnerdtutorials.com
*/

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

// Replace with your SSID and password details


char ssid[] = "REPLACE_WITH_YOUR_SSID";
char pass[] = "REPLACE_WITH_YOUR_PASSWORD";

WiFiClient client;

// Open Weather Map API server name


const char server[] = "api.openweathermap.org";

// Replace the next line to match your city and 2 letter country code
String nameOfCity = "REPLACE_WITH_YOUR_CITY,REPLACE_WITH_YOUR_COUNTRY_CODE";
// How your nameOfCity variable would look like for Lagos on Nigeria
//String nameOfCity = "Lagos,NG";

// Replace the next line with your API Key


String apiKey = "REPLACE_WITH_YOUR_API_KEY";

String text;

int jsonend = 0;
boolean startJson = false;
int status = WL_IDLE_STATUS;

int rainLed = 2; // Indicates rain


int clearLed = 3; // Indicates clear sky or sunny
int snowLed = 4; // Indicates snow
int hailLed = 5; // Indicates hail

#define JSON_BUFF_DIMENSION 2500

unsigned long lastConnectionTime = 10 * 60 * 1000; // last time you connected


to the server, in milliseconds
const unsigned long postInterval = 10 * 60 * 1000; // posting interval of 10
minutes (10L * 1000L; 10 seconds delay for testing)

void setup() {
pinMode(clearLed, OUTPUT);
pinMode(rainLed, OUTPUT);
pinMode(snowLed, OUTPUT);
pinMode(hailLed, OUTPUT);
Serial.begin(9600);

text.reserve(JSON_BUFF_DIMENSION);

WiFi.begin(ssid,pass);
Serial.println("connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi Connected");
printWiFiStatus();
}

void loop() {
//OWM requires 10mins between request intervals
//check if 10mins has passed then conect again and pull
if (millis() - lastConnectionTime > postInterval) {
// note the time that the connection was made:
lastConnectionTime = millis();
makehttpRequest();
}
}

// print Wifi status


void printWiFiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());

// print your WiFi shield's IP address:


IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);

// print the received signal strength:


long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}

// to request data from OWM


void makehttpRequest() {
// close any connection before send a new request to allow client make connection
to server
client.stop();

// if there's a successful connection:


if (client.connect(server, 80)) {
// Serial.println("connecting...");
// send the HTTP PUT request:
client.println("GET /data/2.5/forecast?q=" + nameOfCity + "&APPID=" + apiKey +
"&mode=json&units=metric&cnt=2 HTTP/1.1");
client.println("Host: api.openweathermap.org");
client.println("User-Agent: ArduinoWiFi/1.1");
client.println("Connection: close");
client.println();

unsigned long timeout = millis();


while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}

char c = 0;
while (client.available()) {
c = client.read();
// since json contains equal number of open and close curly brackets, this
means we can determine when a json is completely received by counting
// the open and close occurences,
//Serial.print(c);
if (c == '{') {
startJson = true; // set startJson true to indicate json message
has started
jsonend++;
}
if (c == '}') {
jsonend--;
}
if (startJson == true) {
text += c;
}
// if jsonend = 0 then we have have received equal number of curly braces
if (jsonend == 0 && startJson == true) {
parseJson(text.c_str()); // parse c string text in parseJson function
text = ""; // clear text string for the next time
startJson = false; // set startJson to false to indicate that a new
message has not yet started
}
}
}
else {
// if no connction was made:
Serial.println("connection failed");
return;
}
}

//to parse json data recieved from OWM


void parseJson(const char * jsonString) {
//StaticJsonBuffer<4000> jsonBuffer;
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;
DynamicJsonBuffer jsonBuffer(bufferSize);

// FIND FIELDS IN JSON TREE


JsonObject& root = jsonBuffer.parseObject(jsonString);
if (!root.success()) {
Serial.println("parseObject() failed");
return;
}

JsonArray& list = root["list"];


JsonObject& nowT = list[0];
JsonObject& later = list[1];

// including temperature and humidity for those who may wish to hack it in

String city = root["city"]["name"];

float tempNow = nowT["main"]["temp"];


float humidityNow = nowT["main"]["humidity"];
String weatherNow = nowT["weather"][0]["description"];

float tempLater = later["main"]["temp"];


float humidityLater = later["main"]["humidity"];
String weatherLater = later["weather"][0]["description"];

// checking for four main weather possibilities


diffDataAction(weatherNow, weatherLater, "clear");
diffDataAction(weatherNow, weatherLater, "rain");
diffDataAction(weatherNow, weatherLater, "snow");
diffDataAction(weatherNow, weatherLater, "hail");

Serial.println();
}

//representing the data


void diffDataAction(String nowT, String later, String weatherType) {
int indexNow = nowT.indexOf(weatherType);
int indexLater = later.indexOf(weatherType);
// if weather type = rain, if the current weather does not contain the weather
type and the later message does, send notification
if (weatherType == "rain") {
if (indexNow == -1 && indexLater != -1) {
digitalWrite(rainLed,HIGH);
digitalWrite(clearLed,LOW);
digitalWrite(snowLed,LOW);
digitalWrite(hailLed,LOW);
Serial.println("Oh no! It is going to " + weatherType + " later! Predicted "
+ later);
}
}
// for snow
else if (weatherType == "snow") {
if (indexNow == -1 && indexLater != -1) {
digitalWrite(snowLed,HIGH);
digitalWrite(clearLed,LOW);
digitalWrite(rainLed,LOW);
digitalWrite(hailLed,LOW);
Serial.println("Oh no! It is going to " + weatherType + " later! Predicted "
+ later);
}

}
// can't remember last time I saw hail anywhere but just in case
else if (weatherType == "hail") {
if (indexNow == -1 && indexLater != -1) {
digitalWrite(hailLed,HIGH);
digitalWrite(clearLed,LOW);
digitalWrite(rainLed,LOW);
digitalWrite(snowLed,LOW);
Serial.println("Oh no! It is going to " + weatherType + " later! Predicted "
+ later);
}

}
// 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
else {
if (indexNow == -1 && indexLater != -1) {
Serial.println("It is going to be sunny later! Predicted " + later);
digitalWrite(clearLed,HIGH);
digitalWrite(rainLed,LOW);
digitalWrite(snowLed,LOW);
digitalWrite(hailLed,LOW);
}
}
}

View raw code

Schematics
Wire your circuit accordingly to the schematic below:

Demonstration
The next figure describes what each LED indicates: (D2) Rain, (D3) Clear sky, (D4)
Snow and (D5) Hail:

Here’s a photo of the final circuit:

Wrapping up
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.

I think having this project hanged somewhere around the house where you can easily
know the weather on your way out is extremely useful.

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.

Thanks for reading!

You might also like reading our Home Automation using ESP8266 eBook.

Build-Web-Servers-with-ESP32-and-ESP8266-eBook-2nd-Edition-500px-h
[eBook] Build Web Servers with ESP32 and ESP8266 (2nd Edition)
Build Web Server projects with the ESP32 and ESP8266 boards to control outputs and
monitor sensors remotely. Learn HTML, CSS, JavaScript and client-server
communication protocols DOWNLOAD »
Recommended Resources

You might also like