Fritzbox GästeWlan schalter und meine tücken -.-

Wollte mir mit einem ESP8266 NodeMCU einen Schalter fürs GästeWlan bauen. Soweit so gut schalten lässt es sich auch.... aber sobald ich einen Taster drücke läuft das ding in einer endlos schleife und wechselt zwischen an und aus.

Hier der Code:

#include <Arduino.h>
#if defined(ESP8266)
  #include <ESP8266WiFi.h>
  #include <ESP8266WiFiMulti.h>
  #include <ESP8266HTTPClient.h>
  ESP8266WiFiMulti WiFiMulti;
#elif defined(ESP32)
  #include <WiFi.h>
  #include <WiFiMulti.h>
  #include <HTTPClient.h>
  WiFiMulti WiFiMulti;
#endif

#include <tr064.h>


#define BUTTONON D0
#define BUTTONOFF D1
#define LEDRED D5
#define LEDGREEN D6
bool geschaltet = true;
bool geschaltet2 = true;
int empfindlichkeit = 500;
int empfindlichkeit2 = 500;

//-------------------------------------------------------------------------------------
// Put your router settings here
//-------------------------------------------------------------------------------------



const char* wifi_ssid = "***************"; 


const char* wifi_password = "**************";


const char* fuser = "************";
const char* fpass = "*****************";


const char* IP = "192.168.178.1";


const int PORT = 49000;
int tastean = 0;
int tasteaus = 0;

TR064 connection(PORT, IP, fuser, fpass);


void setup() {
  Serial.begin(74880);
  delay(5000);
 
  //Connect to wifi
  WiFiMulti.addAP(wifi_ssid, wifi_password);

  // Wait for the wifi to connect
  while ((WiFiMulti.run() != WL_CONNECTED)) {
    delay(100);
  }
  pinMode(BUTTONON, INPUT); 
  pinMode(BUTTONOFF, INPUT);  
  pinMode(LEDRED, OUTPUT);
  pinMode(LEDGREEN, OUTPUT);
}

void loop() {
  schaltung();
}

void schaltung() {
      if (digitalRead(BUTTONON) == LOW) 
   {
    if (geschaltet == false, geschaltet2 == true) {        
        geschaltet = true;             
        geschaltet2 = false; 
        delay (200);
    }
    else {
      digitalWrite(LEDRED, HIGH);
      digitalWrite(LEDGREEN, LOW);
      geschaltet = false;             
      gwlanonoff();
      delay (200);
    }
  }

  delay(empfindlichkeit);
  
  if (digitalRead(BUTTONOFF) == LOW) 
   {
    if (geschaltet2 == false, geschaltet == true) {        
        geschaltet2 = true;              
        geschaltet = false;
        delay (200);
    }
    else {
      digitalWrite(LEDGREEN, HIGH);
      digitalWrite(LEDRED, LOW);
      geschaltet2 = false;             
      gwlanoffon();
      delay (200);
    }
  }

    

  delay(empfindlichkeit2);  
  }
    


void gwlanonoff() {

 
  connection.init();

  String params[][2] = {{"NewEnable", "1"}};
  String req[][2] = {{}};

  connection.action("urn:dslforum-org:service:WLANConfiguration:3", "SetEnable", params, 1, req, 2);
}

void gwlanoffon() {

 
  connection.init();

  String params[][2] = {{"NewEnable", "0"}};
  String req[][2] = {{}};

  connection.action("urn:dslforum-org:service:WLANConfiguration:3", "SetEnable", params, 1, req, 2);
}

PS: Hier noch die Library vielen lieben dank an Aypac GitHub - Aypac/Arduino-TR-064-SOAP-Library: Arduino library for the TR-064 protocol, most commonly used by the Fritz!Box router API

Hallo,

ich hab mir den Sketch mal angesehen , blicke leider nicht ganz dürch was da passieren soll.

Also es gibt zwei Taster ein / aus und eine LED zur Anzeige des Status ob ein oder aus ist. Dann gibt es zwei fertige functionen gwlanon() gwlanof() die mit Wechsel des status einmal aufgerufen werden sollen.

bau dir ein paar Serial.print () ein damit du sehen kannst was passiert.

ich denke die Zeile

if (geschaltet == false, geschaltet2 == true) {

sind falsch muss entwerder ein && ( logisch and)

Heinz

Hi

Mit dem Komma in der IF hatten wir 'die Tage' doch schon Mal - allerdings ergab die dortige Erklärung in meinem Kopf keinen Sinn (oder so), finde den Thread aber auch nicht wieder ...

MfG

ich hab das ganze jetzt mal komplett abgespeckt

#include <Arduino.h>

#define BUTTONON D0
#define BUTTONOFF D1
#define LEDRED D5
#define LEDGREEN D6
int tasteD0 = digitalRead(BUTTONON);
int tasteD1 = digitalRead(BUTTONOFF);


void setup() {
  Serial.begin(74880);
  // Wait a few secs for warm-up (dunno why, was in the default code for http connections).
  delay(5000);
  pinMode(BUTTONON, INPUT); 
  pinMode(BUTTONOFF, INPUT);  
  pinMode(LEDRED, OUTPUT);
  pinMode(LEDGREEN, OUTPUT);
}

void loop() {
      if (digitalRead(tasteD0) == HIGH) 
   {
      tasteD1 = LOW;
      digitalWrite(LEDRED, LOW);
      digitalWrite(LEDGREEN, HIGH);
      Serial.print ("-GREEN");
      
    }
  else
  {
    tasteD0 = LOW;
  }

  

  if (digitalRead(tasteD1) == HIGH) 
   {  
      tasteD0 = LOW;             // sollte der an sein, setzen wir geschaltet auf false
      digitalWrite(LEDRED, HIGH);
      digitalWrite(LEDGREEN, LOW);
      Serial.print ("-RED");
      
    }
      else
  {
    tasteD1 = LOW;
  }
  }

würde ich im ersten und zweiten if ein delay rein machen würde die LEDs blinken.
Es soll aber entweder eine oder die andere an sein.
Ich verzweifle.

Jetzt sind sie Dauerhaft an und die Serial ausgabe sieht wie folgt aus :

-GREEN-RED-GREEN-RED-GREEN-RED...........

Hallo,

es wird sich der letzte Zustand nicht gemerkt. Der Code reagiert auf jede Eingangsänderung vom Tasterpin. Du musst immer nur ein erneutes "gedrückt" auswerten. Nicht jede die Pegeländerung am Pin. Wenn du die Taster entprellst kannste das alles mit einem Taster erschlagen. Dann wird der Taster zum Schalter.

Mal ein Versuch eines relativen Laien:

Die Wertzuweisung im loop, in den if-Abfragen machen keinen Sinn:
tasteD1 = LOW;
tasteD0 = LOW;
Da der Wert durch digitalRead() eh wieder neu gesetzt wird und der zuvor gesetzte Wert keinen Unterschied macht.

  else
  {
    tasteD0 = LOW;
  }

und

   else
  {
    tasteD1 = LOW;
  }

kannst du dir übrigens sparen, wenn beide Schalter nicht auf HIGH sind, sind die auf LOW, daher macht die Wertzuweisung keinen Sinn, davon mal ab gesehen, dass der Schleifendurchlauf den Wert mit digitalRead wieder überschreibt.

Falls ich hier falsch liegen, sagt es, bin auch noch am lernen.^^

Hallo,

ich habe was übersehen. digitalRead in loop fragt nicht die Taster ab sondern eine Variable die kein Pin ist. Damit wird PingPong gespielt.

Zur Erleichterung. Schau dir von der Bounce2 Lib das Bsp. change an und übernehme es.

Dann erschlägst du das mit einem Taster. Je nach Zustand leuchtet dann rot oder grün.

Hast du externe Pullup/Pulldown Widerstände dran? Offene Eingänge sind auch nicht gut.

Hallo,

ich hab da mal was rausgesucht von meinen ersten Gehversuchen und ein bischen angepasst. Es wurde ja schon gesagt das Du alles mit einem Taster machen kannst,( toggeln)

Deine Funktionen gwlanon gelanoff hab ich zum testen in zwei print funktionen gepackt, aber das siehst du ja selbst. Die Namen der Variablen sind zwar anders als bei dir aber das wird nicht das Problem sein.

Heinz

/*
   Taster toggelt eine LED ein und aus.
   bei Statuswechsel wird je eine Funktion aufgerufen
   Hardware UNO

*/

const byte taster = 3;
const byte led = 13;
bool flag, swich, state;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(taster, INPUT_PULLUP);
  pinMode(led, OUTPUT);

}

void loop() {
  swich = !digitalRead(taster); // Taster einlesen

  if (swich && !flag) {   // pos Flanke erkennen
    flag = true;          // Flankenmerke setzten
    state = !state;       // status toggeln
    if (state)gwlanon();    // Funktion on afrufen
    else gwlanoff();       // Funktion off aufrufe
    delay(50);// entprellen
  }

  if (!swich) {
    flag = false; // reset flankenmerker
    delay(50);    // entprellen
  }
  digitalWrite(led, state);// led an /aus
}

void gwlanon() {
  Serial.println ("Status ein");
}

void gwlanoff() {
  Serial.println("Status aus");
}

postmaster-ino:
Hi

Mit dem Komma in der IF hatten wir 'die Tage' doch schon Mal - allerdings ergab die dortige Erklärung in meinem Kopf keinen Sinn (oder so), finde den Thread aber auch nicht wieder ...

MfG

stimmt ich kann mich auch erinnern weiss aber auch nicht mehr in welchem Zusammenhang das war.

Gruß Heinz

:smiley:

Besten dank... funktioniert fast perfekt nur wenn ich jetzt einmal eingeschaltet habe dauert es ewig bis ich wieder ausschalten kann... obwohl ich nirgendwo ein so langen delay angegeben habe :o

Edit: hab gerade herausgefunden das ich anscheind die bessere Masse bin.... wenn ich das kabel von dem Pin kurz berühre schaltet er sofort hin und her -.-

Hallo,

@gicko redest du von meinem code ? kann nicht sein.

ich denke du hast den Taster falsch angeschlossen. Der taster muss zwischen pin3 und 0V.

Wenn Du ihn zwischen Pin und plus hast benötigst du einen externen Widerstand 2-10K vom pin nach 0V und im Setup muss in der Anweisung pinMode das PULLUP weg. Zus. muss in der Zeile eingang einlesen das invertieren weg. Aber standard ist gegen Masse schalten.

Heinz

Mit 0V meinst du G (Ground) oder?

Ich mach mal eben ein Bild mit Fritzing

hallo,

ja

in den beispielen in der IDE sind links zu schaltplänen wie das gemeint ist .

Nachtrag

Googel mal aruino Taster ( bilder)

So hier mal ein Bild vom aufbau :

Hallo

das geht so nicht die dicke Rille in dem steckbrett in der Mitte ist isoliert da gehts es nicht zum schalter, mit dem kleinen Buton ist das so eine Sache ich weiss auch nie wie das mit den 4 Anschlüssen ist ( messen ) , lass erst mal den Taster raus und steck den Draht direkt in die gleiche senkrechte linie in der der andere Draht steckt wenn du schliessen willst.

Ohmannnnnnnn -.- ich hab den fehler

Das liegt bzw. muss an D0 liegen hab es jetzt mal umgeschrieben und gesteckt. Extra das Multimeter für den Taster rausgeholt :smiley: Den Taster auf D3 gelegt und FREUDE!!!

Jetzt funktioniert es! Keine Ahnung was mit auf D0 liegt.

Hi

Nebenbei: Die LED wird Dir SO ebenfalls nicht lange überleben - oder der Arduino-Pin stirbt - LEDs IMMER mit einer Strombegrenzung - im einfachsten Fall einem Vorwiderstand.

MfG

postmaster-ino:
Hi

Nebenbei: Die LED wird Dir SO ebenfalls nicht lange überleben - oder der Arduino-Pin stirbt - LEDs IMMER mit einer Strombegrenzung - im einfachsten Fall einem Vorwiderstand.

MfG

hatte ich völlig übersehen ich hatte mich nur auf den Taster fixiert :cry:

Gruß Heinz

keine angst ich war zu faul den bei fritzing mit ein zu zeichnen hab 220 ohm dran

Hallo,
LEDTaster
2LEDTaster
3LEDTaster
rumiffen
Gruß und Spaß
Andreas