Programmierungsfrage

Hi liebe Community,
ich baue mir zurzeit ein Overheadpanel für meinen Flugsimulator als Home Cockpit.

Ich beschreibe mal das Problem:
Wenn ich einen Rastschalter gedrückt habe geht eine blaue LED an. Ein zweiter Taster darf eine zweite blaue LED als Folgeschaltung erst anschalten, wenn der Rastschalter an ist. Diese zweite blaue LED soll nun ausgehen, wenn der Rastschalter wieder ausgeschaltet wird oder eine Zeit on 50 sec abgelaufen ist und NUR wenn 50 sec abgelaufen sind, soll eine dritte grüne LED angehen, die wieder über den Rastschalter auszuschalten geht.

Das habe ich bisher geschafft :sweat_smile: :

int ledPin1 = 22;
int RastschalterPin1 = 23;
int ledPin2 = 24;
int tasterPin2 = 25;

void setup(){
 pinMode(ledPin1,OUTPUT);
 pinMode(RastschalterPin1,INPUT);
 pinMode(ledPin2,OUTPUT);
 pinMode(tasterPin2,INPUT);
}

void loop(){
if (digitalRead(RastschalterPin1)==LOW){ //hier wird die erste LED angeschlaten
   digitalWrite(ledPin1, HIGH);
 } else {
   digitalWrite(ledPin1, LOW);
 }
// das ist die Folgeschaltung:
 if ((digitalRead(tasterPin2)==LOW) && (digitalRead(RastschalterPin1)==LOW)){
   digitalWrite(ledPin2, HIGH);
 }
 if (digitalRead(RastschalterPin1)==HIGH) { //und hier wird die zweite Blaue ausgeschalten
   digitalWrite(ledPin2, LOW);
 }
 }

Bisher ist da nur die Folgeschaltung eingebaut...allerdings komm ich nicht weiter :frowning:

Ich danke für jede Hilfe!

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Den Code bitte so, wie er ist und nicht irgendwelche Aussagen, wir sollten uns etwas dazu-/umdenken. Das geht schief.

Gruß Tommy

Hunter_345:
Ignoriert beim digital read das LOW! Stellt euch vor da würde HIGH stehen. Grund ist ein Schaltungsinterner Aufbau der nicht anders zu bewerkstelligen geht.

?? Was ist damit gemeint?. Zeige uns lieber deinen Aufbau (Schaltung), dann kann man das interpretieren.
Leider sehe ich auch keinen Zusammenhang zwischen deiner verbalen Beschreibung und deinem Programm. Was ist der Rastschalter, was der Taster ( und der 2. Rastschalter? ). Benenne doch einfach die Dinge auch im Programm so, wie Du sie verbal beschreibst. Dann erkennt man auch was was ist.
Außerdem bietet die Programmiersprache C++ ein paar 'Zauberzeichen' die das Verständinis eine Programmes wesentlich erleichtern: '//' und /.../ :slight_smile:
Gewöhne dir von Anfang an an, deine Programme ordentlich zu kommentieren. ( Aber nicht die Syntax kommentieren :wink: , sondern was die entsprechenden Zeilen in deiner Schaltung bewirken sollen )

Ok ich habs hoffentlich jetzt so formatiert, dass es verständlich ist. Ich habe die dritte grüne LED noch nicht im Programm drin da ich ja noch nicht weiß wie ich die einsetzen soll. Ansonsten ist die Aufgabe eigentlich gut formuliert :sweat_smile: :astonished:

Hi

Mich stören in der Beschreibung die zwei Tast-Rast-Schalter.
Die werden doch irgend einen Namen haben oder eine bestimmte Funktion ausführen?
Klar können wir sämtliche Taster/Schalter/Sensoren stur durchnummerieren, leserlicher wird’s dabei aber nicht.

ledpin1 … sagt was aus? Dahinter wäre ein Kommentar, was die LED an diesem Pin macht/soll, sehr sinnvoll.
Da die Tester/LEDs wohl an irgend welchen ‘Beinchen’ des Arduino hängen und der Arduino weniger als 256 Beine hat, reicht Dir für die Definition statt int (-16367 … 16368) byte (0 … 255).
Wenn Du Das dann noch als const deklarierst (Konstante, ändert sich NIE wieder), kann der Compiler diese Werte direkt im Code einbauen - spart Platz.
(bei const-Variablen ist der Typ daher mehr oder minder egal, da der Compiler Die eh fest im Code einbaut … wenn Er kann)

Bitte umschreibe noch Mal, wie der Ablauf der beiden Tast-Rast-Schalter ist und was Diese bewirken - gerne mit sprechenden Bezeichungen.

MfG

Ich mache mal einen Vorschlag:

const byte ledPin1 = 22;
const byte ledPin2 = 24;
const byte ledPin3 = 26;
const uint32_t ablaufIntervall = 5000;
uint32_t aktMillis, ablaufMillis;

struct Prell
{
    Prell(const byte tasterPin): tasterPin(tasterPin), altMillis(0), aktStatus(0), altStatus(0) {}
    void init()
    {
      pinMode(tasterPin, INPUT_PULLUP);
    }
    void run()
    {
      altStatus = aktStatus;
      if (aktMillis - altMillis >= 30) {
        aktStatus = digitalRead(tasterPin);
        if (aktStatus != altStatus) {
          altMillis = aktMillis;
        }
      }
    }
    const byte tasterPin;
    uint32_t altMillis;
    bool aktStatus, altStatus;
};

Prell kanal[]
{ // {tasterPin}
  {23},  // RastschalterPin
  {25},  // TasterPin
};

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  for (Prell &k : kanal) k.init();
}

void loop() {
  aktMillis = millis();
  for (Prell &k : kanal) k.run();
  if (!kanal[0].aktStatus && kanal[0].altStatus) {
    digitalWrite(ledPin1, HIGH);
  }
  if (!kanal[1].aktStatus && kanal[1].altStatus) {
    digitalWrite(ledPin2, HIGH);
    ablaufMillis = aktMillis;
  }
  if ((aktMillis - ablaufMillis >= ablaufIntervall) && !kanal[1].aktStatus) {
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
  }
  if (kanal[0].aktStatus && !kanal[0].altStatus) {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
  }
}