Brauche Hilfe

Hi Leute
ich brauche eure Hilfe
und zwar habe ich einen Übungsauftrag erhalten in dem steht, dass ich einen Sensor an ein Tor befestigen soll der die Tore erfasst
dieser Sesor darf allerding nur dann ein Tor zählen wenn dieser von einem Taster freigegben wird

dies sieht folgendermaßen aus
tasterpinfreischalten

sensorpin

tasterpinfreischalten

außerdem muss ich einen Timer einsetzten der 5minuten runterzählt
und um dies nocheinmal zu erschweren darf dieser Timer nur zwischen tasterpinfreischalten und sensorpin runterzählen

.bin übrigens im 2.Lehrjahr zum Mechatroniker und habe mich privat dazu entschlossen etwas mit Minicontroller zu beschäftigen
und habe daher keinerlei Vorkenntnisse aus irgendwelchen Kursen oder sonstigens Lehrgängen

Gruss Kevin Müller

int tasterpin = 8;
int tasterwert = 0;
int vorhertasterwert = 0;
int led0 = 2;
int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int zaehler = 0;

void setup(){
  pinMode (tasterpin, INPUT);
  pinMode (led0, OUTPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);
  pinMode (led4, OUTPUT);
        
}
void loop(){
  tasterwert = digitalRead(tasterpin);
  
  if(vorhertasterwert != tasterwert){
    delay(10);
    if(tasterwert == HIGH){
      zaehler++;
    }
  }
  
  vorhertasterwert = tasterwert;
  
  if(zaehler>5) zaehler = 0;{
   digitalWrite(led0, LOW);
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
  }
  if(zaehler == 1){
   digitalWrite (led0, HIGH);
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
  }
  if(zaehler == 2){
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
  }
  if(zaehler == 3){
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite (led2, HIGH);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
  }
   
  if(zaehler == 4){
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite (led2, HIGH);
   digitalWrite (led3, HIGH);
   digitalWrite(led4, LOW);
  }  
  if(zaehler == 5){
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite (led2, HIGH);
   digitalWrite (led3, HIGH);
   digitalWrite (led4, HIGH);
  }
  
 }

Willkommen im Forum!

KevinnMuellerr:
außerdem muss ich einen Timer einsetzten der 5minuten runterzählt
und um dies nocheinmal zu erschweren darf dieser Timer nur zwischen tasterpinfreischalten und sensorpin runterzählen

Das wichtigste mit dem Timer nennst Du zuletzt.

Lesen und verstehen der Aufgabe ist bei Textaufgaben immer wichtig.

Wenn Du Deine ganzen Anforderungen mal berücksichtigst, dann siehst Du, dass es am Ende das bedeutet:

  • Timer läuft ==> Tore sollen gezählt werden
  • Timer steht ==> Tore sollen nicht gezählt werden

Die Logik, die Du in Code nachbilden mußt, sieht also so aus, wenn ich es richtig verstanden habe:

  1. Bei Programmstart Anfangswerte setzen: Timer auf 5:00 Minuten, LEDs aus, Timer ist angehalten
  2. Wenn Freigabetaste gedrückt wird: Timer starten
  3. Wenn Timer angehalten ist, weiter mit 2.
  4. Wenn ein Tor fällt ==> Tor zählen, eine LED mehr einschalten und Timer anhalten
  5. Wenn Timer angehalten ist, weiter mit 2.
  6. Wenn bei laufendem Timer Zeit vergangen ist, Zeit von den 5:00 Minuten abziehen bis 0 erreicht
  7. Bei Erreichen von 0 auf dem Timer ==> Programmende (bis zum nächsten Reset)

Punkt 1. gehört in die setup() Funktion.
Die Punkte 2. bis 7. in die loop().

Das Setzen der LEDs läßt sich natürlich eleganter und mit weniger Code machen als in Deinem Codebeispiel.

Hi
danke erstmal für die schnelle Antwort und der übersichtlichen Erklärung der Aufgabe
allerding weiß ich immernoch nicht wie ein Timer programmiert wird und ich diesen Freischalter in das Programm einbaue

-kannst du mir das vllt kurz erklären oder auf eine ausführliche Erklärung hinweißen die ich im i-net finde?

du hast erwähnt dass man das mit den Led´s kürzer bzw eleganter schreiben kann
-und wie?

Danke!

KevinnMuellerr:
allerding weiß ich immernoch nicht wie ein Timer programmiert wird

Den eigentlichen Hardware-Timer brauchst Du nicht programmieren, der wird über die Funktion “millis()” schon von der Arduino-Software bereitgestellt, d.h. Du brauchst den Timer eigentlich nur mit der millis() Funktion abfragen.

Dieser Timer zählt (so gut wie) im Millisekundentakt hoch, also genau auf ca. 1 bis 2 tausendstel Sekunden, das sollte als Genauigkeit reichen, oder?

Den Stand des Timers kannst Du jederzeit im Programm an eine “unsigned long” Variable zuweisen:
unsigned long milliCount=millis();

Und wieviel Zeit seit der letzten Zuweisung vergangen ist, kannst Du später über eine Differenzbildung ermitteln:
unsigned long milliDifferenz= millis()-milliCount;

Und auftretende Zeitdifferenzen ziehst Du dann vom Anfangsstand ab, den Du dazu am besten auch im Millisekunden zählst. Also 5 Minuten sind 5*60=300 Sekunden = 300000 Millisekunden.insgesamt sind zu zählen, bis die Zeit abgelaufen ist.

KevinnMuellerr:
du hast erwähnt dass man das mit den Led´s kürzer bzw eleganter schreiben kann
-und wie?

Am elegantesten in einer Schleife, wenn die Button-Pins nicht einzeln deklariert sind, sondern in einem Array:

Für Testcode, bei dem ich zum Testen überhaupt keine LEDs benötige, würde ich schreiben:

byte leds[]={2,3,4,5,6}; // Byte-Array mit den LED-Pins

void showLEDs(byte anzahl)
{
  for (int i=0;i<sizeof(leds);i++) // Alle LEDs nacheinander abarbeiten
  {
    if (anzahl>i)
    {
      digitalWrite(leds[i],HIGH);
      Serial.print("1");
    }
    else  
    {
      digitalWrite(leds[i],LOW);
      Serial.print("0");
    }
  }
  Serial.println();
}

Dann werden einerseits alle LED-Pins in einer Schleife gesetzt und andererseits erscheint als Ausgabe der LED-Status auch auf dem seriellen Monitor. Wie gesagt, zum Testen von Code brauche ich dann gar keine LEDs, weil ich auf dem seriellen Monitor sehe, wie die fünf LEDs mit ihrem aktuellen Status “0” oder “1” angezeigt werden.

Boah :fearful:

ich glaube ich lass die weniger elegantere version erst einmal die array variante ist mir noch zu anspruchsvoll
genauso wie die millis funktion

ich würde eigentlich gerne die Sekunden auf 3 siebensegment Anzeigen runterzählen lassen
kannst du mir möglicherweiße eine Art Muster zeigen welches ich dann anschließend in mein programm übertragen kann

wär super toll von dir- habe nur noch bis Freitag den 18.10. Zeit diese Aufgabe zu lösen weil ich dieses Programm Samstag an einem Kickertunier brauche

gruss Kevin

KevinnMuellerr:
ich würde eigentlich gerne die Sekunden auf 3 siebensegment Anzeigen runterzählen lassen
kannst du mir möglicherweiße eine Art Muster zeigen welches ich dann anschließend in mein programm übertragen kann

Nein, das könnte ich nicht. Denn soll ich Dir mal was verraten:
Ich habe noch nie etwas mit Arduino und Siebensegmentanzeigen gebastelt.

Wenn ich was anzuzeigen habe, dann verwende ich eigentlich immer 1602 LCD-Displays.

KevinnMuellerr:
habe nur noch bis Freitag den 18.10. Zeit diese Aufgabe zu lösen weil ich dieses Programm Samstag an einem Kickertunier brauche

Oh, oh. Am besten schon mal eine Handstoppuhr für das Turnier heraussuchen ...

KevinnMuellerr:
ich glaube ich lass die weniger elegantere version erst einmal die array variante ist mir noch zu anspruchsvoll
genauso wie die millis funktion

Das mit den Arrays verstehe ich, das ist für Anfänger schwierig zu verstehen.
Aber an den millis() kommst du nicht vorbei, ohne geht es nicht.

Aber das ist nichts anderes als immer wieder auf die Uhr schauen.
Bei Start: Auf die Uhr schauen, ausrechnen, wann die 5min um sind und merken:

if(Startbutton){Startzeit = millis();
Stoppzeit = Startzeit  +300000   //5min *60 sec * 1000ms
}

dann prüfen, ob ein Tor gefallen ist:

if(Torsensor){                               //wenn der Torsensor ein gefallenes Tor anzeigt
  if (millis()<Stoppzeit){                       // auf die Uhr schauen, ob noch in der Spielzeit
      Torzaehler = Torzaehler +1;           // dann Torzähler hochzählen
  }
}

Schau dir mal das Beispiel “BlinkWithoutDelay” an, das mit dem Arduino mitgeliefert wird, dann wirst du es verstehen.

Mit der Sieben-Segment-Anzeige kommt es stark darauf an, wie das aufgebaut ist. Gemeinsame Anode, gemeinsame Kathode, Mulitplexing, etc.

Dafür gibt es aber Code und Anleitungen im Internet.