Frage zu einem Projekt

Moin, ich bin sehr neu im Thema Arduino und stehe vor einem Problem, also ich möchte zwei Lampen mit zwei Schalter Steuern. Dabei soll bei Drücken von Schalter Eins Lampe 1 angehen, Lampe 2 soll aber nur angehen, wenn beide gleichzeitig gedrückt werden. Ich habe das auch schon grob hinbekommen Problem ist nur, das man Schalter Zwei immer kurz vorher drücken muss, wenn man nämlich gleich bzw. zuerst Schalter Eins und dann Zwei drückt, bleibt man wie in der If abfrage für Lampe eins hängen und Lampe 2 geht nicht an, obwohl man beides drückt. Ich habe auch schon versucht das mit einem Timer oder so zu lösen, aber das funktioniert auch nicht. Bei dem Code, den ich hochgeladen hat funktioniert es manchmal aber manchmal auch nicht, vielleicht gibt es ja einen besseren weg, danke schonmal im Voraus.

 void setup() {
  Serial.begin(9600);
  pinMode(TasteEins, INPUT);
  pinMode(TasteZwei, INPUT);
  pinMode(Lampe1, OUTPUT);
  pinMode(Lampe2, OUTPUT);
}

void loop() {
   if (SchalterEins == 0) Timer1 = 3;         //Zurücksetzten von Timer1
   SchalterEins = digitalRead(TasteEins);
   SchalterZwei = digitalRead(TasteZwei);

if (SchalterEins == 1 && SchalterZwei == 1) {                    //if abfrage für Lampe 1
  digitalWrite(Lampe1, 1);
} else {
  digitalWrite(Lampe1, 0);
}

if (SchalterEins == 1 && SchalterZwei == 0) {                   //if abfrage für Lampe 2
  Timer1 --;
  delay(1000);
  if (SchalterEins == 1 && SchalterZwei == 0 && Timer1 == 0) {
    digitalWrite(Lampe2 ,1);
  }
}else {
  digitalWrite(Lampe2 ,0);
 }
}

Setz mal die Abfrage nach Schalter1 und Schalter2, also

if (SchalterEins == 1 && SchalterZwei == 1)

als erstes in die Liste. Gehts dann?

Du wirst um die Grundlagen nicht drumrum kommen.

Moin. Ich bin zwar kein Profi, aber vielleicht kann ich dir helfen.

Erst einmal was mir nicht gefällt:

  • Du hast einen neuen Thread aufgemacht, obwohl es eigentlich inhaltlich eher das gleiche behandelt, wie dein alter Thread.
  • Dein Code ist nicht komplett. Ich kann ihn so nicht kopieren, in die IDE einfügen und kompilieren um eventuelle Fehler zu finden. Bitte immer den Code Posten der sich kompilieren lässt und dein Problem zeigt.
  • Deine Blöcke sind im Code nicht ordentlich eingerückt. Somit ist schwer zu erkennen welcher Block noch auf ist, und somit schwer die Logik, die du aufgebaut hast, nachvollziehbar. Ein Tipp dazu. Drücke in der Arduino IDE mal STRG+T. Dann übernimmt die Arduino IDE die Einrückung. Ein Block ist immer der Inhalt zwischen geschweiften Klammern { }

Ist dir bewusst, das der Code, nur Zeile für Zeile ausgeführt werden kann? Es können nie Gleichzeitig mehrere Zeilen ausgeführt werden. Es gibt kein Multitasking (Zumindest auf den meisten µC)
Ein Delay hält deinen Programm für eine Sekunde an. Dein delay(1000); lässt dein Programm anhalten, und somit kann es nichts anderes mehr machen. Es lassen sich keine Taster abfragen, keine LEDs ansteuern.
Da das Programm immer Zeile für Zeile ausgeführt wird, kannst du nur Anweisungen geben, welche Zeile die nächste sein soll, wenn du den Programmablauf ändern willst. Das erreichst du, in dem du schaust ob Bedingungen erfüllt bzw. nicht erfüllt sind, und dem entsprechend Zeilen ausführst.
Als Beispiel:

if(a==b) {
  a = a + b;
}

Der Block {} mit der Zeile a = a + b wird nur ausgeführt, wenn a gleich b ist. Wenn dies nicht der Fall ist, geht es nach dem Block {} weiter. Du beeinflusst den Ablauf, der sonnst Zeile für Zeile ausgeführt wird, damit, dass bei nicht Erfüllung der Abfrage, die Zeile a=a+b übersprungen wird.
Erst beim erreichen vom Ende des Loops, beginnt dein Code wieder am Anfang vom Loop. Und dann wieder Zeile für Zeile usw. Gleichzeitig/Paralell kann nichts ausgeführt werden.

Zu deiner Aufgabe, LED 1 leuchtet nur bei Tasterdruck von Taster1 und LED 2 leuchtet nur bei Tasterdruck von Taster 1 und Taster2. Schau mal ob dir folgendes hilft:

//Anschlüsse der Hardware an Pin
const byte tasterPin1 = 2;
const byte tasterPin2 = 3;
const byte led1       = 4;
const byte led2       = 5;

void setup() {
  pinMode(tasterPin1, INPUT); // Externer PullDown nötig
  pinMode(tasterPin2, INPUT); // Externer PullDown nötig
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  if (digitalRead(tasterPin1) == HIGH) {
    digitalWrite(led1, HIGH);
    if (digitalRead(tasterPin2) == HIGH) {
      digitalWrite(led2, HIGH);
    }
    else {
      digitalWrite(led2, LOW);
    }
  }
  else {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
  }
}

Ich würde die Taster nicht auf Status ( 0 oder 1) sondern auf Statusänderung ( 0-1 oder 1-0) abfragen und dann die Zeit merken.
Wird der Taster1 gedrückt und der zweite nicht innerhalb sagen wir 200-300mS wird das als Einzeldruck des Tasters 1 gewertet.
Wird innerhalb der 500mS auch der Taster 2 gedrückt dann ist das ein Doppeldruck.
Um das zu programmieren mußt Du millis() verstanden haben.
Grüße Uwe

Ne habe ich auch gedacht aber bringt nix

Das hört sich gut an ich versuche das mal danke :grinning:

Das mit dem Thread wusste ich nicht sry, kenn mich noch nicht so aus aber achte das nächste mal drauf. Danke für den Code probiere ich morgen direkt mal aus :+1:t3:

Hallo niklas1
Hier kommt ein Beispielsketch.
Du mußt nur noch die Pins für die Schalter und Lampen anpassen.

/* BLOCK COMMENT
  ATTENTION: This Sketch contains elements of C++.
  https://www.learncpp.com/cpp-tutorial/
  https://forum.arduino.cc/t/frage-zu-einem-projekt/953055
   ich möchte zwei Lampen mit zwei Schalter Steuern. Dabei soll bei Drücken von Schalter Eins Lampe 1 angehen,    
   Lampe 2 soll aber nur angehen, wenn beide gleichzeitig gedrückt werden
*/
#define ProjectName "Frage zu einem Projekt"
// HARDWARE AND TIMER SETTINGS
// YOU MAY NEED TO CHANGE THESE CONSTANTS TO YOUR HARDWARE AND NEEDS
constexpr byte SchalterPins []{A0,A1};      // portPin o---|button|---GND
constexpr byte LampenPins[] {9,10};         // portPin o---|220|---|LED|---GND
#define OutPutTest
constexpr  unsigned long OutPutTestTime {1000}; 
enum {One, Two};
// -------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  Serial.println(F("."));
  Serial.print(F("File   : ")), Serial.println(__FILE__);
  Serial.print(F("Date   : ")), Serial.println(__DATE__);
  Serial.print(F("Project: ")), Serial.println(ProjectName);
  pinMode (LED_BUILTIN, OUTPUT);  // used as heartbeat indicator
  //  https://www.learncpp.com/cpp-tutorial/for-each-loops/
  for (auto SchalterPin : SchalterPins) pinMode(SchalterPin, INPUT_PULLUP);
  for (auto Output : LampenPins) pinMode(Output, OUTPUT);
  #ifdef OutPutTest
  // check outputs
  for (auto LampenPin : LampenPins) digitalWrite(LampenPin, HIGH), delay(OutPutTestTime);
  for (auto LampenPin : LampenPins) digitalWrite(LampenPin, LOW), delay(OutPutTestTime);
  #endif
}
void loop () {
  unsigned long currentTime = millis();
  digitalWrite(LED_BUILTIN, (currentTime / 500) % 2);
  // debouncing
  delay (20);
  digitalWrite(LampenPins[One],!digitalRead(SchalterPins[One]));
  digitalWrite(LampenPins[Two],!digitalRead(SchalterPins[One]) && !digitalRead(SchalterPins[Two]));
}

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Hey sry für die Späte Antwort hatte die Nachricht übersehen vielen dank :slight_smile:

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