Blynk (1.0) Button-Abfrage will nicht so ganz

Frohe Ostern Euch allen und hallo.
Ich hoffe, ich habe jetzt nicht wieder im falschen Bereich gepostet - falls doch, bitte ich um Entschuldigung.

Wie komme ich auf Blynk (1.0)? Nun, simpel. Weil es gerade "besser passt". Und ich habe mich durchgewühlt, aber wie immer nur Ansätze gefunden, die mein Problem nicht behandeln.

Szenario:
Ich möchte bei Blynk 4 normale Push-Buttons einbinden (mit dem standard Template geht das auch prima), um einen Deckenventilator über SSR anzusteuern. Der hat eine Phase, die am 3-Fach-Schalter in Stufen unterteilt wird (also an der Wickelung).

Schalter 1 soll den Vent ein- und ausschalten, Schalter 2 bis 4 sollen Stufe 1 bis 3 regeln.
Wenn Schalter 2, dann 3 und 4 AUS, bei den beiden anderen entsprechend umgekehrt, also S3 AN = 2 & 4 AUS, S4 AN = 2 & 3 AUS.

Besser wäre sogar, wenn S1 ganz wegfallen würde und aus S2, S3, S4 nunmehr S1, S2, S3 würde. Und der Vent eben bei drücken der Tasten entsprechend die Stufe ein- oder ausschaltet, ganz egal welche Position gerade läuft.

Aber sobald ich in den einzelnden void's etwas ändere um den Button-Status upzudaten, macht Blynk da nicht ganz mit. Ich habe den Eindruck, als würden die Arrays doppelt und dreifach ausgeführt, sodass sich alles aufhebt. Und genz ehrlich? Ich blicke irgendwie nicht dahinter und wäre froh, wenn mir jemand sagen kannwas zu tun ist, bzw. eingreifen kann - nicht das ich es nicht schätzen würde von selbst dahinter zu kommen, aber lernen kann man auch mit einer Lösung.

Sorry für den etwas "unaufgeräumten" code, aber wie ihr sehen könnt, zum probieren etwas ausgeklammert. Nur, wenn ich void's nicht rausnehme moppert der natürlich herum, aber so ist ein "rausfinden" halt unmöglich, weil ich nicht weiß in welcher Abfrage der wieder alles aufhebt. Benutzt wird hier ein Wemos D1 Mini clone (ESP8266).

//#define BLYNK_PRINT Serial            
#include <BlynkSimpleEsp8266.h>
#include <Credentials.h> 
//#include <BlynkSimpleEsp32.h>
// define the GPIO connected with Relays and switches
#define RelayPin1 14 //D5
#define RelayPin2 12 //D6
//#define RelayPin3 13 //D7
//#define RelayPin4 15 //D8

#define SwitchPin1 5 //D2 
#define SwitchPin2 4  //D3
//#define SwitchPin3 0  //D4
//#define SwitchPin4 2  //D5

#define VPIN_BUTTON_1    V1 
#define VPIN_BUTTON_2    V2
//#define VPIN_BUTTON_3    V3 
//#define VPIN_BUTTON_4    V4


int toggleState_1 = 1; //Define integer to remember the toggle state for relay 1
int toggleState_2 = 1; //Define integer to remember the toggle state for relay 2
//int toggleState_3 = 1; //Define integer to remember the toggle state for relay 3
//int toggleState_4 = 1; //Define integer to remember the toggle state for relay 4

int wifiFlag = 0;



BlynkTimer timer;

void relayOnOff(int relay){

    switch(relay){
      case 1: 
             if(toggleState_1 == 1){
              digitalWrite(RelayPin1, LOW);
              toggleState_1 = 0;
             Serial.println("Device1 ON");
              }
             else{
              digitalWrite(RelayPin1, HIGH); // turn off relay 1
              //digitalWrite(RelayPin2, HIGH);
              toggleState_1 = 1;
              //toggleState_2 = 1;
              Serial.println("Device1 OFF");
              }
             delay(100);
      break;
      case 2: 
             if(toggleState_2 == 1){
              digitalWrite(RelayPin2, LOW); // turn on relay 2
             // digitalWrite(RelayPin1, HIGH);
              toggleState_2 = 0;
              //toggleState_1 = 0;
              Serial.println("Device2 ON");
              }
             else{
              digitalWrite(RelayPin2, HIGH); // turn off relay 2
            //  digitalWrite(RelayPin1, LOW);
              toggleState_2 = 1;
              //toggleState_1 = 0;
              Serial.println("Device2 OFF");
              }
             delay(100);
      break;
        default : break;      
      }
  
}

void with_internet(){
    //Manual Switch Control
    if (digitalRead(SwitchPin1) == LOW){
      delay(200);
      relayOnOff(1);
      //relayOnOff(2); 
      Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);
      //Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);// Update Button Widget  
    }
    else if (digitalRead(SwitchPin2) == LOW){
      delay(200);
      relayOnOff(2);
      //relayOnOff(1);      
      Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
      //Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);// Update Button Widget
    }
  }
void without_internet(){
    //Manual Switch Control
    if (digitalRead(SwitchPin1) == LOW){
      delay(200);
      relayOnOff(1);
     // relayOnOff(2);      
    }
    else if (digitalRead(SwitchPin2) == LOW){
      delay(200);
      relayOnOff(2);
     // relayOnOff(1);
    }
}

BLYNK_CONNECTED() {
  // Request the latest state from the server
  Blynk.syncVirtual(VPIN_BUTTON_1);
  Blynk.syncVirtual(VPIN_BUTTON_2);
//  Blynk.syncVirtual(VPIN_BUTTON_3);
//  Blynk.syncVirtual(VPIN_BUTTON_4);
}

// When App button is pushed - switch the state

BLYNK_WRITE(VPIN_BUTTON_1) {
  toggleState_1 = param.asInt();
  digitalWrite(RelayPin1, toggleState_1);
  //digitalWrite(RelayPin2, toggleState_2);
  
}

BLYNK_WRITE(VPIN_BUTTON_2) {
  toggleState_2 = param.asInt();
  digitalWrite(RelayPin2, toggleState_2);
  //digitalWrite(RelayPin1, toggleState_1);
  
}

//BLYNK_WRITE(VPIN_BUTTON_3) {
//  toggleState_3 = param.asInt();
//  digitalWrite(RelayPin3, toggleState_3);
//}

//BLYNK_WRITE(VPIN_BUTTON_4) {
//  toggleState_4 = param.asInt();
//  digitalWrite(RelayPin4, toggleState_4);
//}

void checkBlynkStatus() { // called every 3 seconds by SimpleTimer

  bool isconnected = Blynk.connected();
  if (isconnected == false) {
    wifiFlag = 1;
//    digitalWrite(wifiLed, HIGH); //Turn off WiFi LED
  }
  if (isconnected == true) {
    wifiFlag = 0;
//    digitalWrite(wifiLed, LOW); //Turn on WiFi LED
  }
}
void setup()
{
  Serial.begin(9600);

Blynk.begin(AUTH, WIFI_SSID, WIFI_PASS, IPAddress(192,168,2,12), 8080);

  pinMode(RelayPin1, OUTPUT);
  pinMode(RelayPin2, OUTPUT);
//  pinMode(RelayPin3, OUTPUT);
//  pinMode(RelayPin4, OUTPUT);

  //pinMode(wifiLed, OUTPUT);

  pinMode(SwitchPin1, INPUT_PULLUP);
  pinMode(SwitchPin2, INPUT_PULLUP);
//  pinMode(SwitchPin3, INPUT_PULLUP);
//  pinMode(SwitchPin4, INPUT_PULLUP);

  //During Starting all Relays should TURN OFF
  digitalWrite(RelayPin1, toggleState_1);
  digitalWrite(RelayPin2, toggleState_2);
//  digitalWrite(RelayPin3, toggleState_3);
//  digitalWrite(RelayPin4, toggleState_4);

  WiFi.begin(WIFI_SSID, WIFI_PASS);
  timer.setInterval(3000L, checkBlynkStatus); // check if Blynk server is connected every 3 seconds
  Blynk.config(AUTH);
}

void loop()
{  
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("WiFi Not Connected");
  }
  else
  {
    Serial.println("WiFi Connected");
    Blynk.run();
  }

  timer.run(); // Initiates SimpleTimer
  if (wifiFlag == 0)
    with_internet();
  else
    without_internet();//without_internet();
}

NACHTRAG:

IDE:
1.8.13 (weil: Kein Support für bestimmte Boards nach Update)
AMD Athlon II X4 630 2x 2,8 GHz, 12 GB RAM
Win 7 x64 Ultimate SP1

Boards:
1x Original UNO R3
4x Nano
6x Lolin Wemos D1 R2 Mini (ESP8266)
6x NodeMCU 8266
1x Teensy 4.1

Android 11 @SAMSUNG Galaxy A80

Hallo,

die "voids" sind normale Funktionen. void links vom Namen bedeutet kein Rückgabewert. void rechts vom Namen oder leere Klammer bedeutet kein Parameter.

Allgemein würde ich anders rangehen. Mit nur 2 Taster für (+) und (-) einen Zähler bauen der nur zwischen 0 und 3 hoch und runterzählen kann. 0 wäre ausgeschalten plus 3 Stufen.

Programmiere dir einen Taster der nur auf Tastendruck hin um Eins hochzählt und nicht bei Dauerdruck weiterzählt. Wenn du das hast bist du dem Ziel schon ganz nah. Egal wie du es am Ende machst.

Hey DocArduino,

danke für den guten Tipp! (kommt aber sicher als nächstes Projekt, ohne eine App dazwischen) :stuck_out_tongue_winking_eye:

Wenn ich bedenke was ich eigentlich vor habe, ist es so leider nicht machbar (die Blynk Widgets brauchen eindeutige werte, eine Zähler-Rückgabe würde da in diesem Template so nicht klappen, ausser abspecken und umschreiben - aber Blynk (1.0) ist da soweit ich weiß ziemlich launisch).

Das wäre ja alles prima, wenn... Ja wenn es nicht ist wie es ist. Aber hier sind 4 Taster und die wollen nenutzt werden. Im Code sind die bloß "rausgenommen", um in dem kuddel muddel nicht ganz unterzugehen.

Wie gesagt, die (deine) Idee ist super- nur das umsetzen wäre hier nicht richtig. Es soll ja den Ventilator in seinen Eigenschaften simmulieren - der hat eben NULL - 1 - 2 und 3. NULL ist eben kein Strom, 1, 2 und 3 die Stufen, wo auch der Knopf rausspringt, wenn ein anderer gedrückt wird. Und so soll es im Widget auch angezeigt werden, bzw so funktionieren.

Hier die Bilder dazu
Stufe: AUS
Stufe: Speed 1
Stufe: Speed 2
Stufe: Speed 3

und

Breadboard
Breadboard Status

Und eben genau dafür wüsste ich gerne eine Lösung, von mir aus auch ein Code Snippet zum rumprobieren. Ein "geh' ma in diese und in diese Richtung" reicht da manchmal einfach nicht aus. Bitte, habt Verständnis für das "Gejammer". Ich und die anderen wissen ja, dass wir selbständig werden und lernen sollen - aber manche Projekte haben es einfach in sich und dann geht nichts mehr. Zweitweise klappt ja das ein oder andere umschalten, ich verstehe nur nicht warum es dann bei dem Widget nicht geht. Taster 1 und 2 gehen dann im wechsel, aber in der App tut sich nichts. Drücke ich in der App, geht LED1 und/oder LED2 an oder eben aus, oder oder... Aber, dass es am Ende so schaltet wie es soll... tja...

Vielleicht sehe ich vor lauter Bäume den Wald nicht? Bin den ganzen tag schon arg müde...

Habe auch schon das hier

switch(relay){
      case 1: 
             if ((toggleState_1 == 1) & (toggleState_2 == 0))
             {
             digitalWrite(RelayPin1, LOW), (RelayPin2, HIGH) ;
             toggleState_1 = 0;
             toggleState_2 = 1;
             }

versucht und die else Abfrage weggelassen... nichts... Widget funzt, Buttons nicht

Moin xy

ist es aber - und stell dir vor, es funktioniert! Wie kommst du darauf? Erkläre mir das bitte.
Das mit dem Delay ist völlig in Ordnung und hat mit dem void gar nichts zur Sache. Das Delay ist in der Case Abfrage und an jedem Ende ist ein break, sodass der immer schön zum nächsten Case übergibt.

Mir geht es auch nicht darum, dass mir hier einer etwas "hinzaubert". Wenn ich will, schreibe ich mir ein einfaches Array mit ButtonState, aber hier geht es um blynk, WiFi und das kleine Extra, das ganze auch noch per App zu bedienen. Warum sollte ein fertiges Template das so ganz gut läuft denn nicht funzen? Und da bitte die erklärung.

NACHTRAG: Ich habe extra Bilder verlinkt um zu zeigen wie es in der App ausschaut und wie es sein sollte. Danach gestaltet sich das alles. Und damit meine ich, wenn da 3 Schleifen abgefragt werden (siehe kompletten Code bitte), dann muss ja auch in der App eine aktualisierung der Buttons stattfinden.

Der Code ist von einem funktionierenden Sketch mit 4 Buttons (einzeln an und aus).

Was ich allerdings vergesen habe, sind meine IDE Version und alles andere - das hole ich dann mal eben hiermit nach:

IDE:
1.8.13 (weil: Kein Support für bestimmte Boards nach Update)
AMD Athlon II X4 630 2x 2,8 GHz, 12 GB RAM
Win 7 x64 Ultimate SP1

Boards:
1x Original UNO R3
4x Nano
6x Lolin Wemos D1 R2 Mini (ESP8266)
6x NodeMCU 8266
1x Teensy 4.1

Android 11 @SAMSUNG Galaxy A80

Du hast deine Antwort auf deine "Frage" doch bekommen. Gefällt dir die antwort nicht? Tja, kann ich dir nicht helfen. War das denn überhaupt eine Frage, oder eher eine Vermutung?
Weil: Wenn der TE doch schreibt das alles läuft, wieso kommt dann einer wie du und stellt das in Frage und ist nach der Antwort so angepinselt?

Also was brabbelst du mich denn jetzt so von der Seite an?
Hast dein Profil auf Privat, mehrere Beiträge mit gewisser "Würze" von dir schon gesehen (die sprechen ja für sich)...

Und jetzt bin ich dran oder was?
Na dann, alles klar... :joy:

Und, wenn du schon so direkt fragst: Ja! Das meine ich nicht, das sieht man... :wink:

@uwefed
Hallo Uwe, ist ja fast wie ein Deja Vu hier... Keine Sorge, ich halte still. Aber sowas da muss man auch nicht wirklich haben - wäre lieb, wenn du da was vermitteln könntest. Ich denke, ich habe mich so gut es geht erklärt und alles relevante mitgegeben. Danke und schönen Abend.

Hallo,

ruhig Blut. my_xy_projekt ist im Grunde ein Hilfsbereiter Forumsgeselle.

Du hattest ein Problem geschildert, wir haben versucht es zu verstehen. Im Grunde musst du nur eine Funktion schreiben womit man alle Taster abfragt und den Zustand speichert. Danach wird nur mit den Zuständen im restlichen Programm gearbeitet. SPS Prinzip. Einlesen, verarbeiten, ausgeben.
Deswegen gab es auch den Hinweis mit der Taster-Programmierung der nur auf "Drücken Flanke" reagiert. Danach wird es einfacher und viele Problemchen lösen sich in Luft auf.
Für Arduinos gibts dafür auch eine Bounce2 Lib. Ob die auf dem ESP läuft weiß ich nicht.

1 Like

Hi, @Doc_Arduino

Alles gut. Im Grunde suche ich weder Streit noch möchte ich Unmut, und böse meine ich es auch nicht. :wink:

Vor einigen Jahren gab es mal einen Eklat, bei dem über mich ein falscher Eindruck entstand (und jemand, der hier etwas zu sagen hat, hat es auch noch an meinem Google Profilbild festgemacht, was mal gar nicht geht, da dies absolute Voreingenommenheit war. Ich bewerte niemanden nach seinem Bild). Ob sich was daran geändert hat mich immer noch so zu sehen, weiß ich nicht. Wäre schade wenn ja.

Du sagst es: Es geht um Hilfe von und für... - verstehen ist ja auch immer etwas subjektives, wenn einem der Hintergrund fehlt, oder Teile davon - was man ja immer wieder in den Foren zu lesen / sehen bekommt.

Dein Vorschlag ist immer noch in meinem Kopf. Aber für meine Anwendung halt nicht zu gebrauchen, das wollte ich damit sagen. Das Prinzip ist mir auch völlig klar, ich habe versucht zu erklären, dass ich in besagtem Code probleme habe, in den viod's die stellen zu finden, wo die States ins Spiel kommen und die App Buttons aktualisiert werden. Da sind 3 Abfragen. Eine für die V-Pins, eine für die Taster und eine für den ESP, wenn keine Verbindung zur App besteht.

Wenn ich also experimentell nur an einem void schruabe, z.B. den für die App Buttons, dann kann ich die beiden 'manuellen' ja nicht einfach links liegen lassen, weil der Code ja auch diese abfragt und es damit keine Funktion gibt. Das ist mein Problem. im 2. Post habe ich ja ein Snippet gepostet, wo ich schon die Variable geändert habe. Aber das Ergebnis ist halt, dass ich die LED's in der App an und ausbekomme, aber die Buttons "spinnen".

Besonders wichtig ist mir, weil es immer wieder erwähnt wird, ich suche nicht nach eine Lösung einen eigenen Code zu schreiben auf basis eines Bouncers o.ä., sondern die Lösung den bestehenden Code so zu ändern, dass der statt eines einfachen EIN / AUS pro Button ein "weiter nach" Prinzip hat... Drücke ich B1, gehen 2 und 3 aus, auch in der App muss das passieren. Drücke ich in der App z.B. Button 3, muss im State geschrieben werden dass 2 und 3 aus sind und in der App ebenfalls. Ich bitte dich, dir die Bilder einmal anzuschauen. Dort habe ich zur Veranschauung das Prinzip "ein AN/AUS mit 3 Stufen" Array eingestellt.

Und @my_xy_projekt , nimm es nicht persönlich - Ich weiß, hier sind viele schlaue Menschen unterwegs die gerne helfen, und das weiß ich auch zu schätzen (und ja, etwas Ungeduld und Frust ist ja auch oft mit im Spiel). Aber es ist - und dass könnt ihr bitte ruhig zugeben - unproduktiv, wenn man alles 3 mal erklären muss und es geht nicht vorwärts. Ich hatte gehofft meine Beschreibung wäre simpel genug das Problem zu erkennen und eine ebenso simple Antwort zu bekommen (ohne Gegenfragen beantworten zu müssen :yum: ).

Ich wäre Euch sehr verbunden, wenn wir das zu einer Lösung bringen könnten - zudem ich ja davon auch profitiere und anderen damit weiterhelfen kann, sollte es mal woanders vorkommen.

Grüße

Ich bitte dich höflichst, den Post zu löschen.
Mein Post an Doc_Arduino erklärt alles - nimm es an, oder lass es. Aber fang nicht mit mir an schmutzig zu werden.

Die Leute sehen das hier und du diffamierst mich und meinen Post. Sowas, was du da postest, war der Grund dafür, warum es schmutzig wurde. Und nun entferne das bitte.

Be Agreeable, Even When You Disagree

You may wish to respond to something by disagreeing with it. That’s fine. But remember to criticize ideas, not people. Please avoid:

  • Name-calling
  • Ad hominem attacks
  • Responding to a post’s tone instead of its actual content
  • Knee-jerk contradiction

Instead, provide reasoned counter-arguments that improve the conversation.

Hallo,

okay vielleicht beruhigt sich alles. Entschuldigt haste dich ja.
Was ich aber noch sagen möchte ist. Rückschlüsse vom Avatarbild zu ziehen ist blanker Unsinn. Das sollte jeder wissen und verstehen. Weiter kommentiere ich das nicht.

Du musst Geduld haben. Das ist nicht leicht nachzuvollziehen für Außenstehende wenn man das nicht 1:1 testen kann.
Kommen die Statusvariablen der Taster vom Arduino in der App falsch an?
Oder kommen die Statusvariablen von der App im Arduino falsch an?
Laut Eingangspost kommen die Statusvariablen in der App falsch an. Richtig?
Deine App Button Bilder habe ich verstanden. Das ist nicht das Problem.
Problem ist den Zusammenhang zwischen App und dem Sketch zu verstehen.
Mein Verständnisproblem ist auch manchmal das ich Button mit den Widget-Button verwechsel - beim Lesen.

Wir machen mal folgendes. Wir betrachten erstmal alles komplett ohne App. Damit man/ich ein Verständnis für das Problem bekomme. Rein das Steckbrett mit Taster und Leds betrachtet. Mehr nicht. Funktioniert das wie gewünscht? Oder gibt es dabei schon Probleme?

Jetzt greife ich einmal vor. Muss die App pro Widget-Button einen Code wie V1, V2 ... übertragen bekommen? Oder wofür dienen diese #defines dafür?

Wow, jetzt geht's los... Danke erstmal für deine freundlichen Worte und der Tatsachenauffassung.

Ja, ist von allem etwas würde ich sagen. Und, ich vergesse auch immer Widget-Buttons zu benennen. Noch habe ich jetzt nichts umcodiert. Am Steckbrett ist ganz normal pro GPIO ein Ausgang zu den LED's, bzw. Eingang zu den Push-Buttons. (Hier sei eben noch gesagt, wenn ich das Programm ohne zu ändern laufen lasse, geht jeder (Widget)Button, aber eben nur für sich selbst ohne den anderen zu beeinflussen.

Das Problem das ich dabei sehe ist, dass ich im ersten void

void relayOnOff(int relay){

    switch(relay){
      case 1: 
             if(toggleState_1 == 1){
              digitalWrite(RelayPin1, LOW); // turn on relay 1
              toggleState_1 = 0;
              Serial.println("Device1 ON");
              }

nichts ausklammern kann, weil der sonst gar nicht erst anfängt das zu compilen. Also dem fehlen dann die Argumente und Funktionen, etc. zu den beiden anderen void's unten.
Im Grunde, müsste ich dem erstmal ein komplett neues Switch-Array verpassen.

Gib mir bitte mal "ne Sekunde", ich versuch da mal was... (ca. 10 min.)

Hallo,

vor morgen wird bei mir auch nichts mehr. Kannst dir Zeit nehmen.

Dann mache ich für heute auch dicht - kann mich kaum noch konzentrieren.

Danke, gute Nacht und bis Morgen.

Moinsen

Hab das jetzt soweit erstmal geschafft - was halt noch fehlt sind zwei Sachen.

Einmal Schutz vor direktem einschalten an den Stufen und Last State, wenn der Vent aus ist oder Stromausfall war, dass der sich die Position merkt. Da weiß ich jetzt noch nichts so den Weg.

Hier ist mal der Sketch wie er gerade läuft (sozusagen nackt)

#define B1 5
#define B2 4
#define B3 0
#define B4 2 
#define R1 14
#define R2 12
#define R3 13
#define R4 15

int toggleState_1 = 0;
int toggleState_2 = 0;
int toggleState_3 = 0;
int toggleState_4 = 0;

void relayOnOff(int relay){
  
  switch(relay){
    case 1:
         if(toggleState_1 == 1){
         digitalWrite(R1, LOW);
         digitalWrite(R2, LOW);
         digitalWrite(R3, LOW);
         digitalWrite(R4, LOW);
         
         toggleState_1 = 0;
         toggleState_2 = 0;
         toggleState_3 = 0;
         toggleState_4 = 0;
         Serial.println("VENT OFF!"); 
          }
          else {
           digitalWrite(R1, HIGH);
           digitalWrite(R2, HIGH);
           toggleState_1 = 1;
           toggleState_2 = 2;
           Serial.println("VENT ON!");
           Serial.println("STAGE 1 ON!"); 
          }
    delay(100);
    break;
    
    case 2:
         if(toggleState_2 == 0){
         digitalWrite(R2, HIGH);
         digitalWrite(R3, LOW);
         digitalWrite(R4, LOW);
         toggleState_2 = 1;
         toggleState_3 = 0;
         toggleState_4 = 0;
         Serial.println("STAGE 1 ON!"); 
          }
         delay(100);
    break;

    case 3:
         if(toggleState_3 == 0){
         digitalWrite(R2, LOW);
         digitalWrite(R3, HIGH);
         digitalWrite(R4, LOW);
         toggleState_2 = 0;
         toggleState_3 = 1;
         toggleState_4 = 0;
         Serial.println("STAGE 2 ON!"); 
          }
         
    delay(100);
    break;

    case 4:
         if(toggleState_4 == 0){
         digitalWrite(R2, LOW);
         digitalWrite(R3, LOW);
         digitalWrite(R4, HIGH);
         toggleState_2 = 0;
         toggleState_3 = 0;
         toggleState_4 = 1;
         Serial.println("STAGE 3 ON!"); 
          }
          
    delay(100);
    break;
  default : break;
  }
}

void relay(){
  if (digitalRead(B1) == LOW){
      delay(200);
      relayOnOff(1);
     // relayOnOff(2);
}
else if (digitalRead(B2) == LOW){
  delay(200);
  relayOnOff(2);
  //relayOnOff(1);
}
else if (digitalRead(B3) == LOW){
  delay(200);
  relayOnOff(3);
  //relayOnOff(1);
}
else if (digitalRead(B4) == LOW){
  delay(200);
  relayOnOff(4);
  //relayOnOff(1);
 }
}

void setup()
{
 Serial.begin(74880);
 pinMode (B1, INPUT_PULLUP);
 pinMode (B2, INPUT_PULLUP);
 pinMode (B3, INPUT_PULLUP);
 pinMode (B4, INPUT_PULLUP);
 
 pinMode (R1, OUTPUT);
 pinMode (R2, OUTPUT);
 pinMode (R3, OUTPUT);
 pinMode (R4, OUTPUT);

 //digitalWrite(R1, toggleState_1);
 digitalWrite(R2, toggleState_2);
 digitalWrite(R2, toggleState_3);
 digitalWrite(R2, toggleState_4);
}

void loop() {
 relay();
}

Debug:

load 0x4010f000, len 3460, room 16
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v000420e0
~ld
VENT ON!
STAGE 1 ON!
STAGE 2 ON!
STAGE 3 ON!
STAGE 2 ON!
STAGE 1 ON!
STAGE 3 ON!
STAGE 1 ON!
STAGE 2 ON!
VENT OFF!

Soweit erstmal...

NACHTRAG
So, das eine Problem "direktes einschalten aller Stufen" ist behoben. Jede Stufe hat ihre Doppelfunktion 'solange 1 nicht an ist, dann machst du NICHTS'.

         if ((toggleState_1 == 1) and (toggleState_2 == 0)){

Hab schon gesehen, mit Bounce2 und all dem wird's kiffelig das später in den Blynk-Sketch zu packen...

Hallo,

ich bin gerade dabei etwas auszuprobieren.

Vorher habe ich den letzten Sketch angeschaut. Ich dachte das immer nur ein Relais pro Stufe eingeschalten ist? In Zeile 32 und 33 sind jedoch im else Zweig 2 Relais eingeschalten.
In Zeile 35 wird toggleState_2 auf den Wert 2 gesetzt.
Die toggleState_n sollten jedoch nur bool Datentyp haben.

Ausgehend von 4 Schaltern.
Ich dachte
Schalter 1 gedrückt ... alles aus
Schalter 2 gedrückt ... nur Relais 1 ein
Schalter 3 gedrückt ... nur Relais 2 ein
Schalter 4 gedrückt ... nur Relais 3 ein

Falsch gedacht?

Möchtest du immer noch den ersten Schalter weg haben?
Könnte man mit Bounce2 bestimmt machen.

Ausgehend von 3 Schaltern, reine Stufenschalter.
Ich dachte
Schalter 1 gedrückt ... nur Relais 1 ein
Schalter 2 gedrückt ... nur Relais 2 ein
Schalter 3 gedrückt ... nur Relais 3 ein
Jedes betätigen eines Schalters schaltet seinen eigenen Zustand ein oder aus und damit sein Relais ein und aus. In der Auswertelogik muss der zuletzt gedrückte Schalter der aktiv ist alle anderen zurücksetzen. Damit erreicht man das immer nur die Stufe des zuletzt gedrückten Schalters aktiv ist und wenn man den zuletzt gedrückten Schalter erneut drückt automatisch alle Stufen aus sind.

Kannste dir mal überlegen. Die wäre kann das die App auch nachbilden?
Was sendet die App an Daten pro Widget Button drücken?

War ein Fehler, der bereits behoben ist. Natürlich NULL oder EINS.

Nein, vollkommen richtig. Aber das mit den Stufenschaltern ist auch richtig, allerdings ist Schalter 1 der AUS Knopf.

Im Moment läuft der so:

Schalter 1 aktiviert Stufe 1 (Schalter 2)
Schalter 2 ist bereits AN
Schalter 3 aktiviert Stufe 2
Schalter 4 aktiviert Stufe 3

alles geht, aber da ich noch eine Lampe mit dran habe (Deckenventilatior), habe ich nicht bedacht, dass ich noch 2 Kanäle dafür brauche. Also bietet sich das im Grunde schon an, den Vent mit Stufe 1 einzuschalten, 2 und 3 weiter oder zurück, und mit Schalter 1 (ohne ein Relay ansteuern zu müssen, weil kein LED Status notwendig wenn aus) auszumachen.

Schalter 5 sollte dann Relay 1 oder 4 bekommen, damit der SSR die Lampe hat.

Ist etwas spät, ich mache morgen weiter und poste dir dann den Code.
Vielleicht das noch: Das mit Bounce2 ist sicher gut, aber wie gesagt ich möchte oder muss das so einfach wie möglich halten, weil mit der App das ist ein zweischneidiges Schwert. Was die Widget-Button ausgeben, kann ich dir nicht sagen - nur die Auflösung im Sketch (was ich ja schon Eingangs gepostet habe). Aber das müsste dann das Button-Update über die Virtual Pins sein.

Hallo,

soweit fast verstanden. Mir fehlt bei der Debugausgabe der Zusammenhang welcher Taster gedrückt wurde und was sich daraufhin geändert hat. Ich habe dennoch einmal etwas mit Bounce2 programmiert mit nur 3 Taster welche im Programm wie Schalter behandelt werden. Weil was ich nicht mag ist ein sogenannter Spaghetticode. Mag bis 3 Wiederholungen vielleicht noch erträglich sein. Mit 4 oder gar nun 5 Zuständen kann man das kaum noch lesen. Das wiederum erschwert die Tipparbeit und Korrekturen.

Die Lampe würde ich vollkommen für sich programmieren. Die soll ja sicherlich unabhängig aller Ventilatorstufen leuchten bzw. geschalten werden. Kann man auch mit der Bounce2 Lib machen.

Das Programm mit nur 3 Tastern funktioniert wie folgt. Es gewinnt immer der zuletzt gedrückte Taster. Dessen Indexwert vom Array "schalterStatus" wird in der Variablen "letzterSchalter" gespeichert.

Jeder Schalter kann für sich einzeln aus- und eingeschalten werden und damit die Stufen. Wird ein anderer Schalter gedrückt, werden alle vorherigen die vielleicht vorher aktiv waren gelöscht bzw. zurückgesetzt. Damit ist immer nur ein Schalter und nur eine Stufe aktiv.

Und mit der App muss im Grunde "nur" noch eine weitere Funktion/Schnittstelle her die die bool Zustände in "schalterStatus []" ändert. Dann kann am Ende die App und die Taster parallel verwendet werden. Das Programm müßte nur umgehend nach dem Statusupdate die neuen Zustände zurück an die App senden, wenn das möglich ist, damit in der App die Widget Button korrekt an/aus anzeigen.

Zeilen 74-88 sollen nur zeigen was die for darüber Schleife ersetzt. Ein Bsp. wie man Spaghetticode mittels Array erschlägt.

Ich hoffe dich erschlägt das nicht. Ist noch einfach gehalten. Könnte man noch mit Parameterübergabe machen. Musst zum testen nur die Pins im Array ändern. Zeile 14 und 15. Wenn das nichts für dich ist ist auch nicht schlimm. Dann könntest du ggf. die Funktionalität nachbauen.

Sketch
/*
  Doc_Arduino - german Arduino Forum
  IDE 1.8.19
  Arduino Mega2560
  13.04.2023
  https://forum.arduino.cc/t/blynk-1-0-button-abfrage-will-nicht-so-ganz/1113468/19

  nur 3 Button für 3 Stufen
*/

#include <Bounce2.h>

const byte ANZAHL {3};
const byte pinSchalter [ANZAHL] {2, 3, 4};
const byte pinRelais [ANZAHL] {28, 29, 30};
bool schalterStatus [ANZAHL] {false, false, false};
byte letzterSchalter {0};

Bounce schalter [ANZAHL] {}; // 3 Bounce Objekte in einem Array erstellen

void setup (void)
{
  Serial.begin(9600);
  Serial.println("\nuC Reset ###");

  for (byte i=0; i<ANZAHL; i++) {
    schalter[i].attach(pinSchalter[i], INPUT_PULLUP);
    schalter[i].interval(25);
    pinMode(pinRelais[i], OUTPUT);
  }
}

void loop (void)
{
  alleSchalterEinlesen();

  aktuellenSchalterErmitteln();
  
  updateSchalterStatus();
  
  updateRelais();
  
  serialMonitor(1000);
}

void alleSchalterEinlesen (void)
{
  for (byte i=0; i<ANZAHL; i++) {
    schalter[i].update();
  }
}

void aktuellenSchalterErmitteln (void)
{
  // alle Schalter auswerten und in 'letzterSchalter' zuletzt gedrückten Schalter speichern
  for (byte i=0; i<ANZAHL; i++) {
    if(schalter[i].fell() ) {
      schalterStatus[i] = !schalterStatus[i];
      letzterSchalter = i;
      Serial.print("letzterSchalter "); Serial.println(letzterSchalter);  
    }
  }
}

void updateSchalterStatus (void)
{
  // andere/alte Schalterzustände zurücksetzen/löschen
  for (byte i=0; i<ANZAHL; i++) {
    if(letzterSchalter != i) {
      schalterStatus[i] = false;
    }
  }
/*  
  // obige for ersetzt diesen Zeilensalat
  if (letzterSchalter < ANZAHL) {
    switch (letzterSchalter) {
      case 0: schalterStatus[1] = false;
              schalterStatus[2] = false;
              break;
      case 1: schalterStatus[0] = false;
              schalterStatus[2] = false;
              break;
      case 2: schalterStatus[0] = false;
              schalterStatus[1] = false;
              break;
      default: break;
    }
  }
*/  
}

void updateRelais (void)
{
  for (byte i=0; i<ANZAHL; i++) {
    digitalWrite(pinRelais[i], schalterStatus[i]);
  }
}

void serialMonitor (const unsigned long interval)                     
{
  static unsigned long lastMillis {0};
  const unsigned long ms {millis()};
  
  if (ms - lastMillis >= interval) {
    lastMillis = ms;
    Serial.print("schalterStatus ");  
    for (byte i=0; i<ANZAHL; i++) {
      Serial.print(schalterStatus[i]);
      Serial.print("  ");  
    }
    Serial.println();
  }
}

Hi (hab übrigens einen Namen, den man beim hallo schreiben könnte, wie man das so macht),

war ein Paar Tage anders eingespannt. Sorry.

Ich weiß weiß nicht, was ich sagen soll. Und ich glaube dass, jedes noch so gut gemeinte Wort von mir als Angriff UND Undankbarkeit gewertet würde...

Ich bin jetzt erstmal nach Bergisch Gladbach zu einem Freund - Muss ein Paar Elkos holen und dringend einen SATA-Controller fixen... ich schaue später rein

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.