Doppelte Abfrage

Hallo zusammen. Ich habe folgendes vor:
Ich komme mit einem IR Code in den Arduino. Nach dem Auswerten dieses Code (hatte ich bis jetzt über Switch Case gelößt muss noch eine Abfrage kommen wie der Status eines schonmal geschaltenen Ausgangs war

Also ich komme z.B. mit dem Befehl 001> diesen Werte ich mit den Switch Case aus> dann Frage ich ab ob der int KanalA auf 0 steht> dann schalte ich einen Ausgang für 0,3 sek auf High und dann auf Low> dann schreibe ich in den int KanalA eine 1

Mein Problem ist, dass ich nicht weis wie ich in den Switch case eine Abfrage für den Kanal A rein bringe, und dann auch noch den KanalA danach auch schreibe.
Habe jetzt einfach mal angefangen wie ich gemeint habe.

Vieleicht kann jemand helfen.

Dane vorab

#include <IRremote.h>

int IRpin = 11; // Pin fuer den IR Empfaenger
int LED = 13; // LED Pin
int KanalA = 0;
int KanalB = 0;

IRrecv irrecv(IRpin);
IRsend irsend; // PWM Pin 3 IR LED Out

decode_results results;

void setup()
{
pinMode (1, OUTPUT); // Kanal A Ein
pinMode (2, OUTPUT); // Kanal A Aus
pinMode (3, OUTPUT); // Kanal B Ein
pinMode (4, OUTPUT); // Kanal B Aus

Serial.begin(9600);
irrecv.enableIRIn(); // IR Empfaenger starten
pinMode(LED, OUTPUT);
}

void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, DEC);
switch (results.value) // Abhaengig vom Signal in den richtigen Modus springen
{
case 16585453:// Play
if (KanalA == 1)
Serial.println("Dune Play Dimm Down Light off "); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(1, HIGH)
delay(300);
digitalWrite(1, LOW)
break;
else break;

Hallo,

dein Kanal A und B sind Ausgänge.
Dann brauchst für jeden eine status Variable. Genauso als wenn du einen Tasterstatus abfragen würdest.
Den Wert der byte status Variable (0 oder 1) gibts du mit digitalWrite aus statt
digitWrite(Pin, status);
status kannst du dann auch mit if abfragen usw.

Übrigens, wenn das else von if else leer ist, dann läßt man das weg bevor Mist rauskommt.
else break wird sonst gefährlicher Blödsinn.

break darf nur für die case Verzweigungen gültig sein.

Danke dir Doc_Arduino

So ganz verstehe ich es noch nicht. Vielleicht kannst nochmals helfen. Kanal1 ist doch ganz oben im int KanalA = 0 doch eine variable oder?
Jetzt Frage ich nach dem Case mit noch einem if (KanalA = 1) doch diesen ab oder?
Jetzt kapier ich nur nicht was du mit der variablen schreiben meinst. So war mein Gedanke dazu. zuerst Frage ich den IR Befehl ab und dann schalte ich auf Pin 1 High, 300ms Pause, dann Pin 1 wieder auf Low und jetzt will ich die variable umschreiben auf 2. Aber so wie ich es jetzt habe gehts ja ned oder? Kannst du da bitte nchmals helfen?

switch (results.value) // Abhaengig vom Signal in den richtigen Modus springen
{
case 16585453:// Play
if (KanalA == 1)
Serial.println("Dune Play Dimm Down Light off "); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(1, HIGH);
delay(300);
digitalWrite(1, LOW);
delay(100);
digitalWrite(KanalA = 2);
break;

Du meinst mit hoher Wahrscheinlichkeit:

    case 16585453:// Play
      if (KanalA == 1) {
        Serial.println("Dune Play Dimm Down Light off "); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(1, HIGH);
        delay(300);
        digitalWrite(1, LOW);
        delay(100);
        digitalWrite(KanalA = 2);
      }
      break;

Gruß Tommy

Hallo,

Gegenfrage. Woher weißt du das KanalA gleich 1 ist?
KanalA wird mit 0 initialisiert und ändert sich danach nicht mehr.
Demnach wird er nie 1 sein.
Das bedeutet deine if Abfrage wird nie wahr werden.
Verständlicher?

Zudem die Verwendung von PIN 0 und 1 erstmal verboten ist, wenn du die serielle verwendest. Sicherheitshalber sollte man die immer frei lassen bis es gar nicht mehr anders geht oder man genau weiß was man tut. Über diese beiden Pins wird dein µC programmiert und steht in Verbindung zu USB. Das kann hier nur schief gehen.

Und was wird das digitalWrite(KanalA = 2); ?

Du müßtest erstmal klären oder erklären womit oder wodurch sich der Wert/Zustand von Kanal A überhaupt ändern soll.

Danke mit dem Tip Pin 0 und 1. Hatte ienfach zum progr. einen genommen. Sieht dann später anders aus. Danke

Dachte mit dem digitalWrite(KanalA = 2); ändere ich den Wert. Ist falsch oder?

Doc_Arduino:
Hallo,

Gegenfrage. Woher weißt du das KanalA gleich 1 ist?
KanalA wird mit 0 initialisiert und ändert sich danach nicht mehr.
Demnach wird er nie 1 sein.
Das bedeutet deine if Abfrage wird nie wahr werden.
Verständlicher?

Zudem die Verwendung von PIN 0 und 1 erstmal verboten ist, wenn du die serielle verwendest. Sicherheitshalber sollte man die immer frei lassen bis es gar nicht mehr anders geht oder man genau weiß was man tut. Über diese beiden Pins wird dein µC programmiert und steht in Verbindung zu USB. Das kann hier nur schief gehen.

Und was wird das digitalWrite(KanalA = 2); ?

Du müßtest erstmal klären oder erklären womit oder wodurch sich der Wert/Zustand von Kanal A überhaupt ändern soll.

glaub jetzt hab ichs
Kann bitte noch jemand mal drüber schauen?

#include <IRremote.h>

int IRpin = 11; // Pin fuer den IR Empfaenger
int LED = 13; // LED Pin
int KanalA = 0;
int KanalB = 0;

IRrecv irrecv(IRpin);
IRsend irsend; // PWM Pin 3 IR LED Out

decode_results results;

void setup()
{
pinMode (4, OUTPUT); // Kanal A Ein
pinMode (5, OUTPUT); // Kanal A Aus
pinMode (6, OUTPUT); // Kanal B Ein
pinMode (7, OUTPUT); // Kanal B Aus

Serial.begin(9600);
irrecv.enableIRIn(); // IR Empfaenger starten
pinMode(LED, OUTPUT);
}

void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, DEC);

switch (results.value) // Abhaengig vom Signal in den richtigen Modus springen
{
case 16585453:// Play
if (KanalA == 1)
{
Serial.println("Dune Play Light off "); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(1, HIGH);
delay(300);
digitalWrite(1, LOW);
delay(100);
int KanalA = 2;
Serial.println(KanalA, DEC);
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

case 16619623:// Stop
if (KanalA == 2)
{
Serial.println(F("Dune Stop Light on ")); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
delay(100);
int KanalA = 1;
Serial.println(KanalA, DEC);
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

case 16611463:// Pause
if (KanalA == 2)
{
Serial.println(F("Dune Pause Light on ")); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
delay(100);
int KanalA = 1;
Serial.println(KanalA, DEC);
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

case 3270060758:// Play
if (KanalA == 1)
{
Serial.println("BR Play Light off "); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(1, HIGH);
delay(300);
digitalWrite(1, LOW);
delay(100);
int KanalA = 2;
Serial.println(KanalA, DEC);
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

case 3398796026:// Stop
if (KanalA == 2)
{
Serial.println(F("BR Stop Light on ")); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
delay(100);
int KanalA = 1;
Serial.println(KanalA, DEC);
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

case 584023616:// Pause
if (KanalA == 2)
{
Serial.println(F("BR Pause Light on ")); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
delay(100);
int KanalA = 1;
Serial.println(KanalA, DEC);
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

case 530668648:// Power on
if (KanalA == 2)
{
Serial.println(F("Power on Light on ")); // Ausgabe auf der Seriellenschnittstelle
delay(100);
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
delay(100);
int KanalA = 1;
Serial.println(KanalA, DEC);
Serial.println("Ende Power on "); // Ausgabe auf der Seriellenschnittstelle
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

break;

case 4149255128:// Power off
if (KanalA == 1)
{
Serial.println("Power off start Light off 10 sek"); // Ausgabe auf der Seriellenschnittstelle
delay(10000);
digitalWrite(1, HIGH);
delay(300);
digitalWrite(1, LOW);
delay(100);
int KanalA = 2;
Serial.println(KanalA, DEC);
Serial.println("Power off fertig Light off "); // Ausgabe auf der Seriellenschnittstelle
irrecv.enableIRIn(); // IR Empfaenger starten
}
break;

default: // Standard
Serial.println(F("nicht erkannt"));
break;
}
irrecv.resume();
}
}

irrecv.enableIRIn(); ist meines Wissens nur in setup() notwendig.

delay() und Fernbedienung passen nicht gut zueinander. Ob das für Dich relevant ist, entscheidet die Anwendung.

Konstanten und Variablen sollten ihrer Aufgabe entsprechend deklariert werden:

const byte IRpin = 11; // Pin fuer den IR Empfaenger
const byte LED = 13; // LED Pin
byte KanalA = 0;
byte KanalB = 0;

Kannst du mir erklären was da der Unterschied ist zu dem was ich hatte. Will es ja verstehen
Danke schonmal

Habs bei mir so eingepflegt

agmue:
irrecv.enableIRIn(); ist meines Wissens nur in setup() notwendig.

delay() und Fernbedienung passen nicht gut zueinander. Ob das für Dich relevant ist, entscheidet die Anwendung.

Konstanten und Variablen sollten ihrer Aufgabe entsprechend deklariert werden:

const byte IRpin = 11; // Pin fuer den IR Empfaenger

const byte LED = 13; // LED Pin
byte KanalA = 0;
byte KanalB = 0;

Könntest Du Dir bitte angewöhnen, Deinen Code in Codetags zu setzen, nicht in irgendwelche andere Markierungen? Oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *.
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Gruß Tommy

Hallo,

beim überfliegen scheint sich nun was gebessert zu haben.
Was du noch ändern solltest und ich schon geschrieben hatte, ist die Sache mit Serial und den Pin 0 und 1.
Bei dir kommt sonst nur Mist raus.

Danke euch nochmals.
@Doc_Arduino:Ich verstehs einfach ned was du meinst mit dem Serial. Die Pins habe ich jetzt geändert, nachdem mein Arduino angeschlossen wurde. Sorry. Bin halt absoluter Anfänger.

Jetzt mein aktuelles Problem. Ich dachte mit byte KanalA; lege ich eine variable fest die ich später im void loop überschreibe und der Wert dann drin bleibt. Das geht aber nicht. Jedes mal wenn das Programm wieder durchläuft überschreibt es den von mir eingeschrieben wert auf 0. Ich sehe im Serial Monitor die 0, dann gehe ich mit dem switch Case in eine If Bedinung rein( das geht alles) und schreibe mit Byte KanalA = 1 doch eine 1 rein oder? Warum ist sie beim nächsten durchgang dann wieder weg?
Ich begreif es einfach ned.

#include <IRremote.h>

const byte IRpin = 11; // Pin fuer den IR Empfaenger
const byte LED = 13; // LED Pin
byte KanalA; // 0 ist aus und 1 ist ein

IRrecv irrecv(IRpin);
IRsend irsend; // PWM Pin 3 IR LED Out

decode_results results;

void setup()
{
  pinMode (2, OUTPUT); // Kanal A Ein
  pinMode (3, OUTPUT); // Kanal A Aus
  pinMode (4, OUTPUT); // Kanal B Ein
  pinMode (6, OUTPUT); // Kanal B Aus

 
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfaenger starten
  pinMode(LED, OUTPUT);
}

void loop()
{
 
  Serial.println(KanalA, DEC);
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, DEC);
    
    switch (results.value) // Abhaengig vom Signal in den richtigen Modus springen
    {
      case 16585453:// Play
      Serial.println("erkannt Dune Play  Light off "); // Ausgabe auf der Seriellenschnittstelle
      if (KanalA == 1)
      {
        Serial.println("Dune Play  Light off "); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(2, HIGH);
        delay(300);
        digitalWrite(2, LOW);
        delay(100);
        byte KanalA = 0;
        Serial.println(KanalA, DEC);
        irrecv.enableIRIn(); // IR Empfaenger starten
      }
        break;
        

      case 16619623:// Stop
      if (KanalA == 0)
      {
        Serial.println(F("Dune Stop Light on  ")); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(3, HIGH);
        delay(300);
        digitalWrite(3, LOW);
        delay(100);
        byte KanalA = 1;
        Serial.println(KanalA, DEC);
        irrecv.enableIRIn(); // IR Empfaenger starten
        }
        break;

        

      case 16611463:// Pause
      if (KanalA == 0)
      {
        Serial.println(F("Dune Pause Light on  ")); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(3, HIGH);
        delay(300);
        digitalWrite(3, LOW);
        delay(100);
        byte KanalA = 1;
        Serial.println(KanalA, DEC);
        irrecv.enableIRIn(); // IR Empfaenger starten
        }
        break;

      case 3270060758:// Play
       if (KanalA == 1)
      {
        Serial.println("BR Play  Light off "); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(2, HIGH);
        delay(300);
        digitalWrite(2, LOW);
        delay(100);
        byte KanalA = 0;
        Serial.println(KanalA, DEC);
        irrecv.enableIRIn(); // IR Empfaenger starten
      }
        break;
        

      case 3398796026:// Stop
      if (KanalA == 0)
      {
        Serial.println(F("BR Stop Light on ")); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(3, HIGH);
        delay(300);
        digitalWrite(3, LOW);
        delay(100);
        byte KanalA = 1;
        Serial.println(KanalA, DEC);
        irrecv.enableIRIn(); // IR Empfaenger starten
        }
        break;
        

      case 584023616:// Pause
      if (KanalA == 0)
      {
        Serial.println(F("BR Pause Light on  ")); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(3, HIGH);
        delay(300);
        digitalWrite(3, LOW);
        delay(100);
        byte KanalA = 1;
        Serial.println(KanalA, DEC);
        irrecv.enableIRIn(); // IR Empfaenger starten
        }
        break;
        


    case 530668648:// Power on
    if (KanalA == 0)
      {
        Serial.println(F("Power on  Light on  ")); // Ausgabe auf der Seriellenschnittstelle
        delay(100);
        digitalWrite(3, HIGH);
        delay(300);
        digitalWrite(3, LOW);
        delay(100);
        byte KanalA = 1;
        Serial.println(KanalA, DEC);
        Serial.println("Ende Power on "); // Ausgabe auf der Seriellenschnittstelle
        irrecv.enableIRIn(); // IR Empfaenger starten
        }
        break;
        
        
        break;

      case 4149255128:// Power off
      if (KanalA == 1)
      {
        Serial.println("Power off start Light off 10 sek"); // Ausgabe auf der Seriellenschnittstelle
        delay(10000);
        digitalWrite(2, HIGH);
        delay(300);
        digitalWrite(2, LOW);
        delay(100);
        byte KanalA = 0;
        Serial.println(KanalA, DEC);
        Serial.println("Power off fertig Light off "); // Ausgabe auf der Seriellenschnittstelle
        irrecv.enableIRIn(); // IR Empfaenger starten
      }
        break;
        
        

        
      default: // Standard
        Serial.println(F("nicht erkannt"));
        break;
    }
    irrecv.resume();
  }
}
byte KanalA = 1;

Damit erzeugst du eine neue Variable KanalA, die am Ende des Blocks wieder beseitigt wird.
Für eine Zuweisung an die globale Variable nimm besser

KanalA = 1;

Genau das wars. Vielen Dank :slight_smile:

Hallo,

serial und Pin 0/1
Ich weiß nicht wie ich das anders erklären soll. Aber schön das du es wenigstens geändert hast.
Ich versuche es nochmal.
Wenn du den µC flashen tust, dann geht das vom Rechner über USB zum Arduino rein, zum "Übersetzer IC" und der ist wiederum am eigentlichen µC den du programmierst an den Pins 0 und 1 angeschlossen. Gleichzeitig liegt auf diesen Pins die 1. serielle Schnittstelle. Wird von 0 an gezählt. UART0. Wenn du im Programm Serial verwendest, geht das wieder vom µC Pin 0/1 rückwärts zum Übersetzer-IC über USB raus zum Rechner und zum Terminal wo das dann siehst.

Dein Fehler war diese beiden Pins im Programm zu überschreiben. Das heißt die serielle Ausgabe und deine unkontrollierten Schaltvorgänge kommen ins Gehege. Im einfachsten Fall laufen deine Schaltvorgänge ins Leere, weil die UART Funktionalität Vorrang hat, bewußt testen würde ich das aber nicht.

Das nächste Hauptproblem ist, wenn du alles verkabelt hast, eben auch Pin 0/1 und flashen willst, dann kann das mörderisch in die Hose gehen. Im einfachsten Fall meldet die IDE einen Timeout Fehler, im dümmsten Fall wird Müll geflasht, damit ist der Arduino reif für die Tonne. Kann man mit normalen Mitteln nicht mehr retten. Nur mit zusätzlichen Programmer.

Das bedeutet, man lässt die Pins 0/1 immer in Ruhe, außer man weiß genau was man tut. Die einfachste Regel, vorm flashen externe Beschaltung von Pin 0/1 abziehen. Nur wer denkt immer daran? Das ist das Problem. Darum.