Projekt-Repository für Ethernet-Thermostate - Maschinencodes: Github
Version 1.0.4 des Ethernet-Thermostat-Projekts ist das neueste kostenlose Versions-Update. Andere Fehler, Fehler und Sicherheitsfehler werden nicht behoben!
Die Firmware für den Ethernet-Thermostat ist vollständig in der deutschen Sprachversion verfügbar.
Arduino Ethernet Wiznet W5100 / W5500 DS18B20 OneWire Dallas HTML Webserver WebSocket

Kompatible Steuerungshardware für Ethernet-Thermostat:



Kompatible Ethernet-Module und -Abschirmungen für Ethernet-Thermostat:


Ethernet shield Wiznet W5100
Ethernet Wiznet W5100
Ethernet modul Wiznet W5200
Ethernet Wiznet W5200
Ethernet modul Wiznet W5200
Ethernet Wiznet W5300
Ethernet modul Wiznet W5500
Ethernet Wiznet W5500

Izbový termostat - Arduino + Ethernet


Arduino ist eine praktische eingebettete Plattform, mit der beispielsweise ein Raumthermostat mit Ethernet-Konnektivität und einem auf Arduino implementierten Webserver erstellt werden kann. Die Implementierung verwendet Arduino Uno / Nano mit AVR ATmega328P-Chip in Kombination mit dem Ethernet-Shield Wiznet W5100 / W5500, mit dem es über SPI-Bus kommuniziert, resp. ICSP-Header. Der Thermostat arbeitet programmgesteuert im Webserver-Modus, wo er über das HTTP-Protokoll Anfragen von Clients im Netzwerk empfangen und ihnen eine Antwort senden kann - HTML / JSON-Code und die Backend-Funktion (Funktionalität) ausführen, wenn sie gestartet werden. Der Thermostat ist über das LAN-Netzwerk, in dem er sich befindet, zugänglich, während er mit einer Webschnittstelle ausgestattet ist, mit der alle Elemente des Thermostats konfiguriert werden können, d. Soll-(Referenz-)Temperatur und Hysterese. Der Webserver ermöglicht den Betrieb mehrerer unabhängiger HTML-Seiten, die informativ oder sogar funktional sein können (implementiertes Backend). Der Webserver läuft auf einem Standard-HTTP-Port - 80. Der Thermostat kann über den GPIO-Ausgang automatisch das Melderelais zum Ein-/Ausschalten des Kessels ansteuern. Es kann somit ein vorhandenes Raumthermostat ersetzen und den Clients im Netzwerk zur Verfügung stellen. Der Thermostat kann jedes Gerät mit einem Browser bedienen - Computer / Smartphone / Tablet / Smart TV und dergleichen. Der Entscheidungsalgorithmus verwendet eine Solltemperatur mit Hysterese, die mit der von einem digitalen Temperatursensor Dallas DS18B20 gemessenen Temperatur verglichen wird. Solltemperatur und Hysterese werden aus dem EEPROM-Speicher gelesen, wo sie auch bei Stromausfall dauerhaft gespeichert und beim Schreiben neuer Daten überschrieben werden. Die Auflösung des DS18B20-Sensors bei der Messung beträgt 12 Bit, was durch die Auflösung bis zu Temperaturen von 0,0625 ° C angegeben wird, was der minimale Auflösungsschritt zwischen verschiedenen Messungen ist. Daten über den OneWire-Bus können bei Bedarf in 500 bis 1000 ms zum Mikrocontroller kommen, abhängig von der Anzahl der Sensoren am OneWire-Bus, der Länge des Busses usw. ... Die Entscheidungslogik des Thermostats wird alle 10 Sekunden unabhängig von der Webanwendung ausgeführt, es ist keine Keep-Alive-Verbindung erforderlich, um die Logik auszuführen, so dass das System autonom arbeitet und keine Aufmerksamkeit des Benutzers erfordert.

In Bezug auf die Hardware verwendet das Projekt:
  • Arduino Uno
  • Ethernet-Abschirmung Wiznet W5100 / Ethernet-Modul Wiznet W5200-W5500
  • Temperatursensor DS18B20 am OneWire-Bus im TO-92-Gehäuse oder in wasserdichter Ausführung im Aluminiumrohr
  • Elektromagnetisches Relais SRD-5VDC-SL-C / SSR-Relais OMRON G3MB-202P zur Kesselschaltung (Active-LOW-Signal)
  • HTML-Seiten, die auf Arduino ausgeführt werden:

  • / - Grundseite mit Formular, aktueller Logikausgang für Relais, Temperatur
  • /action.html - verarbeitet Werte aus dem Formular, schreibt sie in den EEPROM-Speicher, leitet den Benutzer zurück zur Stammseite
  • /get_data.json - verteilt aktuelle Temperatur-, Referenztemperatur- und Hysteresedaten an Dritte (Computer, Mikrocontroller, anderer Client ...) im JSON-Format

  • Das im Projekt verwendete elektromagnetische Relais SRD-5VDC-SL-C ermöglicht das Schalten von bis zu 10A bei 230V - maximale Leistung 2300W. Beim Schalten eines Gleichstromkreises (Last) können 300W (10A bei 30V DC max.) geschaltet werden. Das OMRON G3MB-202P SSR-Relais ist auch voll kompatibel zum Schaltplan, der nur für nicht induktive Lasten und ausschließlich für AC-Lasten geeignet ist (DC-Kreis kann nach dem Einschalten nicht öffnen). Maximale Schaltleistung 460W (230V, 2A). Der Thermostat kann das ganze Jahr über verwendet werden. Im Falle einer unnötigen Steuerung kann der Ausgang physisch getrennt werden und der Thermostat kann als Ethernet-Thermometer verwendet werden, um Daten aus dem Raum zu erhalten, in dem er sich befindet.

    Die Webschnittstelle für den Ethernet-Thermostat ermöglicht Ihnen:
  • Sehen Sie in Echtzeit die Temperatur des DS18B20-Sensors, die Betriebszeit des Geräts, den Ausgabewert mit dynamischer Änderung, die aktuell eingestellten Konfigurationsdaten für den Thermostat, d. Solltemperatur und Hysterese
  • Ändern Sie die Zieltemperatur (Referenztemperatur) von 5 bis 50 °C in Schritten von 0,25 °C
  • Ändern Sie die Hysterese von 0 bis 10 °C in Schritten von 0,25 °C
  • Kessel EIN / AUS-Steuerung:
  • Beispiel für EIN / AUS der Heizungssteuerung - VISUALISIERUNG IST NICHT TEIL DES PROJEKTS
  • Der Kessel ist aktiv, solange die Solltemperatur + Hysterese erreicht ist
  • Die Visualisierung von Wassertemperaturen zeigt die sogenannte Heizlauf und anschließendes Abkühlen des Wassers bis die Heizung wieder aktiviert wird, wenn die gemessene Temperatur unter der eingestellten Solltemperatur liegt - Hysterese
  • ZAP/VYP regulácia kotla s hysterézou

    Die Weboberfläche ist für größere und kleinere Bildschirme ausgelegt. Es ist reaktionsschnell, unterstützt Breitbild-High-Definition-Bildschirme, aber auch mobile Geräte. Die Schnittstelle verwendet importierte CSS-Stile des Bootstrap-Frameworks von einem externen CDN-Server, der das clientseitige Gerät lädt, wenn eine Seite geöffnet wird, die auf Arduino ausgeführt wird. Da der Arduino Uno speicherbegrenzt ist, kann er nur Seiten mit einer Größe von wenigen KB ausführen. Durch den Import von CSS-Stilen von einem externen Server können Sie die Leistung und Speicherbelastung von Arduino reduzieren. Die Software-Implementierung (für Arduine Uno) verwendet ca. 70% des Flash-Speichers (32kB - 4kB Bootloader) und 44% des RAM-Speichers (2kB). Statische Teile einer Webseite (HTML-Dokument-Header und -Fußzeile, Bootstrap-CSS-Verknüpfung, Meta-Tags, HTTP-Response-Header, Inhaltstyp, Formular und mehr) werden direkt im Flash-Speicher von Arduino gespeichert, was den für den Benutzer verwendeten RAM erheblich reduzieren kann -generierte Inhalte. Der Webserver ist dadurch stabiler und kann die Mehrfachverbindung mehrerer Geräte im Netzwerk gleichzeitig verarbeiten. Der Verbrauch des gesamten Thermostats beträgt bis zu 200 mA bei 5V Versorgung - unter 1W.


    Um die eingestellten Werte auch nach einem Stromausfall beizubehalten, werden diese im EEPROM-Speicher des Arduino (insgesamt 512 B) abgelegt. Die Referenztemperatur wird auf Offset 10 geschrieben, Hysterese auf Offset 100. Jeder der Werte belegt maximal 5B im EEPROM-Speicher + Terminator. Die EEPROM-Transkriptionsgrenze liegt bei 100.000 Transkripten. Daten werden nur überschrieben, wenn das HTML-Formular gesendet wird. Der Betrieb des Thermostaten schont somit den EEPROM-Speicher, um dessen Lebensdauer zu maximieren. Wenn das Gerät beim ersten Start nichts auf den genannten EEPROM-Offsets gespeichert hat, wird automatisch mit Standardwerten geschrieben - Referenz: 20,25 ° C, Hysterese 0,25 ° C, sog. ausfallsichere Lösung, damit der Thermostat sofort funktions- und betriebsbereit ist.

    Mit dem Refresh-Meta-Tag aktualisiert der Webserver alle 30 Sekunden die gesamte Seite und die ungefähre Aktualisierungszeit wird ebenfalls per Javascript in die HTML-Seite geschrieben. Zu diesem Zeitpunkt ist es notwendig, die Änderung für den Thermostaten zu schreiben, da sonst die Eingabefenster für numerische Eingaben in das Formular beim Aktualisieren der Seite zurückgesetzt werden. Basierend auf dem Feedback von Nutzern von Android-Geräten wurde die Aktualisierungszeit von 10 auf 30 Sekunden verlängert. Da die eingebaute Ethernet-Bibliothek die Verwendung eines asynchronen Webservers (der beispielsweise mit den Espressif ESP8266 / ESP32 Mikrocontrollern verwendet werden kann) nicht beinhaltet, ist es notwendig die gesamte Seite neu zu schreiben. Die sich hauptsächlich ändernden dynamischen Daten sind der aktuelle Wert der Ausgabe - EIN / AUS , die den Bediener über den aktuellen Zustand der Ausgabe zusammen mit der Farbcodierung informiert. Da die Logik des Systems unabhängig vom Webserver ausgeführt wird, kann sich die Ausgabe bereits in einem anderen Zustand befinden als aktuell in der Webanwendung aufgelistet. Die Ausgabeänderung wird z. B. sofort auf den UART-Monitor (115200 baud/s) geschrieben. Auf der Website des Thermostats findet der Benutzer auch Informationen zur Betriebszeit des Geräts (wie lange es in Betrieb war), d. Zeit in Tagen, Stunden, Minuten und Sekunden.

    Der Autor des Ethernet-Thermostats ist nicht verantwortlich für die Funktionalität des Thermostats, Kesselausfall, Stromschlag aufgrund einer unsachgemäßen Installation des Thermostats im Netzwerk. Der Thermostat wird unter der MIT-Lizenz vertrieben.
    Hauptseite zur Änderung der Solltemperatur und der Hysterese - Ausgabe am Beispiel:
    Beispieldaten
  • Zieltemperatur: 22.75 °C
  • Hysterese: 0.25 ° C
  • Messdaten: 22.49 ° C
  • Ausgang: EIN

  • Der Thermostat heizt ab einer gemessenen Temperatur von 22.49 °C und darunter. Wenn die Temperatur 23.01 °C erreicht, wird der Ausgang ausgeschaltet, das Melderelais öffnet und der Gaskessel hört auf zu heizen. Das Aufheizen und Abkühlen des Raumes, in dem die Messungen durchgeführt werden, erfolgt. Der Thermostat wird erst wieder aktiviert, wenn die Temperatur 22.49 °C oder niedriger erreicht.

    Ethernet thermostat - Main dashboard - Arduino Verarbeitung gültiger und ungültiger Daten aus HTML-Formular: Ethernet thermostat - processing HTML form with valid datas Ethernet thermostat - processing HTML form without valid datas JSON-Ausgabe von Ziel, gemessener Temperatur und Hysterese:
    Ethernet thermostat - JSON output
    Ausgabe an UART-Monitor - Zustände der Ausgänge, Einstellung des Ethernet-Adapters:
    Ethernet thermostat - UART

    Quellcode-Schnipsel (ohne Backend)


  • QUELLCODES SIND NUR FRAGMENTE UND KÖNNEN NICHT OHNE ANDERE (NICHT VERFÜGBAR) TEILE DAVON VERWENDET WERDEN. ENTHALTEN VARIABLEN, FUNKTIONEN, DIE DEFINITIONEN, BZW. ERKLÄRUNGEN SIND NICHT VERFÜGBAR.
  • Quellcodefragment für Thermostatlogik - Entscheidungsschwelle

  • Es wird alle 10 Sekunden durchgeführt, unabhängig von der Webserver- oder Clientverbindung
  •     teplota = sensorsA.getTempCByIndex(0);
        String referencia = read_String(10);
        String hystereza = read_String(100);
        float referencia_teplota = referencia.toFloat();
        float hystereza_teplota = hystereza.toFloat();
        float minus_hystereza_teplota = (-1 * hystereza_teplota);
        float rozdiel = referencia_teplota - teplota;
        if (rozdiel > hystereza_teplota) {
          Serial.println("RELE ZAP");
          stav = "ZAP";
          digitalWrite(rele, LOW);
        } else if (rozdiel < minus_hystereza_teplota) {
          Serial.println("RELE VYP");
          stav = "VYP";
          digitalWrite(rele, HIGH);
        }
        sensorsA.requestTemperatures();
    

    Quellcode-Snippet für die Seite „Allgemeiner Bericht“ – ohne die Daten aus dem HTML-Formular zu verarbeiten

              HTTP header
    	  DOCTYPE
    	  HTML
    	  HEAD
              client.println(F("<meta charset='utf-8'>"));
              client.println(F("<meta name='author' content='Martin Chlebovec'>"));
              client.println(F("<meta http-equiv='Refresh' content='30'; />"));
              client.println(F("<meta name='viewport' content='width=device-width, initial-scale=1'>"));
              client.println(F("<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css'>"));
              client.println(F("<script type='text/javascript'>"));
              client.println(F("var timeleft = 30;"));
              client.println(F("var downloadTimer = setInterval(function(){"));
              client.println(F("if(timeleft <= 0){"));
              client.println(F("clearInterval(downloadTimer);"));
              client.println(F("document.getElementById(\"countdown\").innerHTML = \"Aktualisierung...\";"));
              client.println(F("} else {"));
              client.println(F("document.getElementById(\"countdown\").innerHTML = timeleft + \" Sekunden zum Aktualisieren\";"));
              client.println(F("}"));
              client.println(F("timeleft -= 1;"));
              client.println(F("}, 1000);"));
              client.println(F("</script>"));
              client.println(F("<title>HTTP webserver - Arduino + Ethernet</title>"));
              client.println(F("</head>"));
              client.println(F("<body>"));
              client.println(F("<center><h3>Daten für Webserver eingeben (wird im EEPROM gespeichert):</h3>"));
              client.println(F("<form action='/action.html' method='get'>"));
              client.println("<b>Zieltemperatur:</b><br><input type='text' id='fname' name='fname' value=" + read_String(10) + "><br>");
              client.println("<b>Hysterese:</b><br><input type='text' id='fname2' name='fname2' value=" + read_String(100) + "><br>");
              client.println(F("<input type='submit' class='btn btn-success' value='Schreiben'>"));
              client.println(F("</form><hr>"));
              if (stav == "EIN") {
                client.println(F("<b><font color='green'>Ausgang: Ein</font></b>"));
              }
              if (stav == "AUS") {
                client.println(F("<b><font color='red'>Ausgang: Aus</font></b>"));
              }
              client.println(F("<div id=\"countdown\"></div>"));
              client.print(F("<b>Aktuelle Temperatur des DS18B20-Sensors:</b> "));
              client.print(teplota);
              client.println(F(" °C"));
              client.print(F("<hr>"));
              client.print(F("<b>Uptime: </b>"));
              client.print(days);
              client.print(F("d"));
              client.print(F(" "));
              client.print(hours);
              client.print(F("h"));
              client.print(F(" "));
              client.print(minutes);
              client.print(F("m"));
              client.print(F(" "));
              client.print(seconds);
              client.print(F("s"));
              client.println(F("<h3>Autor: Martin Chlebovec - martinius96@gmail.com - https://martinius96.github.io/termostat-ethernet/de/</h3>"));
              client.println(F("<h4>Freie Version - 1.0.4 build: 18. Sep. 2021</h4>"));
              client.println(F("</center>"));
              client.println(F("</body>"));
              client.println(F("</html>"));
    	  FLUSH CLIENT
    	  STOP CLIENT
    

    Fragment des Quellcodes mit einer Liste der eingestellten Kontrolldaten nach dem Absenden des HTML-Formulars

  • Mit der anschließenden Weiterleitung des Nutzers zurück auf die Hauptseite nach 5 Sekunden ab Verarbeitung - dem sogenannten Lazy Loading ... (Datenverarbeitung ist nicht im Fragment enthalten)
  • 	    Backend_Verarbeitung von Daten aus HTML-Formular
    	    .
    	    .
    	    .
                HTTP header
    	    DOCTYPE
    	    HTML
    	    HEAD
                client.println(F("<meta charset='utf-8'>"));
                client.println(F("<meta http-equiv='Refresh' content='5; url=/' />"));
                client.println(F("<title>HTTP webserver - Arduino + Ethernet</title>"));
                client.println(F("</head>"));
                client.println(F("<body>"));
                client.println(F("<center><h3>Der Server hat Daten vom Formular erhalten:</h3>"));
                if (!isFloat(second_param) || !isFloat(second_param)) {
                  client.println(F("<h3><font color='red'>Eingegebene Daten sind keine Zahlen !!! Bitte versuchen Sie es nach der Umleitung erneut.</font></h3>"));
                } else {
                  client.println("<li><b>Referenčná teplota: </b>" + String(H_1) + "</li>");
                  client.println("<li><b>Hysteréza: </b>" + String(H_2) + "</li>");
                }
                client.println(F("<b>Umleitung ... Bitte warten</b></center>"));
                client.println(F("</body>"));
                client.println(F("</html>"));
    	    FLUSH CLIENT
    	    STOP CLIENT
    

    Beispiel-Anweisung - JSON-Ausgabe für andere Clients, Verarbeitung

    {
    "Hysteresis":0.25,
    "Target_Temperature":21.75,
    "Actual_Temperature":21.43
    }

    Die Softwareimplementierung in Maschinencodes für den Raumthermostat (Ethernet) finden Sie unter: https://github.com/martinius96/termostat -ethernet / . Die Implementierung enthält Programme für die dem Ethernet-Shield zugewiesene statische / dynamische IPv4-Adresse. Der Thermostat ist nur für Innentemperaturen gedacht! (über 0°C), an die die Systemlogik angepasst ist! Der Thermostat kann verwendet werden, um einen vorhandenen Raumthermostat zu ersetzen, die Heizung im Aquarium / Terrarium kann vorübergehend ersetzt werden, um eine konstante Temperatur zu halten.

    Änderungsprotokoll Ethernet-Thermostat Version 1.0.4:
  • Optimierung der Webanwendung, erhöhte Reaktionsgeschwindigkeit für eine Reaktion mit geringer Latenz
  • Für HTML-Formulare mussten eingegebene Zahlen aufgrund von Inkompatibilität mit Google Chrome für Android entfernt werden.
  • Modifiziertes Backend, um den Eingabedatentyp mit der (Nicht-) Akzeptanz der Eingabe zu vergleichen.
  • JSON-Ausgabe (umgekehrte Kontrolltemperaturen) an gegenüberliegende Entitäten korrigiert
  • Inhaltstyp für die JSON-Ausgabe von Text / HTML an Anwendung / Json korrigiert
  • Alle statischen Teile von HTML-Seiten wurden über das F()-Makro ins ROM verschoben
  • Maximaler leichter RAM für den problemlosen Betrieb eines Webservers mit geringer Latenz.
  • Für das DHCP-Beispiel wird die Funktion Ethernet.maintain() verwendet, um die DHCP-Poolzeit zu erneuern.
  • (die gleiche IP-Adresse erneuern / eine neue anfordern - abhängig von Ihrer DHCP-Dienstkonfiguration)
  • Benennen Sie eine JSON-Datei von get_data in get_data.json um
  • Anzeige der Gerätebetriebszeit - Tage, Stunden, Minuten, Sekunden
  • HTTP 404 - Nicht gefunden, wenn ein Standort angezeigt wird, zu dem der Webserver keinen Rückruf hat