top of page

ESP8266 Weather station InDoor & OutDoor

Updated: Jul 2, 2021

In this project you’ll create a standalone web server with an ESP8266 that displays the temperature and humidity with a DHT11 or DHT22 sensor for Indoor weather and Weather widgets used for Outdoor weather data using the Arduino IDE . The web server you’ll build can be accessed with any device that has a browser on your local network.


For Indoor Weather station already posted, Refer https://www.dofbot.com/post/esp8266-server-dht-weather-station





To Interfacing the Widgets in the Local web page already posted in Covid-19 tracker, Refer


Circuit Diagram:





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)”.




Subscribe and Download code.


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


#include <Arduino.h>

#include <ESP8266WiFi.h>

#include <Hash.h>

#include <ESPAsyncTCP.h>

#include <ESPAsyncWebServer.h>

#include <Adafruit_Sensor.h>

#include <DHT.h>


// Replace with your network credentials

const char* ssid = "SSID"; // your SSID

const char* password = "PASSWORD"; // your wifi password


#define DHTPIN 5 // Digital pin D1 connected to the DHT sensor


// Uncomment the type of sensor in use:

#define DHTTYPE DHT11 // DHT 11

//#define DHTTYPE DHT22 // DHT 22 (AM2302)

//#define DHTTYPE DHT21 // DHT 21 (AM2301)


DHT dht(DHTPIN, DHTTYPE);


// current temperature & humidity, updated in loop()

float t = 0.0;

float h = 0.0;


// Create AsyncWebServer object on port 80

AsyncWebServer server(80);


// Generally, you should use "unsigned long" for variables that hold time

// The value will quickly become too large for an int to store

unsigned long previousMillis = 0; // will store last time DHT was updated


// Updates DHT readings every 10 seconds

const long interval = 10000;


const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE HTML><html>

<head>

<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

<style>

html {

font-family: Arial;

display: inline-block;

margin: 0px auto;

text-align: center;

}

h2 { font-size: 3.0rem; }

p { font-size: 3.0rem; }

.units { font-size: 1.2rem; }

.dht-labels{

font-size: 1.5rem;

vertical-align:middle;

padding-bottom: 15px;

}

</style>

</head>

<body>

<h2>ESP8266 Indoor Weather DHT Server</h2>

<p>

<i class="fas fa-thermometer-half" style="color:orange;"></i>

<span class="dht-labels">Temperature</span>

<span id="temperature">%TEMPERATURE%</span>

<sup class="units">&deg;C</sup>

</p>

<p>

<i class="fas fa-tint" style="color:#00add6;"></i>

<span class="dht-labels">Humidity</span>

<span id="humidity">%HUMIDITY%</span>

<sup class="units">%</sup>

</p>

<h2>Outdoor Weather Server</h2>

<p>

<script src="https://apps.elfsight.com/p/platform.js" defer></script>

<div class="elfsight-app-debf6015-8b69-4da7-80d7-8480fade4a6d"></div>

</P>

<p>

<i class="fab fa-youtube" style="font-size:1.0rem;color:red;"></i>

<span style="font-size:1.0rem;">Please Subscribe to </span>

<a href="https://www.youtube.com/channel/UCnIld2cZ8iAvoYZlMHWZrtA" target="_blank" style="font-size:1.0rem;">Dofbot YouTube Channel</a>

</P>

</body>

<script>

setInterval(function ( ) {

var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function() {

if (this.readyState == 4 && this.status == 200) {

document.getElementById("temperature").innerHTML = this.responseText;

}

};

xhttp.open("GET", "/temperature", true);

xhttp.send();

}, 10000 ) ;


setInterval(function ( ) {

var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function() {

if (this.readyState == 4 && this.status == 200) {

document.getElementById("humidity").innerHTML = this.responseText;

}

};

xhttp.open("GET", "/humidity", true);

xhttp.send();

}, 10000 ) ;

</script>

</html>)rawliteral";


// Replaces placeholder with DHT values

String processor(const String& var){

//Serial.println(var);

if(var == "TEMPERATURE"){

return String(t);

}

else if(var == "HUMIDITY"){

return String(h);

}

return String();

}


void setup(){

// Serial port for debugging purposes

Serial.begin(115200);

dht.begin();

// Connect to Wi-Fi

WiFi.begin(ssid, password);

Serial.println("Connecting to WiFi");

while (WiFi.status() != WL_CONNECTED) {

delay(1000);

Serial.println(".");

}


// Print ESP8266 Local IP Address

Serial.println(WiFi.localIP());


// Route for root / web page

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

request->send_P(200, "text/html", index_html, processor);

});

server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){

request->send_P(200, "text/plain", String(t).c_str());

});

server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){

request->send_P(200, "text/plain", String(h).c_str());

});


// Start server

server.begin();

}

void loop(){

unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {

// save the last time you updated the DHT values

previousMillis = currentMillis;

// Read temperature as Celsius (the default)

float newT = dht.readTemperature();

// Read temperature as Fahrenheit (isFahrenheit = true)

//float newT = dht.readTemperature(true);

// if temperature read failed, don't change t value

if (isnan(newT)) {

Serial.println("Failed to read from DHT sensor!");

}

else {

t = newT;

Serial.println(t);

}

// Read Humidity

float newH = dht.readHumidity();

// if humidity read failed, don't change h value

if (isnan(newH)) {

Serial.println("Failed to read from DHT sensor!");

}

else {

h = newH;

Serial.println(h);

}

}

}


final Result



Demo video:



197 views0 comments
bottom of page