ESP8266 WiFi OneWire AP Client Server HTML Scheme Eagle DS18B20 Thermometer

WLAN-Thermometer im STA / AP-Modus mit ESP8266


  • Das Thermometer verwendet den WLAN-Chip ESP8266 in Version 12E der Entwicklungsplatine NodeMCU v3 Lolin. Der Wifi-Chip hält den Webserver neben der Erfassung der Daten von den Temperatursensoren auch dort, wo er die gemessenen Daten liest. Beim Laden der Seite werden immer Daten gemessen. Inaktivitätsdaten werden nicht aufgezeichnet. Auf dem Webserver können Sie HTML + CSS-Code ausführen, wodurch Sie eine nette grafische Benutzeroberfläche erstellen können, um die Temperatur für den Benutzer darzustellen, beispielsweise in einer Tabelle.
  •   
  • Es gibt zwei Versionen dieses Projekts, und die Funktionalität der Website ist dieselbe. In beiden Fällen führt der ESP8266 einen Webserver aus, der die Temperaturen in der Tabelle anzeigt. Versionen unterscheiden die Konnektivität. In einem Fall ist es möglich, das bereits vorhandene LAN-Netzwerk zu verwenden, mit dem die Karte verbunden ist und einen Webserver mit einer statischen oder dynamischen IP-Adresse verwaltet. Wenn Sie die IP in das Browserfenster eingeben, kann der Benutzer über die ESP mit Temperaturen auf die gewünschte Seite zugreifen, oder sogar der Hostname. Der Domänenname kann auch verwendet werden, wenn mDNS verwendet wird.
  • Im letzteren Fall sendet die Karte ihre eigene SSID im AP-Modus als Zugangspunkt. Der Benutzer greift auf die Karte zu, indem er das Passwort in das Netzwerk (in ESP8266 enthalten) eingibt. Die Karte überträgt eine SSID mit WPA / WPA2-PSK-Verschlüsselung oder ein offenes WLAN-Netzwerk. Der Zugriff auf Daten ist nur innerhalb der Reichweite dieses WLAN-Netzwerks außerhalb des LAN des Heimnetzwerks möglich. Das ESP betreibt auch einen DHCP-Server, der nach erfolgreicher Benutzerauthentifizierung eine IP-Adresse aus dem Bereich zuweist. Die Webseite befindet sich auf der Gateway-IP-Adresse - ESP.
  • Die Temperaturdaten werden von einem Paar DS18B20-Temperatursensoren aufgezeichnet, die an einen OneWire-Bus angeschlossen sind, der die Eindrahtdatenerfassung mit der Möglichkeit ermöglicht, den Treiber auf zehn bis hunderte von Metern zu ziehen. DS18B20 werden in zwei Hauptversionen hergestellt - einen inneren Sensor in einem Transistorgehäuse oder ein wasserdichtes Außendesign in einem Aluminiumrohr. Der OneWire-Bus ist für Interferenzumgebungen geeignet und es können bis zu 2 56 -Sensoren angeschlossen werden. Die einzelnen Sensoren sind durch ihre Fabrikadresse - die Seriennummer - unterteilt. Es gibt zwei Hauptoptionen zum Anschließen der Sensoren. Normaler Anschluss und parasitär, beide können mit 3,3 - 5,5 V versorgt werden. Bei normaler Verdrahtung ist das Ergebnis bei längeren Entfernungen zuverlässiger.
  • Unterschiede sind bereits aus dem Schema ersichtlich:
    Projektparameter:
  • NodeMCU in einer Access Point (AP) -Task oder als Client in Ihrem LAN
  • Benutzerdefinierte SSID- und WPA2-PSK-Verschlüsselung oder ohne Verschlüsselung
  • Benutzerdefinierte IP (statisch), erweitern Sie das DNS-Flag
  • Ein sicheres Web, das über das ESP-Netzwerk und seine Reichweite mit einem responsiven Design zugänglich ist
  • Wenn die Seite die aktuellen Informationen lädt
  • Andere mögliche Variationen:

    ESP8266 + DS18B20 WiFi teplomer - WPA/WPA2 PSK Client - Webserver:

    /*|---------------------------------|*/
    /*|Projekt: WiFi teplomer - ESP8266 |*/
    /*|Autor: Martin Chlebovec          |*/
    /*|E-mail: martinius96@gmail.com    |*/
    /*|Web: https://arduino.php5.sk     |*/
    /*|Licencia pouzitia: MIT           |*/
    /*|---------------------------------|*/
    
    #include <ESP8266WiFi.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    const char* ssid  = "MenoWifi";
    const char* password = "Heslo";
    WiFiServer server(80);
    String header;
    
    void setup() {
      Serial.begin(115200);
      Serial.println(ip);
      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.");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      server.begin();
    }
    
    void loop(){
      WiFiClient client = server.available();
      if (client) {
        sensors.begin(); 
        sensors.requestTemperatures();  
        String currentLine = "";
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();           
            header += c;
            if (c == '\n') { 
              if (currentLine.length() == 0) {
                client.println("HTTP/1.1 200 OK");
                client.println("Content-type:text/html");
                client.println("Connection: close");
                client.println();
                client.println("<head><meta charset='UTF-8'><meta name='author' content='Martin Chlebovec'><meta name='viewport' content='width=device-width, initial-scale=1.0'></head><style>body{  display: table;width: 100%;background: #dedede;text-align: center;}*{ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */-moz-box-sizing: border-box;    /* Firefox, other Gecko */box-sizing: border-box;         /* Opera/IE 8+ */}.aa_h2{  font:100 5rem/1 Roboto;  text-transform: uppercase;}table{   background: #fff;}table,thead,tbody,tfoot,tr, td,th{  text-align: center;  margin: auto;  border:1px solid #dedede;  padding: 1rem;  width: 50%;}.table    { display: table; width: 50%; }.tr       { display: table-row;  }.thead    { display: table-header-group }.tbody    { display: table-row-group }.tfoot    { display: table-footer-group }.col      { display: table-column }.colgroup { display: table-column-group }.td, .th   { display: table-cell; width: 50%; }.caption  { display: table-caption }.table,.thead,.tbody,.tfoot,.tr,.td,.th{ text-align: center; margin: auto; padding: 1rem;}.table{  background: #fff;  margin: auto;  border:none;  padding: 0; margin-bottom: 5rem;}.th{font-weight: 700;border:1px solid #dedede;&:nth-child(odd){border-right:none;}}.td{font-weight: 300;border:1px solid #dedede;border-top:none;&:nth-child(odd){border-right:none;}}.aa_htmlTable{background: tomato;padding: 5rem;display: table;width: 100%;height: 100vh;vertical-align: middle;}.aa_css{background: skyblue;padding: 5rem;display: table;width: 100%;height: 100vh;vertical-align: middle;}.aa_ahmadawais{display: table;width: 100%;font: 100 1.2rem/2 Roboto;margin: 5rem auto;}</style><div class='aa_htmlTable'><table width=100%><thead><tr><th>Teplota</th><th>Hodnota</th></tr></thead><tbody><tr><td>Dnu</td><td>"+(String)sensors.getTempCByIndex(0)+" °C</td></tr><tr><td>Von</td><td>"+(String)sensors.getTempCByIndex(1)+" °C</td></tr></tbody></table></div>");
                client.println();
                break;
              }else { // if you got a newline, then clear currentLine
                currentLine = "";
              }
              }else if (c != '\r') {  // if you got anything else but a carriage return character,
                currentLine += c;      // add it to the end of the currentLine
              }
            }
          }
      header = "";
      client.stop();
      Serial.println("");
      }
    }
    

    Schéma

    Schéma - WiFi teplomer - ESP8266

    Termostat - Tester - Offline

    //Projekt: Minimálna implementácia - termostat
    //Autor: Martin Chlebovec
    //Hardver: Arduino Uno + DS18B20 (1x OneWire bus)
    //Revizia: 23. Mar. 2020
    
    #include <OneWire.h>
    #include <DallasTemperature.h>
    
    #define ONE_WIRE_BUS 5 //datovy vovod OneWire zbernica na pin D5
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensorsA(&oneWire);
    float nastavena_teplota = 24.50;
    float hystereza = 0.50;
    //float hystereza2 = 0.50;
    const int rele = 6;
    //const int rele2 = 7;
    unsigned long timer = 0;
    unsigned long interval = 15000; //ako casto chceme logiku spustit --> v ms (milisekundy)
    void setup() {
      sensorsA.begin();
      Serial.begin(115200);
      Serial.println("UART ready");
      pinMode(rele, OUTPUT);
      // pinMode(rele2, OUTPUT);
    }
    
    void loop() {
      if ((millis() - timer) >= interval || timer == 0) {
        timer = millis();
        sensorsA.requestTemperatures();
        delay(2000); //cakame na teploty
        float  teplota1 = sensorsA.getTempCByIndex(0);
        //float  teplota2 = sensorsA.getTempCByIndex(1);
        float rozdiel = nastavena_teplota - teplota1;
        if (rozdiel > hystereza) {
          digitalWrite(rele, HIGH); //zopnutie rele
          Serial.println("Rele bolo zopnute - Vystup aktivny");
        } else if (rozdiel < (-1 * hystereza)) {
          digitalWrite(rele, LOW); //rozopnutie rele
          Serial.println("Rele bolo rozopnute - Vystup neaktivny");
        }
    
        /*
          float rozdiel2 = nastavena_teplota2 - teplota2;
          if (rozdiel2 > hystereza2) {
          digitalWrite(rele2, HIGH); //zopnutie rele
          } else if (rozdiel2 < (-1 * hystereza2)) {
          digitalWrite(rele2, LOW); //rozopnutie rele
          }
        */
      }
    }