PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NodeMCU mit WebSchalter und lokalem Schalter



HPM
02.03.2021, 08:21
Hallo liebe Forum- Mitglieder,

Ich will mit einem NodeMCU eine Steuerung aufbauen, mit folgenden Funktionen:

- über Webserver Button betätigen zum Schalten eines Ausgangs
- Vorort Eingang (Taster) betätigen zum Schalten des gleichen Ausgangs
- Am Ausgang befindet sich ein Relais
- Wird Ausgang nicht händisch abgeschaltet, geht es nach Zeit x selbst aus.

Alle Handlungen lassen sich einzeln ausführen und funktionieren.

Zusammengebaut bekomme ich nur den Web-Server zum Laufen, der Taster wird nicht beachtet.

Ich vermute, dass da irgendwo noch ein Problem mit der richtigen Abfrage an der richtigen Stelle ist, ich weiß nur nicht wo.

Kann sich das Listing ggf. mal jemand ansehen und mir einen kleinen Tipp geben, wo vielleicht ein Denkfehler steckt?

Vielen Dank im Voraus.

piggituX
02.03.2021, 08:37
Hi,


nur so auf die Schnelle den Code mal gelesen, was mir auffällt du wo hast du den die Variable "Taster" definiert ?


if (Taster == HIGH) {TasterStatus ==1 ;} else if (TasterStatus ==0) ;

zB.



#define TASTER D3


int taste = digitalRead(TASTER);
if (digitalRead(TASTER)== LOW)
{
USE_SERIAL.println();
USE_SERIAL.printf("Taste gedrückt");




usw.

HPM
02.03.2021, 09:52
Hallo piggituX (https://www.roboternetz.de/community/members/47593-piggituX),

vielen Dank für die schnelle Reaktion.
... Verdammt... das ist die verkehrte Version. Die mit dem eingebundnen Taster habe ich vermutlich überschrieben!
Aber der Sinn sollte doch noch aus dem Script zu erkennen sein?



// Einstellung Arduino Software
//siehe "NodeMCU-Boardeinstellung.jpg"
//zusätzliche BoarVerwalter-URL: http://arduino.esp8266.com/stable/package_esp8266com_index.json

// Boot- Bereich - Variablen deklarieren
#include <ESP8266WiFi.h>

// Parameter Festlegungen Zgänge für Netzwerk
WiFiServer server(80); // Webserver auf Port 80
String header; // Eine Variable um den HTTP Request zu speichern

const char* ssid = "xxxxxxx"; //SSID eintragen
const char* password = "xxxxxxx"; //Passwort eintragen

String OutputState = "AUS"; // Status "EIN"/"AUS" des Relais (Anzeige für WebSite)

// IOs deklarieren
#define AusZeit 60000; // 60 s (60000ms) Zeit für Timer
long AutoAus; // Automatische AusZeit
bool Taster = 0; // Variable für (Taster)
bool Relais = 0; // Variable für (Relais)

//████████████████████████████ SETUP ████████████████████████████
void setup() {

pinMode(5, INPUT_PULLUP); // PIN5 (Taster) mit PullUp

//pinMode(LED_BUILTIN, OUTPUT); // internet Board-LED
//digitalWrite(LED_BUILTIN, LOW);
pinMode(12, OUTPUT); // PIN12 (Relais)
digitalWrite(12, LOW); // PIN12 auf AUS

// Initialisierung und Einwahl ins Netzwerk
WiFi.setAutoConnect(false);
WiFi.mode(WIFI_STA); // AP-Mode (IP:4.1) im ESP abzuschalten
Serial.begin(9600);
Serial.println("Starten");
delay(10);
IPAddress ip(xxx, xxx, xxx, xxx); // IP-Adresse eintragen
IPAddress dns(xxx, xxx, xxx, xxx); //DNS-Server eintragen
IPAddress gateway(xxx, xxx, xxx, xxx); //Gateway eintragen
IPAddress subnet(255, 255, 255, 0); //SubNetMask eintragen
WiFi.config(ip, dns, gateway, subnet);
WiFi.begin(ssid, password);

Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WLAN verbunden.");
Serial.println("IP Adresse: ");
Serial.println(WiFi.localIP());
server.begin();
}

//████████████████████████████ LOOP ████████████████████████████
void loop() {

// Webseiten-Zeugs

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)

// Hier wird die HTML Seite angezeigt:
{
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE html><html>");
// client.println("<meta http-equiv=\"refresh\" content=\"10; URL=http://xxx.xxx.xxx.xxx\">");
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 Hintergrundfarge (background-color) und Schriftgröße (font-size) anpassen
client.println("<style>html { font-family: Verdana; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button { background-color: #888899; border: 3; color: black; padding: 50px 50px;");
client.println("text-decoration: none; font-size: 35px; margin: 4px; cursor: pointer;}");
client.println(".button2 {background-color: #00FF00;}</style></head>");

// Webseiten-Überschrift
client.println("<body><u><h2>SiSi Server-Schalter</h2></u>");

// WebSite aktueller Relais Status, und AN/AUS Button
client.println("<p><h1>Momentaner Status " + OutputState + "</p></h1>"); // ◄◄◄◄
if (OutputState == "AUS") {
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>");
}
client.println("</body></html>");
client.println();
break; // und wir verlassen mit einem break die Schleife
} 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
}
}
}

// Relais ein- oder ausgeschaltet usw.
LokalTaster:
/* pinMode(1, INPUT); >> Setzt den Digital-Pin 1 als Eingang
pinMode(1, INPUT_PULLUP); >> setzt Pin1 als Eingang und aktiviert Pullup
digitalWrite(LED, HIGH; >> LED nach +UB leuchtet nicht >> LED nach GND leuchtet
digitalWrite(LED, LOW); >> LED nach +UB leuchtet >> LED nach GND leuchtet nicht */

// Variablen initialisieren/ verarbeiten
if (digitalRead(5) == LOW) { Taster == 1; } else { Taster == 0; }; //Var Taster (PIN5)
if (Relais == 1) { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); }; //Var Relais (PIN12)

//Relais automatisch abschalten, wenn Zeit "AutoAus" abgelaufen ist
if (Taster == 1 || Relais == 1)
{
OutputState = "EIN";
Serial.println("Relais EIN 133");
Relais == 1;
}

if (millis() > (AutoAus)) // Wenn AusZeit abgelaufen ist,
{
OutputState = "AUS";
Relais == 1;
}

if (Relais == 0)
{
AutoAus = millis() + AusZeit;
OutputState = "AUS";
Serial.println("Relais AUS 147");
}

if (header.indexOf("GET /5/on") >= 0)
{
Serial.println("Relais AN 152");
OutputState = "EIN";
Relais == 1;
}
else if (header.indexOf("GET /5/off") >= 0)
{
Serial.println("Relais AUS 158");
OutputState = "AUS";
Relais == 0;
}

// Debugger
/* Serial.print("millis() ");
Serial.println(millis());
Serial.print("AutoAus ");
Serial.println(AutoAus);
Serial.print("OutputState ");
Serial.println(OutputState);
Serial.print("Var.Taster ");
Serial.println(Taster);
Serial.print("Var.Relais ");
Serial.println(Relais);
*/

// Die Header-Variable für den nächsten Durchlauf löschen
header = "";

// Die Verbindung schließen
client.stop();
Serial.println("Client getrennt.");
Serial.println("");
}
}

HPM
04.03.2021, 06:51
Vielen Dank für die Unterstützung, hab ne Lösung gefunden.
Der Beitrag hat sich somit erledigt.