Wie komme ich aus 'ner Schleife raus?

Hallo Arduino Gemeinde,

Ich bin einer von insgesamt sechs Lach(f)alten, einer entstehenden Altenwohngemeinschaft.
Wir sind im Besitz von zwei funktionierenden Flipperautomaten, die unser zukünftiges Wohnzimmer und den Raucherraum (Ja, wir Rauchen...!) verschönern sollen.

Die alten Daddelkisten ziehen einen aber derart in ihren Bann, dass wir auf die Idee gekommen sind, selbst einen zu bauen. Wir machen das Ganze in modularer Bauweise, da ansonsten das Projekt allein von der Komplexität her, von vornherein zum Scheitern verurteilt wäre(siehe viele andere Flipper Selbstbau Posts).

Im Moment geht es um ein sogenanntes Droptarget.
Wer schonmal geflippert hat, weiß vermutlich schon vom Namen her wie es funktioniert.
Unser Droptarget besteht aus acht rechteckigen Trefferscheiben, die wenn sie getroffen wurden, in die Spielfläche versenkt werden. Das Zählwerk addiert jedes mal einen entsprechenden Wert auf.
Nach der Spielrunde stellt ein starker Hubmagnet die Targets wieder auf.

Bei unserem Selbstbau fallen die Targets jeweils in eine Gabellichtschranke die ein TTL Signal ausgibt.
Jedes Target soll jetzt a) eine dazugehörende Spielfeldlampe dauerhaft einschalten (ledPin1 bis 8)
b) einen kurzen Zählimpuls ausgeben (erstmal noch nicht definiert)
c) ein Audioboard triggern (audiopin1)
Sind alle Targets getroffen soll das letzte Target einen zweiten (anderen)Audiojingle triggern und mit einer Zeitverzögerung den Resetmagneten ansteuern. Jetzt gehen die Spielfeldleuchten aus. Das Spiel beginnt von vorn...
Das Ganze (also nur das Droptarget!) wird über einen Nano gesteuert.

Die Platine ist fertig und die Lichtschranken funktionieren, nur mit dem Sketch klemmt's.
Wir sind absolute Neulinge was Arduinos und Co. angeht, vielleicht könnt ihr uns weiterhelfen.

void setup() {
 pinMode (ledPin1, OUTPUT);  
 pinMode (audioPin1, Output);      
 pinMode (lichtschrankePin1, INPUT);
  
 }

void loop() {

  lichtschrankeStatus1 = digitalRead(lichtschrankePin1);
  
if(lichtschrankeStatus1 == HIGH)
   digitalWrite(ledPin1, HIGH);
   
  
else
  digitalWrite(ledPin1, LOW);
}

So werden die Lichtschranken (hier nur eine!) ausgelesen und die Spielfeldlampen eingeschaltet, also ganz simpel.
Füge ich jetzt hier meinen audioPin1 mit anschliessendem Delay(500) in die Schleife, so wird mein Sound ständig getriggert, weil diese ja immer wieder durchlaufen wird.
Wie stellen ich es es an, dass bei Betätigung der Lichtschranke der audioPin1 nur einmal getriggert wird?

Gruß,
Die Lach(f)alten

hi, und willkommen im forum.

zuallererst: habt Ihr noch 'nen platz frei? scheint lustig zu sein bei Euch...

zum problem: Ihr müßt bei veränderung triggern.
also wenn alter (gemerkter) status LOW ist und aktueller status HIGH, dann triggern und gemerkten status auf HIGH.

gruß stefan

du merkst dir in einer Variablen, wenn getriggert wird. und beim triggern fragst du ab, ob nicht getriggert ist.

delay darf in eurem Sketch nicht benutzt werden.

Basics lernen

Ich möchte mich Eisebaer in allen Punkten anschließen :slight_smile:

Für die Programmstruktur bietet sich ein Automat (state machine) an (bitte nachschlagen), der von jeder Änderung auf dem Spielfeld in einen neuen Zustand geschaltet werden kann. Ein Zustand kann auch zeitabhängig gewechselt werden, z.B. von Play_Sound zurück auf Stumm. Damit lassen sich alle Delays ersetzen, die sonst den ganzen Ablauf durcheinanderbringen. Im fertigen Programm werkeln meist mehrere solcher Automaten parallel, z.B. einer für die Tonausgabe, den Punktezähler, die Flipper-Tasten, und je einer für die (Gruppen von) Targets. Dafür packt man am besten jede Funktionsgruppe (Automaten) in ein Unterprogramm, und ruft diese der Reihe nach in loop() auf. So läßt sich alles schön übersichtlich testen, und neue Funktionsgruppen einfach hinzufügen.

Ich erinnere mich noch an einen Blick in einen geöffneten Flipper, in dem jede Menge Schalter und Relais Funken geschlagen haben. Das wird bei eurem Neubau hoffentlich nicht der Fall sein, da sonst die Elektronik in Gefahr ist und das Programm jederzeit abstürzen kann. Störungen von den Hubmagneten und anderen induktiven Lasten werden auch gerne von den Sensor-Leitungen eingefangen, die sollten alle mit Filtern (mindestens Schutzwiderstand, besser RC Glieder) abgesichert werden.

Dankeschön, werde mal etwas mit endlichen Automaten rumexperimentieren, bzw. die Dinger erstmal kennenlernen. Wenn ich nich' weiterkomme schlag' ich wieder hier im Forum auf.

@Eisbaer: Unser WG Vorhaben wird stets bestaunt, die beiden alten Flipper auch.
Ich hoffe, unser Vorhaben geht nicht in die Hose. Es stecken Jahre der Planung, in Form von gemeinsammen Kneipenbesuchen und richtungsweisenden Diskussionen (dort) in diesem Projekt. Wir haben extrem viel geredet (und rumgesponnen) bevor der erste Stift in die Hand genommen wurde.
Das Haus ist jetzt gekauft (letzten Donnerstag) und es gibt keinen Rückwärtsgang mehr, das heißt für uns alle (drei Paare): "Raus aus der Komfortzone! Jetzt werden wir miteinander alt."
Fühlt sich an wie nochmal Heiraten :wink:

Bis bald,
Torsten (Lach(f)alte)

hi,

drei paare? ich dachte, eine männergemeinschaft...

tut mir leid, das sagen zu müssen, aber das funktioniert nicht. es gibt keine tabletten gegen stutenbissigkeit (naja, schon, aber dann beißen sie nie wieder, und es ist illegal).

wenn Ihr drei an solchen spielereien mit arduinos interessiert seid, werden wir uns noch lange hier sehen und Du kannst ja dann Euer leid klagen...

mit tiefem bedauern,
stefan

ja, und die endlichen automaten: da gibt es viele hochkomplizierte beschreibungen, aber eigentlich heißt das nur:

es gibt eine begrenzte anzahl von möglichen zustanden.
es gibt eine begrenzte anzahl von triggern.
also kann man genau festlegen, was bei einem bestimmten zustand passiert, wenn ein bestimmter trigger zuschlägt.
darum endlich, weil es eben nicht unendlich viele möglichkeiten gibt.

Unsere Frauen sind quasi Männer, nur sehen sie besser aus!

@DrDiettrich: wenn das mit den Magneten problematisch werden sollte, gehts auch mit 'nem Servo, allerdings funktioniert das nicht bei den Flippern, Slingshots und Bumpern, die arbeiten aber in einem getrennten Stromkreis und wenn möglich kontaktlos. Ich hoffe ich muß nicht noch abschirmen.

Gruß,
Torsten

Eisebaer:
... aber das funktioniert nicht.

Wie bin ich doch froh, mich in meiner Freizeit nicht mit seelischen Konflikten beschäftigen zu müssen. Nur digital an/aus finde ich schon kompliziert genug :o Ich drücke die Daumen für jedwede WG :slight_smile:

Ein Vorschlag zur Flankenerkennung:

const byte lichtschrankePin1 = 2;
const byte ledPin1 = 13;
bool aktLichtschrankeStatus1, altLichtschrankeStatus1;

void setup() {
  pinMode (ledPin1, OUTPUT);
  pinMode (lichtschrankePin1, INPUT_PULLUP);
}

void loop() {
  altLichtschrankeStatus1 = aktLichtschrankeStatus1;
  aktLichtschrankeStatus1 = digitalRead(lichtschrankePin1);

  if (!altLichtschrankeStatus1 && aktLichtschrankeStatus1)
  {
    digitalWrite(ledPin1, HIGH);
  } else {
    digitalWrite(ledPin1, LOW);
  }
  delay(200);  // um es sichtbar zu machen
}