Arduino Webserver mit ESP8266 ich brauche eure hilfe

Hallo,
mein Name ist Michael und ich brauche mal eure Hilfe :slight_smile:
Ich baue gerade ein Gewächshaus mit Webserver unterstüzung.
Bisher funktioniert alles schon mal ganz gut, ich würde meinen Code gerne erweitern und verstehen.

Ich möchte eine Textausgabe haben wenn zb. der Schwimmerschalter auslöst

das dann die Meldung auf der Seite kommt Wassertank leer / Wassertank voll

 val = digitalRead(Schwimmerschalter);  // read input value
  if (val == HIGH) {         // check if the input is HIGH (button released)
    digitalWrite(statusLED, LOW);  // statusLED OFF
  } else {
    digitalWrite(statusLED, HIGH);  // statusLED ON
    // hier dann printeln Tank voll

es wäre schön wenn sich jemand die Mühe macht und sich damit beschäftigt :)

Arduino_Gew_chshaussteuerung_2.ino (16.9 KB)

es wäre schön wenn sich jemand die Mühe macht und sich damit beschäftigt :slight_smile:

Es wäre schön, wenn du das wärst.

Bisher funktioniert alles schon mal ganz gut, ich würde meinen Code gerne erweitern und verstehen.

Was verstehst du denn nicht, an deinem Code?

Ansonsten: willkommen im Forum, Michael

HI
danke für die erste schnelle Antwort :slight_smile:
Eins vorweg der Webserver stammt nicht von mir ich baue nur auf dem Code auf.

Mein Problem ist die Ausgabe für den Text zu realisieren, nach aktion eines Pins

zb. Pin 7 high ----> Text erscheint Tonne voll

der ganze Aufbau mir dem ESP8266 sieht ganz anders aus als bei der Ethernet.h

Hi SPS,
ich hatte auch schon einmal vor mit dem Arduino nen Webserver zu basteln. Funzte auch halbwegs, aber die Performance ließ doch extrem stark zu wünschen übrig. Hatte hier mal irgendwo im Forum meinen damaligen Code hinterlegt.

Habe das Projekt mit dem Ardu allerdings dann auf Eis gelegt, weil ich auf den Raspi gestoßen bin.
Kostet nur 35 Euro und is n kompletter PC mit allem was dazu gehört. Zusammen mit der open source Software openHab haste ne super Benutzeroberfläche und der Raspi kann mit dem Ardu kommunizieren und Daten/Befehle austauschen.

So baue ich jetzt auch richtig große Projekte mit dem Ding.

Kann dir die Kombination Raspi/Arduino nur wärmstens ans Herz legen.
Nur mit Ardu wirste definitiv nich glücklich werden. Is reine Zeitverschwendung.
Es wird zwar irgendwie mit Ach und Krach funktionieren, aber niemals befriedigend.

Helfe dir gerne auf die Sprünge beim Einstieg in die Raspi-Welt. Is nicht so schwer wie es Anfangs ausschaut. Man muss einfach mal damit anfangen, dann flutschtet och.

Hi panpira,
danke für den gedanken Anstoß.
Ich habe bereits 2 PI´s den 2 & 3 es macht auch spaß damit zu basteln, habe einen mit Kodi drauf zum TV´n über Dreambox und den PI 3 mit Recalbox für retro Games.
Es ist mir bisher einfacher gefallen mit dem Arduino Steuerungen zu realisieren als mit mit dem Raspi ich bin son Consolen Feind :smiley:
Aber mir ist schon klar das der Arduino nicht der ideale Partner ist für ein fetten Webserver aber das habe ich ja auch nicht vor :slight_smile:

Danke für dein hilfe Angebot :slight_smile:

Wie wäre es mit einer (ziemlich offensichtlichen) Lösung?

  if (digitalRead(statusLED)) {
    Content += "<hr> <p> Tank leer</p>";
  }

Der Code ist so String-lastig, dass du damit auf Dauer keine Freude haben wirst.

Und das liegt nicht am Arduino oder am ESP.

Wirf mal n Blick auf "openHab". Wird dir gefallen. Nix mit Konsole. Schicke Webseitenbedieneroberfläche.
Da haste alles was du brauchst. Buttons, Anzeigen, Graphen, Schieberegler, Farbauswahl, Datenbanken, Zeitschalter, Datum und Uhrzeit, Kalender mit Aufgabenterminierung, unterstützung unzähliger Bussysteme etc.
Trotzdem sehr übersichtlich und bedienerfreundlich.

Den Raspi nehm ich für die Bedienung und den Ardu für die Befehlsausführung, Sensorendatensammelung usw.
Beide zusammen sind n echt starkes Team.

Ardu als Webserver nervt schlichtweg endlos.

Hallo Whandall,
du bist der beste es funktioniert danke :))
Ich habe es eben hoch geladen und paar dinge hin und her ausprobiert und es funzt.

interessant wäre noch wie ich eine HIGH oder LOW abhängigkeit rein bekomme ?
Jetzt erscheint die Meldung ja bei HIGH und bei LOW verschwindet sie.
Jetzt möchte ich das die Meldung bei LOW erscheint und bei HIGH verschwindet. :slight_smile:

if (digitalRead(Schwimmerschalter )) {
Content += "


Tank leer

";
}

Oh, das hatte ich übersehen.

  if (!digitalRead(statusLED)) {
    Content += "<hr> <p> Tank leer</p>";
  }

panpira:
Wirf mal n Blick auf "openHab". Wird dir gefallen. Nix mit Konsole. Schicke Webseitenbedieneroberfläche.
Da haste alles was du brauchst. Buttons, Anzeigen, Graphen, Schieberegler, Farbauswahl, Datenbanken, Zeitschalter, Datum und Uhrzeit, Kalender mit Aufgabenterminierung, unterstützung unzähliger Bussysteme etc.
Trotzdem sehr übersichtlich und bedienerfreundlich.

Den Raspi nehm ich für die Bedienung und den Ardu für die Befehlsausführung, Sensorendatensammelung usw.
Beide zusammen sind n echt starkes Team.

Ardu als Webserver nervt schlichtweg endlos.

Hi,
ich habe ebend mir das mal kurz angeschaut sieht schon interessant aus cool ist das dass ganze auch KNX kann da bin ich beruflich viel mit am gange.
Ich möchte damit aber überwiegend steuern regeln visualisieren und kein Smart Home basteln das mache ich dann lieber über KNX.
Ich werde die Tage mal ein paar versuche damit machen :slight_smile:

Whandall:
Oh, das hatte ich übersehen.

  if (!digitalRead(statusLED)) {

Content += "


Tank leer

";
  }

Was hast du übersehen ??
meinst du das (!) ?
Okay ich verstehe mit dem ! kann ich die Pinabfrage Nigieren.
Toll was ich innerhalb so kurzer zeit an Wissen sammeln durfte :))
danke danke

mal gucken ob ich jetzt noch ein DHT22 da rein gebastelt bekomme :slight_smile:

SPSfetishist:
mit dem ! kann ich die Pinabfrage Nigieren.

Na ja, du kannst logische Werte damit negieren. :wink:

Da der ESP8266 ein kompletter Kleinrechner ist, kann man auch einen Webserver direkt auf ihm programmieren. Der ESP hat ein vielfaches an Ram und Rechenkapazität des Arduinos. Der Esp lässt sich in die Arduino-IDE einbinden, so dass er ganz ähnlich programmierbar ist.

Mir hilft zur Einarbeitung guten Beispielcode auch mal auszudrucken um ihn besser analysieren und modifizieren zu können. Beispiele für Webserver findet man bei den Beispielcodes zum ESP in der IDE und auch im Netz.

Theseus:
Da der ESP8266 ein kompletter Kleinrechner ist, kann man auch einen Webserver direkt auf ihm programmieren. Der ESP hat ein vielfaches an Ram und Rechenkapazität des Arduinos. Der Esp lässt sich in die Arduino-IDE einbinden, so dass er ganz ähnlich programmierbar ist.

Mir hilft zur Einarbeitung guten Beispielcode auch mal auszudrucken um ihn besser analysieren und modifizieren zu können. Beispiele für Webserver findet man bei den Beispielcodes zum ESP in der IDE und auch im Netz.

Hi Theseus,
danke für den Hinweis.
Ich habe bereits 2 Webserver auf dem ESP8266 am laufen, nur der große Nachteil für mich ist das man bei größeren Projekten mehr als ein IO braucht.
Deswegen habe ich jetzt den ESP am Arduino Mega :slight_smile:

Ich habe gerade wieder ein Brett vorm Kopf..
Ich habe jetzt mein Webserver um 2 Button´s erweitert,
diese sollen:

Button Weiss ON soll --> relay1 - relay4 HIGH schalten
Button Weiss OFF soll --> relay1 - relay4 LOW schalten

jetzt habe ich das Phänom das ich mit beiden Button´s HIGH schalte und nur für paar sec. LOW schalten kann.. :smiley:

if (strncmp(pb, "GET /?LEDweisson", 14) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
homepage(ch_id);

}

if (strncmp(pb, "GET /?LEDweissoff", 14) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
homepage(ch_id);

}

//else if (strncmp(pb, "GET / ", 6) == 0) {
if (strncmp(pb, "GET / ", 6) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get Status from ch:" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
homepage(ch_id);

}

}

}
//monitor.print(buffer);
clearBuffer();

//lp++;
monitor.print( "\nLoop ");
//monitor.print(lp);

}

void homepage(int ch_id) {
String Header;

Header = "HTTP/1.1 200 OK\r\n";

Header += "Content-Type: text/html\r\n";

Header += "Connection: close\r\n";
//Header += "Refresh: 5\r\n";

String Content;

Content = "ESP8266 Webserver";
Content += "

<h1 style="color: #FF0; background: #000">Smart GrowBox

";

Content += "<a href="/?relay1on"> <button style="width:360px;height:120px"> <font size="7">Device 1 ON ";
Content += "<a href="/?relay1off"> <button style="width:360px;height:120px"> <font size="7">Device 1 OFF

";

Content += "

<h1 style="color: #2EFE2E; background: #000">LED Control

";

Content += "<a href="/?relay2off"> <button style="width:360px;height:120px"> <font size="7">Gruen ON ";
Content += "<a href="/?relay2on"> <button style="width:360px;height:120px"> <font size="7">Gruen OFF

";

Content += "<a href="/?relay3off"> <button style="width:360px;height:120px"> <font size="7">Rot ON ";
Content += "<a href="/?relay3on"> <button style="width:360px;height:120px"> <font size="7">Rot OFF

";

Content += "<a href="/?relay4off"> <button style="width:360px;height:120px"> <font size="7">Blau ON ";
Content += "<a href="/?relay4on"> <button style="width:360px;height:120px"> <font size="7">Blau OFF

";

Content += "<a href="/?LEDweisson"> <button style="width:360px;height:120px"> <font size="7">Weiss ON ";
Content += "<a href="/?LEDweissoff"> <button style="width:360px;height:120px"> <font size="7">Weiss OFF

";

Zähl mal die verglichenen Buchstaben

  if (strncmp(pb, "GET /?LEDweissoff", 14) == 0) {

sollte da nicht 17 stehen? ( die andere 14 ist auch nicht richtig, denke ich)

Was meinst du mit den verglichenen Buchstaben ?

if (strncmp(pb, "GET /led", 8) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);

delay(100);
clearSerialBuffer();

if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);

//delay(3000);
homepage(ch_id);

}

if (strncmp(pb, "GET /?relay1on", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay1, HIGH);
homepage(ch_id);
}

if (strncmp(pb, "GET /?relay1off", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay1, LOW);
homepage(ch_id);
}

if (strncmp(pb, "GET /?relay2on", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, HIGH);
homepage(ch_id);
}

if (strncmp(pb, "GET /?relay2off", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, LOW);
homepage(ch_id);
}

if (strncmp(pb, "GET /?relay3on", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay3, HIGH);
homepage(ch_id);
}

if (strncmp(pb, "GET /?relay3off", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay3, LOW);
homepage(ch_id);
}

if (strncmp(pb, "GET /?relay4on", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay4, HIGH);
homepage(ch_id);
}

if (strncmp(pb, "GET /?relay4off", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay4, LOW);
homepage(ch_id);
}

if (strncmp(pb, "GET /?LEDweisson", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
homepage(ch_id);

}

if (strncmp(pb, "GET /?LEDweissoff", 18) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get led from ch :" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
homepage(ch_id);

}

//else if (strncmp(pb, "GET / ", 6) == 0) {
if (strncmp(pb, "GET / ", 6) == 0) {
monitor.print(millis());
monitor.print(" : ");
monitor.println(buffer);
monitor.print( "get Status from ch:" );
monitor.println(ch_id);
delay(100);
clearSerialBuffer();
homepage(ch_id);

Ich verstehe nicht, was daran unverständlich ist.

strncmp(pb, "GET /?LEDweissoff", 14)

vergleiche den Text der in pb steht mit dem Vergleichstext "GET /?LEDweissoff" in einer Länge von 14 Zeichen.

"GET /?LEDweissoff" hat wieviele Buchstaben?

Whandall:
Ich verstehe nicht, was daran unverständlich ist.

strncmp(pb, "GET /?LEDweissoff", 14)

vergleiche den Text der in pb steht mit dem Vergleichstext "GET /?LEDweissoff" in einer Länge von 14 Zeichen.

"GET /?LEDweissoff" hat wieviele Buchstaben?

Aah okay ich verstehe mit 16 funktioniert es danke :))
Also muss dort immer die Anzahl der Zeichen stehen ?

Ja.

Was dachtest du wozu der Parameter gut ist?

http://www.cplusplus.com/reference/cstring/strncmp/

Der off Text ist 17 lang, der on Text 16.