NodeMCU als Taster nutzen

Guten Tag,

ich weiß, es werden mich jetzt einige Leute steinigen, aber leider finde ich nicht wirklich was für mein Vorhaben.

Ich habe den NodeMCU an einer Funkfernbedienung für Toreinfahrten angeschlossen (Taster der Fernbedienung abgelötet und 2 Kabel rangelötet) Diese Kabel habe ich nun an den Node an GND und Pin 13 angeschlossen. Nun benötige ich einen Sketch, der ein kleines einfaches Webinterface bereitstellt wo ein Knopf vorhanden ist. Dieser Knopf soll als Taster für die FB dienen welche ich nun von überall aus dem Internet anklicken kann. Taster ist daher notwendig, da er nur einen kurzen Stromimpuls schicken soll, damit das Tor aufgeht, stehen bleibt und wieder zugeht. Habt ihr da für einen blutigen Anfänger ein paar Ideen ?

Vielen Dank und sorry für die sicherlich sehr blöde Frage.

Beanos: kleines einfaches Webinterface bereitstellt wo ein Knopf vorhanden ist

HTML Formulare button

Beanos: Taster ist daher notwendig

Drucktaster

Ich hoffe das hilft dir weiter.

Gruß Fips

Sorry, ich glaube ich habe mich falsch ausgedrückt.

Der NodeMCU soll der eigentliche Taster sein. Ich möchte gerne, dass der Node die Fernbedienung steuert, wenn ich das über das Interface möchte, per Klick

eben daher brauchst du auf deinem Webserver ein Form, einen Button und dahinter eine Aktion die deinen Ausgangs-Pin für eine kurze Zeit aktiviert…

Ich habe jetzt folgendes:

WiFiServer server(80);
 
void setup() {
 pinMode(13, OUTPUT);
 
 initWiFi();
}
  
void loop() {
 WiFiClient client = server.available();
 if(!client){
   return;
 }
 
 if(WiFi.status() != WL_CONNECTED){
   initWiFi();
 }
 
 String request = client.readStringUntil('\r');
 client.flush();
 
 if(request==""){
   client.stop();
   return;
 }
 
 //GPIOS schalten
 if(request.indexOf("mode=1")>=0){
   digitalWrite(13, LOW);
   delay(1000);
   digitalWrite(13, HIGH);
   delay(1000);
 }
 
 //Ausgabe erzeugen
 String output;
 output += "http/1.x 200 OK\n";
 output += "Content-Type: text/html; charset=UTF-8\n\n";
 output += "<!DOCTYPE HTML>";
 output += "<html>";
 output += "<h1>LED schalten</h1>";
 output += "<form action=\"\" method=\"GET\">";
 output += "<button name=\"mode\" value=\"1\">Öffnen/Schließen</button>";
 output += "

";
 output += "<button name=\"mode\" value=\"0\">AUS</button>";
 output += "</form>";
 output += "</html>";
 
 client.print(output);
   
 client.stop();
}
 
void initWiFi(){
 WiFi.begin(SSID, PSK);
 
 while(WiFi.status() != WL_CONNECTED){
   delay(500);
 }
 
 server.begin();
}

Problem ist, wenn der Node neugestartet ist, blinkt die FB so lange, bis ich auf AUS geklickt habe, dann kann ich den Taster Öffnen/Schließen anklicken und er sendet ein kurzes Signal, wie gewünscht. Wo liegt der Fehler?

Auch wenn du uns deinen Aufbau, bzw. Schaltung nicht zeigst, glaube ich dass mit dem ursprünglichen Taster ein Stromkreis der FB geschlossen wurde, wenn du beide Kabel kurz miteinander verbindest sollte das Tor reagieren. Ich kenne den NodeMCU jetzt nicht, aber eventuell ist dein Vorhaben damit alleine nicht möglich. Vielleicht benötigst du ein Relais oder ein Reedrelais, den du mit dem Node aktivierst und das dir dann den Stromkreis der FB schließt. Wenn ich mich vertue, bitte korrigieren, ich lerne noch. ;)

Edit: Ich lag falsch

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

void setup() {
  digitalWrite(13, LOW);
  pinMode(13, OUTPUT);
.......

Könnte dein Problem beim Start behebe.

Gruß Fips

Hallo, benutze einen anderen Ausgang, z.B A2,

an A13 hängt doch die interne LED und beim starten blinkt die immer, damit blinkt auch Deine Fernbedienung bein starten.

sorry "Node" hatte ich nicht mehr im Blick

Heinz

am NodeMcu gibts nur diese

// GPIO00/D3 on NodeMCU is the Flash Button - use this for testing an input // GPIO16/D0 on NodeMCU is a (mostly red) LED on the NodeMCU Board - use this for testing the html switch // GPIO02/D4 on NodeMCU is the (blue) LED on the ESP-12E

Rentner: an A13 hängt doch die interne LED und beim starten blinkt die immer, damit blinkt auch Deine Fernbedienung bein starten.

Beanos: Ich habe den NodeMCU

https://github.com/esp8266/Arduino/blob/master/variants/nodemcu/pins_arduino.h

Gruß Fips

Blinkt leider immer noch nach dem rebooten.
Habe

digitalWrite(13, LOW);
pinMode(13, OUTPUT);

eingefügt und auf GPIO D2 gesteckt -.-

void setup() {
   digitalWrite(4, LOW);
  pinMode(4, OUTPUT);
  initWiFi();
}
   
void loop() {
  WiFiClient client = server.available();
  if(!client){
    return;
  }
  
  if(WiFi.status() != WL_CONNECTED){
    initWiFi();
  }
  
  String request = client.readStringUntil('\r');
  client.flush();
  
  if(request==""){
    client.stop();
    return;
  }
  
  //GPIOS schalten
  if(request.indexOf("mode=1")>=0){
    digitalWrite(4, LOW);
    delay(1000);
    digitalWrite(4, HIGH);
    delay(1000);
  }
  
  //Ausgabe erzeugen
  String output;
  output += "http/1.x 200 OK\n";
  output += "Content-Type: text/html; charset=UTF-8\n\n";
  output += "<!DOCTYPE HTML>";
  output += "<html>";
  output += "<h1>LED schalten</h1>";
  output += "<form action=\"\" method=\"GET\">";
  output += "<button name=\"mode\" value=\"1\">Öffnen/Schließen</button>";
  output += "

";
  output += "<button name=\"mode\" value=\"0\">AUS</button>";
  output += "</form>";
  output += "</html>";
  
  client.print(output);
    
  client.stop();
}
  
void initWiFi(){
  WiFi.begin(SSID, PSK);
  
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
  }
  
  server.begin();
}

Beanos: Blinkt leider immer noch nach dem rebooten. Habe

digitalWrite(13, LOW); pinMode(13, OUTPUT);

eingefügt und auf GPIO D2 gesteckt -.-

Also nochmal der Link!!!

https://github.com/esp8266/Arduino/blob/master/variants/nodemcu/pins_arduino.h

Gruß Fips

Der Fips, sorry, aber damit kann ich nichts anfangen g

Beanos: digitalWrite(13, LOW); pinMode(13, OUTPUT);

eingefügt und auf GPIO D2 gesteckt -.-

Ok. Im Sketch steht es richtig. Den konnte ich aber zum Zeitpunkt meines Beitrages noch nicht sehen.

Gruß Fips

dein Sketch kompiliert nicht, daher kann man dir schwer helfen.

#include <ESP8266WiFi.h>
  
const char* SSID = "";
const char* PSK = "";
  
WiFiServer server(80);
  
void setup() {
   digitalWrite(4, LOW);
  pinMode(4, OUTPUT);
  initWiFi();
}
   
void loop() {
  WiFiClient client = server.available();
  if(!client){
    return;
  }
  
  if(WiFi.status() != WL_CONNECTED){
    initWiFi();
  }
  
  String request = client.readStringUntil('\r');
  client.flush();
  
  if(request==""){
    client.stop();
    return;
  }
  
  //GPIOS schalten
  if(request.indexOf("mode=1")>=0){
    digitalWrite(4, LOW);
    delay(1000);
    digitalWrite(4, HIGH);
    delay(1000);
  }
  
  //Ausgabe erzeugen
  String output;
  output += "http/1.x 200 OK\n";
  output += "Content-Type: text/html; charset=UTF-8\n\n";
  output += "<!DOCTYPE HTML>";
  output += "<html>";
  output += "<h1>Gartentor</h1>";
  output += "<form action=\"\" method=\"GET\">";
  output += "<button name=\"mode\" value=\"1\">Öffnen/Schließen</button>";
  output += "

";
  output += "<button name=\"mode\" value=\"0\">AUS</button>";
  output += "</form>";
  output += "</html>";
  
  client.print(output);
    
  client.stop();
}
  
void initWiFi(){
  WiFi.begin(SSID, PSK);
  
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
  }
  
  server.begin();
}

So ist der komplette Code. Bei mir kompiliert er es.

Hi

Keine Lösung für Dich - aber definiere die Pins am Kopf des Sketch. Im Momenta hast Du zweiunddreißig Mal '4' in Deinem Sketch stehen und meinst den Pin D2. Diesen kannst Du oberhalb sogar als D2 definieren. const byte dingbumspin=D2;

Im Sketch benutzt Du überall 'dingsbumspin' - vll. einen etwas sinnvolleren Namen ;) So sind Anpassungen wesentlich einfacher und es ändert sich sogar ÜBERALL, wenn's halt geändert werden soll - und nicht nur an den Stellen, Die Du gerade gesehen hast.

... Gleiches für Alles Andere, was konstant und vom Benutzer/Programmierer einstellbar ist.

MfG

das ding kompiliert, dafür kotzen sich alle meine Browser an und ich komm nicht drauf warum.

Was mir so auffällt: du hast vor und nach dem Schalten vom Relays ein Delay. imho brauchst du beim zurückschalten keins.

So, da ich bei deinem Code aufgeben muss, stell ich dir mal meinen rein, wie ich das machen würde.

Basiert auf ESP8266Webserver | Hello Server

Warum es so aussieht wie es aussieht, kannst du hier nachlesen wenn du mal 2h Zeit hast:
http://werner.rothschopf.net/201809_arduino_esp8266_server_client_0.htm

Das angefügte ZIP ist halt ohne webclient, dafür mit zwei “pulse” buttons.

Du musst dann einen “pulse” Output Pin ändern auf deinen Output Pin.

Spoiler:

esp8266_server.zip (6.92 KB)

Danke dir für diese Dateien, habe die Server.ino angepasst, leider reagiert die Fernbedienung darauf nicht.

  {
      Serial.println(F("D312 pulse output1 for a short period"));
      digitalWrite(4, LOW);                           // if relay is low active - otherwise switch to HIGH
      delay(pulseMs);
      digitalWrite(4, HIGH);
    }