Wemos d1 mini Dachfenstersteuerung

Hallo,

ich versuch jetzt mal mein Vorhaben zu schildern.

Ich möchte mit dem Wemos D1 mini und dem Temp-Sensor DS18B20 sowie einer doppel Relay Platine folgendes bewirken.

  1. Temperratur anzeige über Webseite. (das habe ich schon hin bekommen) mit folgendem Sketch
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>


const char* ssid = "xxxxxx";
const char* password = "xxxxxxxxxxxxx";


#define ONE_WIRE_BUS D4


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];
char temperatureFString[6];


WiFiServer server(80);


void setup() {

 Serial.begin(115200);
 delay(10);

DS18B20.begin(); 

 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");

 server.begin();
 Serial.println("Web server running. Waiting for the Wemos D1 mini IP...");
 delay(10000);

 Serial.println(WiFi.localIP());
}

void getTemperature() {
 float tempC;
 float tempF;
 do {
 DS18B20.requestTemperatures(); 
 tempC = DS18B20.getTempCByIndex(0);
 dtostrf(tempC, 2, 2, temperatureCString);
 tempF = DS18B20.getTempFByIndex(0);
 dtostrf(tempF, 3, 2, temperatureFString);
 delay(100);
 } while (tempC == 85.0 || tempC == (-127.0));
}


void loop() {

 WiFiClient client = server.available();
 
 if (client) {
 Serial.println("New client");

 boolean blank_line = true;
 while (client.connected()) {
 if (client.available()) {
 char c = client.read();
 
 if (c == '\n' && blank_line) {
 getTemperature();
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Connection: close");
 client.println();

 client.println("<!DOCTYPE HTML>");
 client.println("<html>");
 client.println("<head><meta http-equiv=refresh content=15></head><body bgcolor=33363B><center><h1><font face=Ubuntu font size=7 color=FFFFFF>Wintergarten</h1><h3>Temperatur in Celsius: ");
 client.println(temperatureCString);
 client.println("&deg;C</font></h3></center></body></html>"); 
 break;
 }
 if (c == '\n') {

 blank_line = true;
 }
 else if (c != '\r') {

 blank_line = false;
 }
 }
 } 

 delay(1);
 client.stop();
 Serial.println("Client disconnected.");
 }
}
  1. einbinden von 2 Button um das Fenster bzw. die Relais manuel zu schalten.

  2. automatisches öffnen/schließen bzw. schalten der Relais sobald eine bestimmte Temperaturen erreicht werden.
    z.b. öffnen ab 30 Grad und schließen unter 28 Grad.

Wie muss den sketch anpassen bzw erweitern um das zu realisieren?

Geht das überhaupt?

Vielen Dank

Welche Buttons sollen das sein ?
Als externer Taster oder in der Webseite ?
Und die Temperaturen kannst du mit einer if-Abfrage auswerten und entsprechend darauf reagieren.

Mein Tipp:
Sieh dir mal die Seite von fips an.
Da bekommst du sicher eine Menge Infos.

Hallo,

danke. Es sollen Buttons auf der Webseite sein.

Den Link schau ich mir mal an.

LG

Kai

Der Link ist sehr informativ, leider tue ich mich schwer daran, die Buttons laut des links in meinen Sketch ein zu binden.

Ich bin doch recht unerfahren darin, was ich jetzt wo in obigen Sketch einbauen muss um einen Button zu intergrieren.

auweia :wink:

Danke

Hallo,

unter den Beispielen zum ESP findest Du eine Hallo Server. Den kannst Du als Grundversion nehmen und anpassen. Die Website von Fips hast Du schon als Link bekommen, da findest Du bestimmt was. Hier könntet DU auch noch mal suchen.

link

Und ich hab vor einiger Zeit mal ein kleines Tutorial geschrieben link

Heinz

Geht das überhaupt?

ja das geht. Aber tu dir selber was gutes und nimm den ESP8266Webserver | HelloServer

als Ausgangsbasis.

So,

dieser Sketch:

#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>


const char* ssid = "xxxxx";
const char* password = "xxxxxxxxxxxxx";


#define ONE_WIRE_BUS D4


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];
char temperatureFString[6];


WiFiServer server(80);


void setup() {

 Serial.begin(115200);
 delay(10);

DS18B20.begin(); 

 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");

 server.begin();
 Serial.println("Web server running. Waiting for the Wemos D1 mini IP...");
 delay(10000);

 Serial.println(WiFi.localIP());
}

void getTemperature() {
 float tempC;
 float tempF;
 do {
 DS18B20.requestTemperatures(); 
 tempC = DS18B20.getTempCByIndex(0);
 dtostrf(tempC, 2, 2, temperatureCString);
 tempF = DS18B20.getTempFByIndex(0);
 dtostrf(tempF, 3, 2, temperatureFString);
 delay(100);
 } while (tempC == 85.0 || tempC == (-127.0));
}


void loop() {

 WiFiClient client = server.available();
 
 if (client) {
 Serial.println("New client");

 boolean blank_line = true;
 while (client.connected()) {
 if (client.available()) {
 char c = client.read();
 
 if (c == '\n' && blank_line) {
 getTemperature();
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Connection: close");
 client.println();

 client.println("<!DOCTYPE HTML>");
 client.println("<html>");
 client.println("<head><meta http-equiv=refresh content=15></head><body bgcolor=33363B><center><h1><font face=Ubuntu font size=7 color=FFFFFF>Wintergarten</h1><h3>Temperatur in Celsius: ");
 client.println(temperatureCString);
 client.println("&deg;C</font></h3></center></body></html>"); 
 break;
 }
 if (c == '\n') {

 blank_line = true;
 }
 else if (c != '\r') {

 blank_line = false;
 }
 }
 } 

 delay(1);
 client.stop();
 Serial.println("Client disconnected.");
 }
}

und dieser:

/*********
  Rui Santos
  Complete project details at http://randomnerdtutorials.com  
*********/

// Wir laden die uns schon bekannte WiFi Bibliothek
#include <ESP8266WiFi.h>

// Hier geben wir den WLAN Namen (SSID) und den Zugansschlüssel ein
const char* ssid     = "xxxxxx";
const char* password = "xxxxxxxxxxxx";

// Wir setzen den Webserver auf Port 80
WiFiServer server(80);

// Eine Variable um den HTTP Request zu speichern
String header;

// Hier wird der aktuelle Status des Relais festgehalten
String output5State = "off";
String output4State = "off";

// Die verwendeted GPIO Pins
// D1 = GPIO5 und D2 = GPIO4 - einfach bei Google nach "Amica Pinout" suchen  
const int output5 = 5;
const int output4 = 4;

void setup() {
  Serial.begin(115200);
  // Die definierten GPIO Pins als output definieren ...
  pinMode(output5, OUTPUT);
  pinMode(output4, OUTPUT);
  // ... und erstmal auf LOW setzen
  digitalWrite(output5, LOW);
  digitalWrite(output4, LOW);

  // Per WLAN mit dem Netzwerk verbinden
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Die IP vom Webserver auf dem seriellen Monitor ausgeben
  Serial.println("");
  Serial.println("WLAN verbunden.");
  Serial.println("IP Adresse: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop(){
  WiFiClient client = server.available();   // Hört auf Anfragen von Clients

  if (client) {                             // Falls sich ein neuer Client verbindet,
    Serial.println("Neuer Client.");          // Ausgabe auf den seriellen Monitor
    String currentLine = "";                // erstelle einen String mit den eingehenden Daten vom Client
    while (client.connected()) {            // wiederholen so lange der Client verbunden ist
      if (client.available()) {             // Fall ein Byte zum lesen da ist,
        char c = client.read();             // lese das Byte, und dann
        Serial.write(c);                    // gebe es auf dem seriellen Monitor aus
        header += c;
        if (c == '\n') {                    // wenn das Byte eine Neue-Zeile Char ist
          // wenn die aktuelle Zeile leer ist, kamen 2 in folge.
          // dies ist das Ende der HTTP-Anfrage vom Client, also senden wir eine Antwort:
          if (currentLine.length() == 0) {
            // HTTP-Header fangen immer mit einem Response-Code an (z.B. HTTP/1.1 200 OK)
            // gefolgt vom Content-Type damit der Client weiss was folgt, gefolgt von einer Leerzeile:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // Hier werden die GPIO Pins ein- oder ausgeschaltet
            if (header.indexOf("GET /5/on") >= 0) {
              Serial.println("GPIO 5 on");
              output5State = "on";
              digitalWrite(output5, HIGH);
            } else if (header.indexOf("GET /5/off") >= 0) {
              Serial.println("GPIO 5 off");
              output5State = "off";
              digitalWrite(output5, LOW);
            } else if (header.indexOf("GET /4/on") >= 0) {
              Serial.println("GPIO 4 on");
              output4State = "on";
              digitalWrite(output4, HIGH);
            } else if (header.indexOf("GET /4/off") >= 0) {
              Serial.println("GPIO 4 off");
              output4State = "off";
              digitalWrite(output4, LOW);
            }
            
            // Hier wird nun die HTML Seite angezeigt:
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // Es folgen der CSS-Code um die Ein/Aus Buttons zu gestalten
            // Hier können Sie die Hintergrundfarge (background-color) und Schriftgröße (font-size) anpassen
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #333344; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #888899;}</style></head>");
            
            // Webseiten-Überschrift
            client.println("<body><h1>Dachfenster Wintergarten</h1>");
            
            // Zeige den aktuellen Status, und AN/AUS Buttons for GPIO 5  
            client.println("<p>GPIO 5 - State " + output5State + "</p>");
            // wenn output5State = off, zeige den EIN Button       
            if (output5State=="off") {
              client.println("<p><a href=\"/5/on\"><button class=\"button\">EIN</button></a></p>");
            } else {
              client.println("<p><a href=\"/5/off\"><button class=\"button button2\">AUS</button></a></p>");
            } 
               
            // Das gleiche für GPIO 4
            client.println("<p>GPIO 4 - State " + output4State + "</p>");
            // Wenn output4State = off, zeige den EIN Button       
            if (output4State=="off") {
              client.println("<p><a href=\"/4/on\"><button class=\"button\">EIN</button></a></p>");
            } else {
              client.println("<p><a href=\"/4/off\"><button class=\"button button2\">AUS</button></a></p>");
            }
            client.println("</body></html>");
            
            // Die HTTP-Antwort wird mit einer Leerzeile beendet
            client.println();
            // und wir verlassen mit einem break die Schleife
            break;
          } else { // falls eine neue Zeile kommt, lösche die aktuelle Zeile
            currentLine = "";
          }
        } else if (c != '\r') {  // wenn etwas kommt was kein Zeilenumbruch ist,
          currentLine += c;      // füge es am Ende von currentLine an
        }
      }
    }
    // Die Header-Variable für den nächsten Durchlauf löschen
    header = "";
    // Die Verbindung schließen
    client.stop();
    Serial.println("Client getrennt.");
    Serial.println("");
  }
}

funktionieren, wenn ich sie einzeln aufspiele.
Ich müsste aber beide Inhalte in einem sketch unterbringen.
Sprich die Temperatur anzeigen und die beiden Buttons aus dem zweiten Sketch
müssten auf einer Webseite sichtbar sein.

Was meinst Du, wie sich die Lust, Dir zu helfen, weiterentwickelt, wenn Du so beharrlich die gegebenen Ratschläge ignorierst?

Gruß Tommy

Das ist ja sehr schön, wenn du dein eigenes Süppchen kochen möchtest.
Allerdings ist es nicht verständlich, dass du keine unserer Tipps annimmst.

Hallo,

ja dann must Du das auf eine Webseite schreiben, dann wird das auch zusammen angezeigt. Dann die beiden Sketche zusammenführen und einen draus machen. Das geht auch mit geschicktem copy&past.

Aber Dein Webserver ist für einen ESP nicht der optimale.

Heinz

Ok, sorry.

es ist nicht meine Absicht Eure Ratschläge zu ignorieren!

Scheinbar schnalle ich Sie nicht, sorry.

Ich will auch nicht mein eigenes Süppchen kochen!
Ich versuche aus den gefunden Schnippseln schlau zu werden und dies gelingt mir scheinbar nicht und obendrein vermittel ich noch das Gefühl ignorant zu sein.

Habe gerade erst kapiert was mit Webserver Hallo Server gemeint war.
Es ist allgemein bekannt, dass alles was von Experten oder Fortgeschrittenen geschrieben wird von einem Anfänger wie mir verstanden werden muss.

Sorry, ich dachte das Prinzip eines Forums ist es, sein Wissen mit anderen (Anfängern) verständlich zu teilen. Nur weil ich schon ein paar im Netz aufgeschnappte Sketches verwendet habe heißt es halt leider noch nicht, dass ich auch alles verstanden habe.

Also, tut mir leid wenn ich Euch mit meiner Unwissenheit verärgert habe.

Ich box mich irgend wie jetzt durch und hoffe es gelingt mir.

Danke

Kai