Schulprojekt hilfe

Hallo ich habe eine eigentlich Simple Aufgabe für die Schule bekommen
Zwei LEDs welche abwechselnd blinken zu lassen, mit einem Schalter ein und aus zu Schalten und mit einem zweiten die Frequenz zwischen 1Hz und 2 Hz umzuschalten.
bei mir fängt immer nur die 2te LED an zu leuchten und ich finde meinen Fehler nicht
Hier der Code

// pins definieren
#define IN_Schalter1 4
#define IN_Schalter2 5
#define OUT_LED1 2
#define OUT_LED2 3


//Variablen
bool Schalter1;
bool Schalter2;

bool LED1;
bool LED2;

bool Takt;

void setup() 
{
// Ein und Ausgang Pins bestimmt
pinMode(IN_Schalter1, INPUT);
pinMode(IN_Schalter2, INPUT);
pinMode(OUT_LED1, OUTPUT);
pinMode(OUT_LED2, OUTPUT);

}

void loop()
 {
 Auslesen();
 Verarbeitung();
 Ausgeben();
}

void Auslesen(void) //Eingabe
{
  //Schalter auslesen
 Schalter1 = digitalRead(IN_Schalter1);
 Schalter2 = digitalRead(IN_Schalter2);
}

void Verarbeitung(void)
{
  //Verarbeitung des Programms
 if (Schalter1 == 1 )   // Einschalten
  {
  	if (Schalter2 == 1)  
    {
      LED1 = HIGH;    // 1Hz
      LED2 = LOW;	
      delay(1000);
      LED1 = LOW;
      LED2 = HIGH;
      delay(1000);
    }
    else 
    {
      LED1 = HIGH;    //2 Hz
      LED2 = LOW;	
      delay(500);
      LED1 = LOW;
      LED2 = HIGH;
      delay(500);

    }   
  }

  if (Schalter1 == LOW) // Ausschalten
  {
    LED1 = LOW;
    LED2 = LOW;
  }  




}
void Ausgeben(void)   //Ausgabe der Signale
{
digitalWrite(OUT_LED1,LED1);
digitalWrite(OUT_LED2,LED2);


}

bitte um Hilfe

Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.
Das kannst Du auch nachträglich ändern.

Gruß Tommy

Verwendest Du PullUp- oder PullDown-Widerstände?

Du solltest Dich für eine der Schreibweisen entscheiden. Außerdem solltest Du else nutzen.

der Sketch ist nicht vollständig

'Ausgeben' was not declared in this scope

Hallo
Nehme einfach das BWOD Beispiel aus dem IDE und löte eine zweite LED und zwei Schalter/Taster ein.

Da ist was schief gegangen, wie Du an der ersten Klammer nach dem delay(500) in Deinem Post erkennen kannst.
Gehe in Deinen ersten Post und editiere dieses.
Lösche den Code komplett.
Gehe in die IDE und dort auf BEARBEITEN - FÜR FORUM KOPIEREN - und dann kannst Du das einfach mit der rechten Maustaste ganz nohrmal einfügen.
Fertig....

ist jetzt vollständig
hab aber noch den Fehler

Du solltest das, was man Dir schreibt auch lesen und beherzigen. Sonst wird das nichts mit der Hilfe. Links sind ebenfalls dazu da, das zu lesen, worauf sie zeigen.

Gruß Tommy

PullDown

Willst Du unsere Hellseherischen Fäigkeiten schärfen?
Grüße Uwe

Das wird nix!
Du gibst Deinen LED-Status nicht aus, sondern überschreibst den sofort wieder mit Ablauf des delay()!

Aber bevor Du weitermachst, gehst Du bitte in Dein Arduino-Verzeichnis und dort in das Unterverzeichnis lib und editierst die Datei formatter.conf
An das Ende der Datei schreibst Du folgendes:

# Kill all lines within Braces and without Code 
delete-empty-lines

Speichern.
IDE beenden und neu starten.
Wenn der Code geladen ist, dann einmal STRG-T drücken.

Und wenn Du das gemacht hast, dann sieht der Code schick aus und Du kannst in den Beispielen das BLINK WITHOUT DELAY -Example mal anschauen.

Da siehst Du wie es blinkt ohne Einsatz von delay(),
Das musst Du dann für Deinen Zweck umarbeiten...

verwende konsequent selbsterklärende Variablennamen

// pins definieren
#define IN_SchalterAnAus 4
#define IN_Schalter1Hz_2Hz 5
#define OUT_LED1 2
#define OUT_LED2 3


//Variablen
byte SchalterAnAus;
byte Schalter1Hz_2Hz;

const byte _1Hz = HIGH;
const byte _2Hz = !_1Hz;

const byte eingeschaltet = HIGH;
const byte ausgeschaltet = !eingeschaltet;

const unsigned long Freq1Hz = 500;
const unsigned long Freq2Hz = 250;

unsigned long WarteZeit = Freq1Hz;

unsigned long BlinkTimer;

bool LED1;
bool LED2;


// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;
  }
  else return false;            // actual TimePeriod is NOT yet over
}


void setup() {
  // Ein und Ausgang Pins bestimmt
  pinMode(IN_SchalterAnAus, INPUT);
  pinMode(IN_Schalter1Hz_2Hz, INPUT);
  pinMode(OUT_LED1, OUTPUT);
  pinMode(OUT_LED2, OUTPUT);
  BlinkTimer = millis();
  LED1 = true;
  LED2 = !LED1; // setze LED2 auf den entgegengesetzen Zustand
}

void loop() {
  Auslesen();
  Verarbeitung();
  Ausgeben();
}

void Auslesen() {//Eingabe
  //Schalter auslesen
  SchalterAnAus   = digitalRead(IN_SchalterAnAus);
  Schalter1Hz_2Hz = digitalRead(IN_Schalter1Hz_2Hz);
}


void Verarbeitung() {
  if (Schalter1Hz_2Hz == _1Hz) {
    WarteZeit = Freq1Hz;
  }
  else {
    WarteZeit = Freq2Hz;
  }
  
  if ( SchalterAnAus == eingeschaltet ) {
    // wenn eingeschaltet dann blinke
    if ( TimePeriodIsOver(BlinkTimer, WarteZeit) ) { // prüfe ob Wartezeit vorbei ist  
      // wenn WarteZeit WIRKLICH vorbei ist
      LEDsUmschalten();
    }
  }
  else { // es ist ausgeschaltet also LEDs ausschalten
    digitalWrite(OUT_LED1, ausgeschaltet);
    digitalWrite(OUT_LED2, ausgeschaltet);
  }
}

void LEDsUmschalten() {
  LED1 = !LED1; // invertiere Schaltzustand von LED1
  LED2 = !LED1; // weise LED2 den gegenüber LED1 frisch invertierten Zustand zu
  // Beispiel LED1 sei false
  // LED1 = !LED1 danach ist LED1 true
  // LED2 = !LED1 danach ist LED2 false
  // beim nächsten Durchlauf
  // ist LED1 true
  // LED1 = !LED1 danach ist LED1 false
  // LED2 = !LED1 danach ist LED2 true
  // dann wiederholt sich alles
}


void Ausgeben() {   //Ausgabe der Signale
  digitalWrite(OUT_LED1, LED1);
  digitalWrite(OUT_LED2, LED2);
}

Eigentlich wurde mir ja auch immer vorgeworfen, vollständige Codes für Schulprojekte sind kontraproduktiv. Aber nachdem nun einer da ist, habe ich mich mal genau an dem Original orientiert.
Das wäre dann der folgende Code. Geht sogar mit delay().
Das ist die Fassung, die ich jetzt aktiviert habe.
Damit Du siehst, das das kontraproduktiv ist, kannst Du die Zeiten fürs blinken mal verlängern und dann den Schalter 1 aus machen.
Wenn Du Pech hast, dann wartest Du eine komplette Blinkfrequenz, bis die LED OFF gehen.

Die Ausgabe habe ich noch ein zweites Mal gebaut, um zu zeigen, das die Betätigung des Schalters 1 auch während einer einzigen Leucht- oder Pausenphase sofort zum Ende des blinkens führt.

Du musst also den aktiven Funktionsblock auskommentieren und dann den anderen einkommentieren....
Natürlich habe ich mich an Deinen Variablen orientiert - obwohl es mir widerstrebt :wink: - aber es ist ja ein Projekt....

// Forensketch Wechselblinker mit zwei Blinkfrequenzen
// Basiert auf https://forum.arduino.cc/t/schulprojekt-hilfe/1053172
// aufgrund der Ausgangslage Vorgaben nicht verändert!
/*
   Was der Code machen soll:
   Je nach Schalterstellung1 Blinken oder nicht
   Je nach Schalterstellung2 Blinkfrequenz mit 1Hz oder 2Hz
   1HZ = 1Takt/Sekunde sind 1Takt/1000ms
   2Hz = 2Takte/Sekunde sind 1Takt/500ms
   Es gibt zwei unterschiedliche Ausgabevarianten die das selbe machen
*/
// pins definieren
#define IN_Schalter1 4
#define IN_Schalter2 5
#define OUT_LED1 2
#define OUT_LED2 13


//Variablen
bool Schalter1;
bool Schalter2;

bool LED1;
bool LED2;

unsigned int Takt;
unsigned long lastBlink;

void setup()
{
  // Ein und Ausgang Pins bestimmt
  pinMode(IN_Schalter1, INPUT);
  pinMode(IN_Schalter2, INPUT);
  pinMode(OUT_LED1, OUTPUT);
  pinMode(OUT_LED2, OUTPUT);
}

void loop()
{
  Auslesen();
  Verarbeitung();
  Ausgeben();
}

void Auslesen(void) //Eingabe
{
  //Schalter auslesen
  Schalter1 = digitalRead(IN_Schalter1);
  Schalter2 = digitalRead(IN_Schalter2);
}

void Verarbeitung(void)
{
  //Verarbeitung des Programms
  if (Schalter1 == LOW) // Ausschalten
  {
    Takt = 0;
  }
  else   // Einschalten
  {
    if (Schalter2 == HIGH)
    {
      Takt = 500;  // Vorgabe für 2Hz
    }
    else
    {
      Takt = 1000; // Vorgabe für 1Hz
    }
  }
}

// Die folgende Variante ist vermutlich der Schulstoff
void Ausgeben(void)
{
  if (Takt == 0)
  {
    digitalWrite(OUT_LED1, LOW);
    digitalWrite(OUT_LED2, LOW);
  }
  else
  {
    digitalWrite(OUT_LED1, LOW);
    digitalWrite(OUT_LED2, HIGH);
    delay(Takt);
    digitalWrite(OUT_LED1, HIGH);
    digitalWrite(OUT_LED2, LOW);
    delay(Takt);
  }
}
/*
  // Diese Variante ist blockadefrei und technisch zu bevorzugen
  void Ausgeben(void)   //Ausgabe der Signale
  {
  if (Takt == 0)
  {
    digitalWrite(OUT_LED1, LOW);
    digitalWrite(OUT_LED2, LOW);
  }
  else if (millis() - lastBlink > Takt)
  {
    digitalWrite(OUT_LED1, !digitalRead(OUT_LED1));
    digitalWrite(OUT_LED2, !digitalRead(OUT_LED1));
    lastBlink = millis();
  }
  }
*/

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