Torzähler

Hallo Zusammen

Ich versuche zur Zeit mit einer Lichtschranke (IR-Diode <-> Phototransistor) für meinen Tischfussballkasten einen Torzähler zu realisieren.

Im Prinzip soll es so funktionieren, dass wenn der Ball bei einem Tor die Lichtschranke unterbricht, soll im Arduino die entsprechende Torzahl um 1 erhöht werden. Nun habe ich in meinem Code allem Anschein nach einen Fehler, da die Variable ohne Auslösung der Schranke beginnt hochzuzählen.

Da ich ein waschechter Frischling bin und auch mit programmieren auf einem noch tiefen Niveau bin, wäre ich froh wenn sich kurz jemand meinen Code anschauen und mir evtl weiterhelfen könnte.

Schon mal vielen Dank für eure Hilfe.

Lichtschranke.ino (644 Bytes)

Ups hatte noch einen falschen Kommentar drin. Diese Datei sollte nun korrekt sein.

Lichtschranke.ino (650 Bytes)

Serial.begin(9600); solltest du ins Setup packen
es sollte zwar auch anders gehen, aber nehme doch
if (digitalRead(ReadPin==LOW)){ //Wenn Lichtschranke unterbrochen, Tore blau 1 hochzählen
was soll exit bewirken?

Serial.begin(9600); muss ins Setup!

Leider kann man nicht erkennen wie die Lichtschranke arbeitet.
Hier ist ein Schaltbild nötig um weiteres zu erkennen.

Und "if (digitalRead(ledPin == LOW))" hier meinst du sicher den Eingangsport.

Hallo,

Serial.beginn kommt ins setup
delay und exit werden nicht benötigt.
Das Tore zählen kannste weiter oben mit erledigen. Die LED abfragen kann man damit einsparen. Wäre eh etwas seltsam gewesen.
Wie sieht denn der Schaltplan aus?

Hallo,

sind ja noch paar Leute wach. :slight_smile:

Grad noch so eben. :sleeping:

versuch es mal so

const int ReadPin = 2; //EingangsPIN 2
const int ledPin = 13; //LED an Pin 13
int ToreBlau;
boolean Tor = false;
boolean state = 0;
void setup() 
{
Serial.begin(9600);  
pinMode(ReadPin,INPUT_PULLUP); 
pinMode(ledPin,OUTPUT); 

}

void loop() 
{
  state = digitalRead(ReadPin);  
  if(!state)  //PIN auslesen
 {
  
  digitalWrite(ledPin, LOW);       //Wenn Lichtschranke unterbrochen, LED Aus
 
 }
  else
 {
  digitalWrite(ledPin, HIGH);      //Bei nicht unterbrochener Lichtschranke, LED Ein
  
 }
  if (!state){ //Wenn Lichtschranke unterbrochen, Tore blau 1 hochzählen
    ToreBlau++;
    
    //Serial.print (digitalRead(state)); //(ToreBlau);
    Serial.print (ToreBlau);
    delay(500);
   //exit;

    }

  }

in der Zeile
if (digitalRead(ledPin==LOW)){ //Wenn Lichtschranke unterbrochen, Tore blau 1 hochzählen
hast du zwei Fehler

  1. du liest den ledPin aus, der ist ja LOW wenn die Lichtschranke nicht unterbrochen ist
  2. digitalRead(ledPin==LOW)) geht nicht, müsste heißen: digitalRead(ledPin)==LOW

Super Vielen Dank für die zahlreichen Antworten. Werde das heute Abend ausprobieren. :smiley:

Noch eine andere Frage.. Wie kann man hier direkt den Source im Post einbinden? Habe die Funktion nicht gefunden oder übersehen.

Links oben, über den Smilies, findest du den Code Button

Hallo,

wobei das mit der Datei anhängen auch nicht falsch ist, gerade wenn der Code länger ist. Weil a) das Antwortfenster Zeilen begrenzt ist und b) man sich mit der Datei einen besseren Überblick verschaffen kann. Ich schaue mir das gern erstmal im Editor Notepad++ an oder in der IDE. Aber mach wie dir beliebt. :wink:

Hier mal ein Projekt, wo du dir evtl. was abgucken kannst.

Ist kein Torzähler, sondern ein Geschwindigkeitszähler.
Aber auch sehr interessant. :wink:

Hallo zusammen. Dachte mir mache eine kurze Rückmeldung. Hab noch ein bisschen am Vorschlag von ardubu rumgebastelt und nun funktionierts. Vielen Dank nochmals dafür. :smiley:

Der Code sieht nun so aus:

const int ReadPin = 2; //EingangsPIN 2
const int ledPin = 13; //LED an Pin 13
int ToreBlau = 0;
boolean state = 0;
boolean gewonnen = 0;

void setup() 
{
Serial.begin(9600);  
pinMode(ReadPin,INPUT_PULLUP); 
pinMode(ledPin,OUTPUT); 
Serial.println(ToreBlau); //Ausgangspunktzahl 0

}

void loop() 
{


  if((!gewonnen) && ((ToreBlau)==10)){  //überprüfen ob blau gewonnen hat (entspricht 10 Toren)
    if(ToreBlau = 10){
      Serial.println("Team blau gewinnt!!!");
      gewonnen = 1;
      delay(5000);
      Serial.println("Fuer ein neues Spiel, bitte Reset Button druecken!");
    }
  }
  
  state = digitalRead(ReadPin);  
  if(state)  //PIN auslesen
 {
  
  digitalWrite(ledPin, LOW);       //Wenn Lichtschranke unterbrochen, LED Aus
 
 }
  else
 {
  digitalWrite(ledPin, HIGH);      //Bei nicht unterbrochener Lichtschranke, LED Ein
  
 }
  if (state){ //Wenn Lichtschranke unterbrochen, Tore blau 1 hochzählen
    ToreBlau++;
    
    
    Serial.println (ToreBlau);
    delay(500);
   

            }


}

an dieser Stelle hast du einen kleinen Fehler

if(ToreBlau = 10){

= ist eine Zuweisung
== ist ein Vergleich

Ps. merkst du an dieser Stelle nicht, da ToreBlau ja eh schon 10 ist. Diese Zeile ist überflüssig, da du es ja schon in der Zeie darüber abfragst.

Ich habe dein Programm noch mal ein wenig zusammengestrichen, es müßte aber genauso funktionieren, wie deines.

const int ReadPin = 2; //EingangsPIN 2
const int ledPin = 13; //LED an Pin 13
byte ToreBlau = 0;
boolean gewonnen = 0;

void setup() 
{
Serial.begin(9600);  
pinMode(ReadPin,INPUT_PULLUP); 
pinMode(ledPin,OUTPUT); 
Serial.println(ToreBlau); //Ausgangspunktzahl 0
}

void loop() 
{
  if (!gewonnen)
      {if (ToreBlau>=10){  //überprüfen ob blau gewonnen hat (entspricht 10 Toren)
      Serial.println("Team blau gewinnt!!!");
      gewonnen = 1;
      Serial.println("Fuer ein neues Spiel, bitte Reset Button druecken!");
    }
  if(digitalRead(ReadPin))  //PIN auslesen
   {
    digitalWrite(ledPin, LOW);       //Wenn Lichtschranke unterbrochen, LED Aus
    ToreBlau++;
    Serial.print ("ToreBlau  ");
    Serial.println (ToreBlau);
   }
    else 
      digitalWrite(ledPin, HIGH);      //Bei nicht unterbrochener Lichtschranke, LED Ein
      } 
}