Moin Moin,
Kurz zu meinem Programm ich möchte per Webinterface 4 Pumpen über einen Website steuern. Wenn man auf Button EIN klickt soll dieser aber nach einer definierten Zeit wieder ausgehen.
Zu dem Problem:
Die Darstellung auf der Website funktioniert nicht. Im Serial Monitor sehe ich Client verbunden und danach wieder direkt getrennt. Liegt der Fehler vielleicht in meinen Millis Funktionen ?
wollen wir das ganze gemeinsam umbauen? Am ESP8266 gibts echt keinen Grund den ganzen HTML Header händisch hinzuschreiben. Das kann der ESP8266WebServer eigentlich selber - richtig.
Das millis() ist nur für die Steuerung da und gehört ausserhalb des HTML-Teils - der Rest an html muss da bleiben wo es ist.
Ich hät' mich gerne mal rangesetzt und das mit einem ArraySatz gebaut, aber mal arbeitest mit VariablenNamen, mal mit PinNummern und in Deinem ersten Sketchist da auch noch was kurioses: Zeile 90 / Zeile 92
ja diese Möglichkeit würde ich gerne annehmen habe mir das HalloServer Beispiel angeschaut stehe aber jetzt gerade auf dem Schlauch den Code darin rein zu bekommen
wenn dir das gezeigte Layout grundsätzlich entgegenkommt, dann lad dir bitte das Zip am Ende der Seite runter.
Imho brauchen wir nur die Konfigurations-Datei auf deine 4 Relais reduzieren und dann eben die "ausschalt timer einbauen". Aber damit hättest du eine funktionierende Weboberfläche, ein Update der "Schalter" am websever, zu 98% fertig.
Wenn du dann noch ein paar Farben änderst - das bekommst dann wieder alleine hin.
Ich such in der zwischenzeit mal einen freien NodeMCU bei mir...
// #include <credentials.h> auskommentieren
und die wifi credentials richtig eintragen
nun müsste der Upload schon klappen,
der NodeMCU soll sich mit deinem Wifi verbinden können
und mit der IP vom Seriellen Monitor solltest du den NodeMCU auch erreichen.
wenn du laufend ein "started" siehst, dann bootet er wohl dauernd.
nicht gut.
stellen wir mal die Pins richtig.
geh mal in den Tab config1.htm
du willst offenbar die pins 5, 4, 0 und 2 haben oder?
dann probier mal das, ich hab mal die PWM pins weggegeben und die LED activity auf 255 gesetzt:
#pragma once
#if USE_BOARD == 1 // this is an ID for the configuration
#define TXT_BOARDNAME "Generic ESP Webserver" // the name of the board on webgui and Serial
HardwareSerial &Terminal = Serial; // if you would need debug messages on another Serial, you could define it
// assign pins to arrays:
// Pins, which should be readed
Pin inputPin[] {
// the pin a name for the website
{0, "IO00"}, // the NodeMCU has a flash button
};
// Pins, which can be switched on or off
OutputPin outputPin[] {
// pin a name LOW active or HIGH active
// {2, "IO02", HIGH}, // on some ESP8266 there is a blue LED on the ESP
{5, "IO05", LOW},
{4, "IO04", LOW},
{0, "IO00", LOW},
{2, "IO02", LOW},
};
#define NO_PWMPIN
const byte wifiActivityPin = 255; // if you want to indicate Wifi activity - set to 255 if activity LED is not needed
ja das muss ich erst selber machen. sollte aber übersichtlich sein.
Machen wirs gleich sauber.
Erst brauchen wir mal einen variable. Ergänze die struktur für die pins
gehe in den general.h und ergänze
struct OutputPin // used for output pins (pins for digitalWrite mainly)
{
const uint8_t pin; // the GPIO
const char *label; // a speaking name for the pin
const uint8_t ON; // level for ON (for high active set to HIGH)
uint32_t previousMillis; // timemanagement.
};
im Tab server wird so ca in Zeile 400 der pin umgeschaltet.
Da kommt eine Zeile dazu:
if (digitalRead(outputPin[i].pin) != outputPin[i].ON) // toggle: if the pin was on - switch it off and vice versa
{
digitalWrite(outputPin[i].pin, outputPin[i].ON);
outputPin[i].previousMillis = millis(); // store timestamp
} else {
digitalWrite(outputPin[i].pin, !outputPin[i].ON);
}
jetzt brauchen wir noch eine function die durch die pins looped und gegebenenfalls abschaltet.
Wie waren deine Ausschaltzeiten?
im Haupttab machst dir eine Funktion oberhalb von setup
void doOutputTimer()
{
for (size_t i = 0; i < (sizeof(outputPin) / sizeof(outputPin[0])); i++)
{
if ((digitalRead(outputPin[i].pin) == outputPin[i].ON) && millis() - outputPin[i].previousMillis > 2000)
{
digitalWrite(outputPin[i].pin, !outputPin[i].ON); // switch off
}
}
}
im loop() rufst du dann nur einfach das
doOutputTimer();
auf
und dann gehst noch mal in den Tab general.h und initialisierst die neue Variable mit 0, dann ist das Warning auch weg
uint32_t previousMillis = 0; // timemanagement.
so, bei mir funktioniert das jetzt mal.
eins fällt mir noch auf:
Aktuell ist der Aktualisierungsintervall auf 5 Sekunden. Das könntest reduzieren auf 2 Sekunden, dann siehst du schneller die Updates auf der Weboberfläche.
Ist im Haupttab so ca Zeile 93:
const uint16_t ajaxIntervall = 5; // intervall for AJAX or fetch API call of website in seconds
wart noch, ich glaube das Struct im general.h soll so aussehen:
struct OutputPin // used for output pins (pins for digitalWrite mainly)
{
const uint8_t pin; // the GPIO
const char *label; // a speaking name for the pin
const uint8_t ON; // level for ON (for high active set to HIGH)
uint32_t previousMillis = 0; // timemanagement.
// wir brauchen einen Constructor wegen der abweichenden Initialisierung bei der Objektanlage:
OutputPin (uint8_t pin, const char *label, uint8_t ON) : pin(pin), label(label), ON(ON) {}
};
die restlichen Sachen schaffst selber.
Die Farben sind eh alle im CSS als CSS Variablen.
Schmökere ein wenig im Code. Imho sollen die wichtigsten Sachen darin erklärt sein.