*NodeMCU/esp8266* Webserver zur Anzeige von Eingängen

freak1051

Ensign
Registriert
Dez. 2012
Beiträge
197
Hallo Community,

befasse mich seit Heute das erste mal mit dem NodeMCU. Ich habe ein kleines Projekt dafür in Planung:
In meinem Angelverein sind wir dran über 2 Pumpen Wasser umzuwälzen. Ist mal Wurst, wie das Mechanisch Funktioniert.
Nun sind die 2 Pumpen mit Rohren verbunden. Es ist möglich keine, eine oder beide Pumpen laufen zu lassen. Die Elektro-Hardware befindet sich auf einer Insel, sodas über Lampen oder ähnliches es nicht möglich ist zu sehen, ob nun eine oder beide pumpen laufen.

Im Schaltschrank der Anlage sind noch 2 Relais frei, mit denen ich 2 Eingänge schalten kann, und diese will ich auf einem Webserver Anzeigen lassen. Leider habe ich so gar keine Ahnung von html und noch weniger, wie mir das ding dann Digitale Inputs anzeigt.

Durch Tutorials, und studieren der Bibliotheken habe ich Folgenden Code bisher zusammengestupft(Nicht wundern. Nutze das VisualMicro AddIn für Visual Studio. und wenn ich die ESP8266WIFI bib einbinde, prügelt er mir alles rein. Muss man noch aufräumen...oder lassen :) )

C++:
/*
Name:  NodeMCU Webserver anzeige Digitalpins und DNS Server.ino
Created: 21.05.2018 19:24:35
Author: freak1051
*/
// the setup function runs once when you press reset or power the board


const char* ssid = "GEHEIMESSID";
const char* pass = "GEHEIMESPW";
const byte DNS_PORT = 53;
bool Pumpe1 = false;
bool Pumpe2 = false;
String page = "";

#include <WiFiUdp.h>
#include <WiFiServerSecure.h>
#include <WiFiServer.h>
#include <WiFiClientSecure.h>
#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>

IPAddress local_IP(192, 168, 1, 2);
IPAddress gateway(192, 168, 16, 1);
IPAddress subnet(255, 255, 255, 0);
ESP8266WebServer server(80);
DNSServer dnsServer;
void setup(void)
{
 Serial.begin(115200);
 Serial.println();
 pinMode(D1, INPUT_PULLUP);
 pinMode(D2, INPUT_PULLUP);
 //**************************************************************************************
 //*** Start AP with pre-configured ip, gw and subnet. Must be reboot, by first change
 //**************************************************************************************
 Serial.print("Setting soft-AP configuration ... ");
 Serial.println(WiFi.softAPConfig(local_IP, local_IP, subnet) ? "Ready" : "Failed!");
 Serial.print("Setting soft-AP ... ");
 Serial.println(WiFi.softAP(ssid, pass) ? "Ready" : "Failed!");
 Serial.print("Soft-AP IP address = ");
 Serial.println(WiFi.softAPIP());
 //**************************************************************************************
 //*** Start the Webserver
 //**************************************************************************************
 dnsServer.setTTL(300);
 dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure);
 dnsServer.start(DNS_PORT, "www.test.de", local_IP);

 //**************************************************************************************
 //*** Start the Webserver
 //**************************************************************************************
 server.on("/", []()
 {
  page = "<h1>ANGELVEREIN</h1><h1>MUSTERSTADT</h1><h2>Pumpenkontrolle</h2><h3>Pumpe1:</h3><h4>" + String(Pumpe1) + "</h4> <h3>Pumpe2:</h3><h4>" + String(Pumpe2) + "</h4>";
  server.send(200, "text/html", page);
 });
 server.begin();
 Serial.println("Web server started!");
}

void loop(void)
{
 Pumpe1 = !digitalRead(D1);
 Pumpe2 = !digitalRead(D2);

 delay(1000);
 dnsServer.processNextRequest();
 server.handleClient();
}

Der Code Funktioniert bisher Soweit, dass der Accsess Point startet, und ich auf die IP-Adresse zugreifen kann. Er zeit mir auch werte an.
Wenn ich auf die www.test.de zugreife funktioniert es erst mal nicht. Wenn ich allerdings den NodeMCU per mikrotaster am board Resette, findet es mir den DNS Eintrag und leitet mich auf meine kleine Seite.

Gehe ich nun aus des WLan raus, was ja eigentlich sinn ist, gehe an den Tümpel, logge mich im Wlan ein und geb die Adresse ein, leitet er mich nicht weiter...("Err_Connection_Refused")

Habe das gefühl, es liegt an diesem eintrag:

C++:
dnsServer.setTTL(300)

Habe aber damit leider keine Erfahrung. Kann mir jemand behilflich sein, bei meinem Problem?

Danke schonmal im Vorraus

grüße

Daniel
 
ich verstehe da mehrere Dinge nicht...
Warum DNS?
local ist 192.168.1.2, NM /24 aber das Gateway "außerhalb" (192.168.16...), das kann doch gar nicht gehen?!?

und ein Tipp: wenn du mit einem NodeMCU/ESP8266 einen WebServer bauen möchtest, dann baue auf dieser Version auf:
Code:
/*--------------------------------------------------
HTTP 1.1 Webserver for ESP8266
for ESP8266 adapted Arduino IDE

Stefan Thesen 04/2015

Running stable for days
(in difference to all samples I tried)

Does HTTP 1.1 with defined connection closing.
Reconnects in case of lost WiFi.
Handles empty requests in a defined manner.
Handle requests for non-exisiting pages correctly.
--------------------------------------------------*/

ich habe hier einige "Web-Server" auf verschiedenen HW Versionen laufen und die "Standard" Web-Server Demo aus dem Arduino Package läuft keinen Tag ohne sich komplett weg zu hängen!
mit der o.g. ist es zwar auch nicht 100% rock solid aber das kann dann auch an der Hardware liegen, da laufen die Platinchen hier schon mehrere Tage bis Wochen ohne Abstürze.
 
C++:
/*

const char* ssid = "GEHEIMESSID"; 
const char* pass = "GEHEIMESPW";


}

Hier Gebe ich an, wie das Wlan des NodeMCU zu heißen hat. Der Node arbeitet als AccessPoint und liefert mir demnach das Wlan mit der SSID GEHEIMESSID

C++:
/*
local_IP(192, 168, 1, 2);
IPAddress gateway(192, 168, 16, 1);
IPAddress subnet(255, 255, 255, 0);

Serial.print("Setting soft-AP configuration ... ");
Serial.println(WiFi.softAPConfig(local_IP, local_IP, subnet) ? "Ready" : "Failed!");

}

Die IP-Gateway ist noch als Variable vorhanden, wird aber wie oben zu sehen nicht genutzt. IP des AccessPoint, also des NodeMCU ist gleich das Gateway. Da der Node aber nicht ins Internet geht, benötigt ich ja eigentlich eh kein GW?!?!

C++:
/*
Serial.print("Setting soft-AP ... ");
Serial.println(WiFi.softAP(ssid, pass) ? "Ready" : "Failed!");

}

Hier Übergebe ich die Parameter SSID und PW, die ich ganz am Anfang des Codes definiert habe

Teiby schrieb:
Aus welchem WLAN gehst du da raus und in welches wieder rein?

Der Node MCU bietet mir als Accesspoint folglich ein Wlan mit der SSID "GEHEIMESSID". In dieses Wlan wähle ich mich ein. Per IP-Adresse komme ich immer sofort auf den Webserver. Allerdings kann sich nicht jeder, der des ding bedient ne IP Adresse merkeln.


Also habe ich den DNS Server installiert und wollte über eine www. Adresse auf die IP zugreifen. Dies klappt aber nur nach direktem Reset des Controllers. Wenn ich nun auf dem Webserver per www. gekommen bin, mein Wlan am Handy deaktiviere und wieder Aktiviere und in das GEHIMESSID-Wlan gehe komme ich wieder rum nicht auf den Webserver.

Teiby schrieb:
Schon mal ohne DNS probiert? Also einfach die IP vom ESP im Browser eingeben.

Das funktioniert Tadellos. Nur der DNS macht Probleme. Aber wie gesagt, nicht jeder kann/will sich eine IP-Adresse merken.



QUOTE="Mickey Mouse, post: 21334698, member: 190879"]ich verstehe da mehrere Dinge nicht...
Warum DNS? - weil sich www.pumpe.de einfacher zu merken ist als 192.168.1.1
local ist 192.168.1.2, NM /24 aber das Gateway "außerhalb" (192.168.16...), das kann doch gar nicht gehen?!? Wird im Code auch nicht verwendet. Vergessen rauszumachen

und ein Tipp: wenn du mit einem NodeMCU/ESP8266 einen WebServer bauen möchtest, dann baue auf dieser Version auf:
Code:
/*--------------------------------------------------
HTTP 1.1 Webserver for ESP8266
for ESP8266 adapted Arduino IDE

Stefan Thesen 04/2015

Running stable for days
(in difference to all samples I tried)

Does HTTP 1.1 with defined connection closing.
Reconnects in case of lost WiFi.
Handles empty requests in a defined manner.
Handle requests for non-exisiting pages correctly.
--------------------------------------------------*/

Habe mir gerade von Thesen einen Code Herunter geladen, und muss sagen, dass er nicht unbeidngt anfängerfreundlich ist :) wie gesagt, gar keine html Erfahrung :) 7 Siegel :( und mit eingabe der IP läuft der Webserver Stabil...

ich habe hier einige "Web-Server" auf verschiedenen HW Versionen laufen und die "Standard" Web-Server Demo aus dem Arduino Package läuft keinen Tag ohne sich komplett weg zu hängen!
mit der o.g. ist es zwar auch nicht 100% rock solid aber das kann dann auch an der Hardware liegen, da laufen die Platinchen hier schon mehrere Tage bis Wochen ohne Abstürze.[/QUOTE]
 
ok, ich habe mir den Code nicht weiter angesehen und nur die Variablen gesehen.
außerdem war mir nicht klar, dass der Kleine auch ein AP sein soll...
ein DNS Server muss auch konfiguriert und so wie das in deinem Fall aussieht mit einem DHCP Server (den du vermutlich komplett vergessen hast) synchronisiert werden!
 
@freak1051 ich habe den Post #1 nur zur Hälfte verstanden. Post #5 erklärt dann zwar einiges aber wenn du Leute hier schon um einen Gefallen bittest dann reduziere deinen Code doch bitte auf ein funktionsfähiges Minimum. Das hilft mir persönlich übrigens auch immer wenn es darum geht Fehler in meinen Programmen zu finden.

Bei deinem Problem mit dem DNSServer kann ich dir leider nicht weiterhelfen aber wenn es darum geht den Code aufzuräumen… brauchst du wirklich alle 14 libraries?

//----------------- off topic -----------------
Mickey Mouse schrieb:
ich habe hier einige "Web-Server" auf verschiedenen HW Versionen laufen und die "Standard" Web-Server Demo aus dem Arduino Package läuft keinen Tag ohne sich komplett weg zu hängen!

Meinst du das WiFiWebServer Example?
Code:
/*
 *  This sketch demonstrates how to set up a simple HTTP-like server.
 *  The server will set a GPIO pin depending on the request
 *    http://server_ip/gpio/0 will set the GPIO2 low,
 *    http://server_ip/gpio/1 will set the GPIO2 high
 *  server_ip is the IP address of the ESP8266 module, will be 
 *  printed to Serial when the module is connected.
 */

#include <ESP8266WiFi.h>

const char* ssid = "your-ssid";
const char* password = "your-password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}

Du musst Zeile 60 bis 62 durch folgendes ersetzten:
Code:
    int i = 0;
    while(!client.available()){
    i++;
    delay(10);
    if (i = 500) break;   //break while if there is no request
   }
 
Mickey Mouse schrieb:
ein DNS Server muss auch konfiguriert und so wie das in deinem Fall aussieht mit einem DHCP Server (den du vermutlich komplett vergessen hast) synchronisiert werden!

Richtig den habe ich bisher nicht vorgesehen. Dachte aber bisher auch nicht daran, dass ich einen brauche, da ich automatisch eine IP zugewiesen bekomme. Und der DNS soll ja nur WWW.beispel.de in 192.168.123.123 oder so umschlüsseln. Des klappt ja auch...nach Neustart. Erkläre bitte, warum ich noch einen DHCP benötige :)

SupaKevin schrieb:
@freak1051 Post #5 erklärt dann zwar einiges aber wenn du Leute hier schon um einen Gefallen bittest dann reduziere deinen Code doch bitte auf ein funktionsfähiges Minimum. Das hilft mir persönlich übrigens auch immer wenn es darum geht Fehler in meinen Programmen zu finden.

Sry wenn es jetzt etwas spöttisch klingt. Aber hängst du dich grad allen ernstes wegen der ungenutzen Gateway variablen auf? Denke wenn jemand vernünftig anschaut dürfte das auffallen. Und zudem funktioniert ja DIESE Komponente.

und zum Thema...

SupaKevin schrieb:
@freak1051
brauchst du wirklich alle 14 libraries?

Dachte es ist eigentlich offensichtlich, dass ALLE Bibliotheken automatisch von Visual Studio/ Visual Micro eingefügt werden. Dies habe ich auch so erwähnt und gesagt dass ich dies noch korrigieren muss. Da aber, wenn eine neue benötigte Bib eingefügt wird ALLE 14 zu der ESPWifi zugehörigen automatisch eingefügt werden und somit immer wieder aussortiert werden müssen. Zudem ist der Chip jetzt noch so klein dass er das zu Testzwecken nicht verkraftet :)
 
C++:
dnsServer.start(DNS_PORT, "esppumpe.de", local_IP);

@Teiby würde so quasi gehen? Andererseits...interessiert es den Node, wenn er eh NIE ins Internet kommt?

Des ding hängt ja iwann im Schaltschrank auf ner Insel an unserem Weiher, ich Steh am Ufer, Wähle mich in sein Wlan ein, und gebe die Adresse ein. Somit ist es doch prinzipiell Wurst, ob es die Adresse gibt oder nicht?
 
Dem Ding ist es egal, aber deinem Smartphone nicht. Der hat ein DNS Cache und außerdem vielleicht noch Internet über 3G oder sowas, da es merkt, dass das WLAN kein Internet hat. Und wenn dann das Smartphone zuerst das Internet fragt oder noch eine alte Information hat, läuft etwas schief.
 
Bei mir ist es am computer Browserabhängig ob es mit der DNS geht oder nicht. Wenn ich es gerade noch richtig im Kopf hab ist die adresse außerdem nicht .de sondern .local also zb: test.local

ich hab das immer ohne www eingegeben
 
Ah perfekt das ergibt sinn.

Wusste nicht dass ich nicht de nehmen muss. Werde dann wohl auf angelverein.pumpe oder so gehen dann hat der dns Cache keine Chance :)

Danke euch
 
Zurück
Oben