Funktionsstörung für Zweite Led

Hallo ich hab über längeren Zeitraum mir einen Code erarbeitet, wenn ich diesen nun versuche auszuführen geht einfach nichts. Kann mir vielleicht jemand sagen wo ich ansetzten soll oder hat gar eine direkte Lösung. Hab praktisch null Erfahrung und aktuell steh ich echt auf dem Schlauch.


RCSwitch mySwitch;

const int ledPin = 11;
const int ledPin2 =12; 
bool ledStatus = false; 
bool received177 = false;
bool received88 = false; 
unsigned long startTime = 0; 

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT); 
  mySwitch.enableReceive(0); 
}

void loop() {
  if (mySwitch.available()) { 
    int data = mySwitch.
getReceivedValue
(); 
    
    if (data == 177) {
      received177 = true; 
    }
    if (data == 88) {
      received88 = true; 
    }
    
    mySwitch.resetAvailable(); 
  }
  
  if (received177 && received88) { 
    if (!ledStatus) { 
      startTime = millis(); 
      digitalWrite(ledPin, HIGH); 
      ledStatus = true; 
    }
    
    if (millis() - startTime >= 500) {
      digitalWrite(ledPin, LOW); 
      ledStatus = false; 
      received177 = false; 
      received88 = false; 

//ohne den nachfolgenden Teil macht er bis dahin was er soll.

       delay(15000);
  } else if (ledStatus && (received177 || received88)) {
    
    digitalWrite(ledPin2, HIGH);
    delay(1000);
    digitalWrite(ledPin2, LOW);
  
  }
  }
}

Natürlich möchte ich den „zweiten“ Teil auch nutzen. Vielleicht hat auch jemand einen Tipp wie ich eine Pause im „ersten“ Teil zwischen dem Empfang der Daten und Ausführung des einschalten realisieren kann.

Das Ganze läuft aktuell auf einem Nano Klon als Empfänger und zwei digisparks als Sender.

Vielen Dank vorab.
Wenn ich irgendetwas vergessen habe versuche ich alles nach meinem Wissen zu beantworten.

Grundsätzlich würde ich behaupten, dass dein code etwas kompliziert geschrieben ist, wie es "besser" / "einfacher" geht wird dir bestimmt noch jemand sagen.

Aber du schreibst, das dein Nano Daten senden und empfangen soll...

Wenn dem so sein sollte, macht er dies an der Stelle mit dem delay von 15 Sekunden aber mit Sicherheit nicht. Ein delay bedeutet absoluten Stillstand und in der Zeit macht dein Microcontroller rein gar nichts.
Sprich wenn du willst das er was macht, solltest du dich dringend drum kümmern, dass die delays verschwinden.

Das weisst Du aber besser....

Irgendwas ist ja immer .....

1 Like

evil17, danke für deine schnelle Antwort. Vielleicht hab ich das falsch ausgedrückt.
Wenn ich den Code nach dem Delay lösche funktioniert es bis dahin. Das Delay dient dafür das keine Aktion in der Zeit möglich ist, um ein direktes auslösen von Teil zwei zu verhindern z.B wenn man einen der Taster weiterhin gedrückt hält. Hoffe man versteht das irgendwie.

Irgendwie fehlt im Sketch ein #include, oder?

Drück mal STRG-T in der IDE.
Dann siehst Du die Einrückungen.
Warum?
Darum:

ergibt bei mir

  if (received177 && received88)
  {
    if (!ledStatus)
    {
      startTime = millis();
      digitalWrite(ledPin, HIGH);
      ledStatus = true;
    }
    if (millis() - startTime >= 500)
    {
      digitalWrite(ledPin, LOW);
      ledStatus = false;
      received177 = false;
      received88 = false;
      //ohne den nachfolgenden Teil macht er bis dahin was er soll.
      delay(15000);
    }
    else if (ledStatus && (received177 || received88))
    {

Die letzte Bedingung ist von der ersten abhängig.
Wenn in der ersten beide received117 und received 88 true sind, ist es unsinnig im elseif auf received177 ODER received88 true zu prüfen.

Was soll den der Code machen? Ich sehe keinerlei Kommentare....

@shockerxls

du sollst halt auch beschreiben

  • WAS soll der Sketch machen?
  • WAS macht er in welchem Zustand fälschlicherweise statt dessen?

Soll - Ist.
Dann kann man auch einen Fehler suchen.

Ich kanns mir ca vorstellen. Ich hätte es aber gern von dir gewusst was du genau willst und wo es genau hakt.

und wenn man eine Klasse verwendet:


RCSwitch mySwitch;

dann wäre halt schon auch nett wenn man einen Link bekäme wo es diese Klasse auch wirklich gibt...

mal schnell zusammengepfuscht:
receiver - Wokwi ESP32, STM32, Arduino Simulator

  • formatiert
  • eine Testklasse erstellt
  • Serial Debug Ausgaben ergänzt damit man "sieht" was das Ding heute macht

Das könnte wie folgt gedacht sein:

blinkMich(15sec)
{
if (received177 && received88) blinkLed(ledPin,500);
if (received177 || received88) blinkLed(ledPin2,1000);
}

Dann braucht man eine Tüte von ereignisgesteuerten millis() Timern.


RCSwitch mySwitch;

const int ledPin = 11;
const int ledPin2 =12; 
bool ledStatus = false; 
bool received177 = false;
bool received88 = false; 
unsigned long startTime = 0; 

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT); 
  mySwitch.enableReceive(0); 
}

void loop() {
  if (mySwitch.available()) { 
    int data = mySwitch.
getReceivedValue
(); 
    
    if (data == 177) {
      received177 = true; //sender eins
    }
    if (data == 88) {
      received88 = true; //sender zwei
    }
    
    mySwitch.resetAvailable(); 
  }
  
  if (received177 && received88) { //wenn beide ihr "ok" gegeben haben wird led1 für 0,5 sekunden high geschaltet.
    if (!ledStatus) { 
      startTime = millis(); 
      digitalWrite(ledPin, HIGH); 
      ledStatus = true; 
    }
    
    if (millis() - startTime >= 500) {
      digitalWrite(ledPin, LOW); 
      ledStatus = false; 
      received177 = false; 
      received88 = false; 
//lasse ich den nachfolgenden teil weg wird der obere teil schon einmal ausgeführt wie gewünscht.
       delay(15000); //pause da ein direktes auslösen durch zu langes drücken einer der sender verhindert werden soll.
  } else if (ledStatus && (received177 || received88)) {// wenn die erste Aktion ausgeführt wurde und einer der beiden sender erneut gedrückt wird soll led2 für 1sekunde high geschaltet werden. 
  
  
    
    digitalWrite(ledPin2, HIGH);
    delay(1000);
    digitalWrite(ledPin2, LOW);
  //ab hier soll dann alles wieder auf anfang.
  }
  }
}

So hoffe es ist jetzt besser nachvollziehbar.
Schnell zusammen gefasst:
LED1 an wenn 177 und 88 empfangen wurden.
Led2 an wenn led1 an war und 177 oder 88 erneut empfangen wurden.

  • wann soll welche LED wieder abschalten?
  • Was ist das Kritierum für "Led2 an wenn led1 an war und 177 oder 88 erneut empfangen wurden."
    oder in anderen Worten: "wie lange muss die LED1 erloschen gewesen sein um LED2 wegen 177 oder 88 einzuschalten?"

Zu1 Abschalten sollen beide erstmal nach 0,5-1 sekunde da bedarf es vielleicht hinterher noch Anpassung.

Zu2 Wenn LED1 ausgeht wäre eine Pause von 10-15 Sekunden schon ehe LED2 sich durch 177 oder 88 einschalten Liese.

Hallo shockerxls

Poste ein Timimg Diagramm in dem alle Abhängigkeiten erkennbar sind.

müsste ich mir aufzeichnen.
Außer es arbeitet schon jemand drann. Dann spar ich mir das...

receiver - Wokwi ESP32, STM32, Arduino Simulator

aber das Stichwort wäre "Finite State Machine".
Eine Kette an Ereignisse die du einfach ablaufen lässt...

edit ... aso eh einfach:

https://dreampuf.github.io/GraphvizOnline

digraph G { 
  graph [
    label="Finite State Machine"
    labelloc="t"
    fontname="sans-serif"
  ]
  node [
    style=filled
    fillcolor=gray95
    fontname="sans-serif"
  ]
  
  step0  -> step1 [label="177 & 88 in" fontsize=10];  
  step1 -> step2 [label="after 0.5s" fontsize=10];  
  step2 -> step0 [label="after 10s" fontsize=10];  

  
  step0[label = "idle"]
  step1[label = "active"] 
  step2[label = "block"] 
}

edit: update
receiver - Wokwi ESP32, STM32, Arduino Simulator

für die Freunde ohne wokwi:

//https://forum.arduino.cc/t/funktionsstorung-fur-zweite-led/1141787/14

// dummy
class RCSwitch {
  public:
    RCSwitch() {}
    void enableReceive(int i) {
      (void)i;
      randomSeed(analogRead(A3));
    }
    bool available() {
      return true;
    }
    bool resetAvailable() {
      return true;
    }
    int getReceivedValue() {
      return random(20000);   // einfach eine Zufallszahl, darin wird auch mal 177 oder 88 vorkommen
    }
};

RCSwitch mySwitch;

const uint8_t ledPin = 11;
const uint8_t ledPin2 = 12;
bool ledStatus = false;
bool received177 = false;
bool received88 = false;
unsigned long startTime = 0;

enum State {IDLE, ACTIVE, BLOCK} state;

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  mySwitch.enableReceive(0);
}

void loop() {
  switch (state) {
    case IDLE :
      // einlesen
      if (mySwitch.available()) {
        int data = mySwitch.getReceivedValue();
        if (data == 177) {
          Serial.println(data);
          if (received177 == true) {
            Serial.println(F("Wiederholung"));
            digitalWrite(ledPin2, HIGH);
          }
          received177 = true;
        }
        if (data == 88) {
          Serial.println(data);
          if (received88 == true) {
            Serial.println(F("Wiederholung"));
            digitalWrite(ledPin2, HIGH);
          }
          received88 = true;
        }
        mySwitch.resetAvailable();
      }
      // checken
      if (received177 && received88) {
        if (!ledStatus) {
          Serial.println(F("einschalten --> ACTIVE"));
          startTime = millis();
          digitalWrite(ledPin, HIGH);
          ledStatus = true;
          state = ACTIVE;
        }
      }
      break;
    case ACTIVE :
      if (millis() - startTime >= 500) {
        Serial.println(F("abschalten --> BLOCK"));
        startTime = millis();
        digitalWrite(ledPin, LOW);
        digitalWrite(ledPin2, LOW);
        ledStatus = false;
        received177 = false;
        received88 = false;
        state = BLOCK;
      }
      break;
    case BLOCK :
      if (millis() - startTime >= 10000) {    // oder auch länger
        Serial.println(F("zurück zu --> IDLE"));
        state = IDLE;
      }
  }
}

jetzt könnte man noch den "ledstate" entfernen ...

1 Like
'RCSwitch' does not name a type

Du verschweigst einen wichtigen Teil.

Ich habs ohne wokwi udn ohne class einfach nur runtergeschrieben.
Wenns nicht geht, ist auch ok.

RCSwitch mySwitch;

enum class STATUS {warten, led1On, led2On}
STATUS status = STATUS::warten;

const int ledPin = 11;
const int ledPin2 = 12;
bool ledStatus = false;
bool received177 = false;
bool received88 = false;
unsigned long startTime = millis() - 15000;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  mySwitch.enableReceive(0);
}

void readInByte()
{
  if (mySwitch.available())
  {
    int data = mySwitch.getReceivedValue();
    if (data == 177)
    {
      received177 = true; //sender eins
    }
    if (data == 88)
    {
      received88 = true; //sender zwei
    }
    mySwitch.resetAvailable();
  }
}

void loop()
{
  switch (status)
  {
    case STATUS::warten:
      if (millis() - startTime > 15000)
      { readInByte(); }
      if (received177 && received88)   //wenn beide ihr "ok" gegeben haben wird led1 für 0,5 sekunden high geschaltet.
      {
        startTime = millis();
        digitalWrite(ledPin, HIGH);
        status = STATUS::led1On;
        received177 = false;
        received88 = false;
      }
      break;
    case STATUS::led1On:
      readInByte();
      if (received177 && received88)   //wenn beide ihr "ok" gegeben haben wird led1 für 0,5 sekunden high geschaltet.
      {
        startTime = millis();
        digitalWrite(ledPin2, HIGH);
        status = STATUS::led2On;
        received177 = false;
        received88 = false;
        digitalWrite(ledPin, LOW);
      }
      if (millis() - startTime > 500)
      {
        digitalWrite(ledPin, LOW);
      }
      break;
    case STATUS::led2On:
      {
        if (millis() - startTime > 2000)
        {
          digitalWrite(led2, LOW);
          status = STATUS::warten;
        }
      }
      break;
  }
}
1 Like

@my_xy_projekt
Beim einfügen des Codes wird immer die „include rcswitch.h“ geschluckt. Kann es das sein?

Wenn Du in der IDE auf BEARBEITEN - Für Forum kopieren gehst, kommt alles mit.
Dann einfach nur im Post einfügen.
Hinweis: Du darfst keinen Code in der IDE markiert haben.

@my_xy_projekt
Danke werd ich berücksichtigen. Hatte das umständlich anders gemacht.

Danke an alle werd das nachher mal in Ruhe sichten. Echt klasse das ihr euch die Zeit nehmt, vielen vielen Dank.

So, hab es hinbekommen. Dank eurer Ansätze konnte ich mein Problem lösen.
Vielen Dank für euer mitwirken.