Preface :
- Develop a Weather Station which can be accessed through the internet
Advantage :
- Extremely low budget
- Easily available hardware
- Easy to configure
Hardware Components Required :
- NodeMCU – ESP 8266-12E
- BME280 I2C or SPI Temperature Humidity Pressure Sensor
- Breadboard
Internet Subscription Required :
- Yaler.net
Hardware Details
ESP8266 – NodeMCU 12E
BME/BMP 280 Sensor
Bread Board
Jumper cables
Pin Configuration
Pin Number D3 ESP — > SDA Pin BMP/BME 280
Pin Number D4 ESP — > SDB Pin BMP/BME 280
Pin Number 3V3 ESP — > VIN Pin BMP/BME 280
Pin Number GND ESP — > GND Pin BMP/BME 280
Online Subscription for Domain
Send an email to get an account by paying their fee.
Once you get the user account note down your Relay-Host and Relay-Domain
Install Arduino (if you dont have) from https://www.arduino.cc/en/Main/Software
After installation Open the Arduino software.
Tools –> Boards –> Board Manager
You can also download the Yaler library files from https://bitbucket.org/yaler/yalercontrib/downloads/YalerESP8266WiFiServer.zip
Once download copy to Arduino Library folder make sure your folder looks like below.
/********* Internet Accessible Weather Station by Haneef Puttur *********/ #include <Wire.h> #include <ESP8266WiFi.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <YalerESP8266WiFiServer.h> Adafruit_BME280 bme; // I2C // Replace with your network details const char* ssid = "wifiname"; // Replace with SSID const char* password = "Password"; // Replace with Wifi Password const char* relaydomain = "xxxxxx.yaler.io"; // Replace with relay domain from yaler.net const char* relayhost = "haneef-xxxx-xxxx"; // Replace with relay host from yaler.net float h, t, p, pin, dp; char temperatureFString[6]; char dpString[6]; char humidityString[6]; char pressureString[7]; char pressureInchString[6]; #undef BME280_ADDRESS #define BME280_ADDRESS (0x76) // Web Server on port 80 //WiFiServer server(80); YalerESP8266WiFiServer server(relaydomain, 80, relayhost); // only runs once on boot void setup() { // Initializing serial port for debugging purposes Serial.begin(115200); delay(10); Wire.begin(D3, D4); Wire.setClock(100000); // Connecting to WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Starting the web server server.begin(); Serial.println("Web server running. Waiting for the ESP IP..."); delay(10000); // Printing the ESP IP address Serial.println(WiFi.localIP()); Serial.println(F("BME280 test")); if (!bme.begin()) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } } void getWeather() { h = bme.readHumidity(); t = bme.readTemperature(); // t = t*1.8+32.0; // enable this line if you want in FarenHeit dp = t-0.36*(100.0-h); p = bme.readPressure()/100.0F; pin = 0.02953*p; dtostrf(t, 5, 1, temperatureFString); dtostrf(h, 5, 1, humidityString); dtostrf(p, 6, 1, pressureString); dtostrf(pin, 5, 2, pressureInchString); dtostrf(dp, 5, 1, dpString); delay(100); } // runs over and over again void loop() { // Listenning for new clients WiFiClient client = server.available(); if (client) { Serial.println("New client"); // bolean to locate when the http request ends boolean blank_line = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n' && blank_line) { getWeather(); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); // your actual web page that displays temperature client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>"); client.println("<body><h1>Haneef Puttur - Weather Station</h1>"); client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>"); client.println("<h3>Temperature = "); client.println(temperatureFString); client.println("°C</h3><h3>Humidity = "); client.println(humidityString); client.println("%</h3><h3>Approx. Dew Point = "); client.println(dpString); client.println("°F</h3><h3>Pressure = "); client.println(pressureString); client.println("hPa ("); client.println(pressureInchString); client.println("Inch)</h3></td></tr></tbody></table></body></html>"); break; } if (c == '\n') { // when starts reading a new line blank_line = true; } else if (c != '\r') { // when finds a character on the current line blank_line = false; } } } // closing the client connection delay(1); client.stop(); Serial.println("Client disconnected."); } }
Please dont forget edit below lines in code before uploading with your own parameters
const char* ssid = “wifiname”; // Replace with SSID
const char* password = “Password”; // Replace with Wifi Password
const char* relaydomain = “xxxxxx.yaler.io”; // Replace with relay domain from yaler.net const char* relayhost = “haneef-xxxx-xxxx”; // Replace with relay host from yaler.net
Run and Upload the Code.
Once successfully uploaded if all goes well you can access the Weather station from internet using the link relaydomain.relayhost which you configured.
Output
Updated Version of this article available below