Czech English

4. Meteostanice

se zobrazením hodnot na webové stránce

V dnešním díle si připravíme vše pro základ jednoduché meteostanice. Zapojíme si potřebné snímače, ověříme jejich funkčnost. A nakonec si vytvoříme webserver, který bude zajišťovat zobrazování naměřených hodnot na webové stránce.


Měření meteorologických dat

Stavbu jednoduché meteostanice začneme připojením snímačů teploty, tlaku a vlhkosti vzduchu podle následujícího obrázku.
V programu pro ověření funkčnosti snímačů využijeme knihovny pro práci s těmito snímači.
Po spuštění programu se v sériovém monitoru budou zobrazovat každou sekundu aktuální hodnoty měřené teploty, tlaku a vlhkosti vzduchu.

Webserver s meteodaty

S využitím příkladu jednoduchého webserveru v minulém díle a doplněním kódu o měření zvolených veličin získáme aplikaci, která bude zobrazovat aktuální hodnoty měřených veličin.
ESP8266_MeteoWebServer.ino
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#include "Adafruit_BMP280.h"
#include "Adafruit_HTU21DF.h"

// **************************************************************
//
//  ESP-12E(LoLin)    BMP280
//  
//      3V     ---     VCC
//      G      ---     GND
//      D1     ---     SDA
//      D2     ---     SCL
//
// **************************************************************

// EPS-01 SDA - GPIO2(D ), SCL - GPIO3(RX)
// EPS-12 SDA - GPIO5(D1), SCL - GPIO4(D2)

#define SDA           5
#define SCL           4

#define BMP280_ADRESA (0x77)

Adafruit_BMP280 bmp;
Adafruit_HTU21DF htu; 

// Wi-Fi Settings
const char* ssid = "REPLACE_WITH_YOUR_SSID"; // Nahradte vasim jmenem site SSID
const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // Nahradte heslem do vasi site

#define TIME_INTERVAL 1000

#define nadmorskaVyska  510
#define korekce         (nadmorskaVyska / 8.3)

float Temperature, Pressure, Humidity;

ESP8266WebServer server(80);

//*********************************************************************
String html = "";

void GenerateHTML()
{
  html="";
  html+= "<!DOCTYPE html>\n";
  html+= "<html>\n";
  html+= "<head>\n";
  html+= "<meta http-equiv='content-type' content='text/html; charset=utf-8'>\n";
  html+= "<title>IoT</title>\n";
  html+= "<style>\n";
  html+= "  html, body {height: 100%; font:100 12px/1.3 Helvetica, Arial, sans-serif; padding-bottom:10px;}\n";
  html+= "  table {font-size: 32px; margin: 10px; border-collapse:collapse; border: solid 1px black;}\n";
  html+= "  td, th {padding: 10px;}\n";
  html+= "  th {background-color: lightgray;}\n";
  html+= "  .r {text-align: right;}\n";
  html+= "</style>\n";
  html+= "</head>\n";
  html+= "\n";
  html+= "<body>\n";
  html+= "<table>\n";
  html+= "<tr><th colspan=3>Lipnice nad Sázavou</th></tr>\n";
  html+= (String)"<tr><td>Teplota: </td><td class=r>"+Temperature+"</td><td>°C</td></tr>\n";
  html+= (String)"<tr><td>Tlak: </td><td class=r>"+Pressure+"</td><td>hPa</td></tr>\n";
  html+= (String)"<tr><td>Tlak přepočtený na hladinu moře: </td><td class=r>"+(Pressure + korekce)+"</td><td>hPa</td></tr>\n";
  html+= (String)"<tr><td>Relativní vlhkost vzduchu: </td><td class=r>"+Humidity+"</td><td>%</td></tr>\n";
  html+= "</table>\n";
  html+= "</body>\n";
  html+= "</html>\n";
}

//**********************************************************************
void handleRoot() {  
  GenerateHTML();
  server.send(200, "text/html", html);
}

//************************************************************************
void handleNotFound(){
  server.send(200, "text/plain", "Invalid page");   
}

//*************************************************************** 
void setup(void){
  Serial.begin(115200);

  Wire.begin(SDA, SCL); 
  if (!bmp.begin(BMP280_ADRESA)) {
    Serial.println("BMP280 senzor nenalezen, zkontrolujte zapojeni!");
    while (1);
  }
  htu.begin(); 
    
  WiFi.mode(WIFI_STA);
  WiFi.persistent(false);  
  WiFi.begin(ssid, password);
  
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

//*********************************************************************

uint32_t timeStamp = millis() - TIME_INTERVAL;

void loop(void){
  if (millis() - timeStamp > TIME_INTERVAL) {
    timeStamp += TIME_INTERVAL;
  
    Temperature = bmp.readTemperature();
    Pressure = bmp.readPressure() / 100.00;
    Humidity = htu.readHumidity();
  }    

  server.handleClient();
}

Stránka v prohlížeči zobrazí aktuální hodnoty teploty, tlaku a vlhlkosti. Pro aktualizaci zobrazovaných hodnot musíme znovu načíst stránku. V další lekci si aplikaci upravíme tak, aby se hodnoty obnovovaly automaticky. Nevýhodou je také nepohodlné sestavování webové stránky v mikrokontoleru.