Lichtschranke sketch frage

Hallo zusammen,

Ich brauche bitte hilfe!
Ich weiß nicht wie ich das "schreiben" muss damit meine lichtschranke funktioniert.

Kann mir bitte jemand von euch dabei helfen?

Es sollte so ablaufen:

  1. Grünes Signal leuchtet
  2. Die erste Lichtschranke wird unterbrochen
  3. Das grüne Signal erlischt und es leuchtet rot
  4. Die zweite lichtschranke wird Unterbrochen
  5. Das rot Signal erlischt und es leuchtet wieder grün
    und dann geht es natürlich wieder von vorne los......

pinMode(13, OUTPUT); // 13 Grün
pinMode(12, OUTPUT); // 12 Gelb
pinMode(11, OUTPUT); // 11 Rot
pinMode(A01, INPUT); // A01 ist Lichtschranke 1
pinMode(A02, Input); // A02 ist Lichtschranke 2

Ich verstehe die beschreibungen nicht so wirklich weil es dabei immer mit einem Grenzwert auslesen ist und das brauche ich doch eigentlich gar nicht oder?
Ich mein den grenzwert wenn der Fotowiederstand schaltet kann ich an meinem Fotowiederstandsbauteil schön einstellen.
Ich brauche doch nur das Signal nehmen welches von dem Sensor zum arduiono geht und das ist halt mal nur ein oder aus.

Zudem frag ich mich ob ich einen digitalen oder einen analogen anschluß wählen soll. (beides ist am Fotowiederstand möglich).

Bitte helft mir!

Grüße

Dope-walker

Wenn Du nur ein oder Asu von der Lichtschranke haben Willst, nimm den digitalen Ausgang. Denn die lichtschranke gibt darüber aus, wenn der eingestellte Wert erreicht ist. Den Analogen Ausgang nimmt man dann, wenn man den Schwellwert selber in der Software bestimmen will oder gar muss, oder wenn man den Wert des Lichtsensors zur Regelung benötigt.

LG Stefan

Hi

In Deiner Ausführung sind nun beide Lichtschranken unterbrochen - wie soll's Da 'von Vorne beginnen' - eine weitere Unterbrechung ist so nicht möglich.

Deine Erklärung scheint somit noch nicht vollständig.

MfG

PS: Widerstand ... zumindest vorne ohne E (kommt von wider = gegen)

Oha das stimmt wirklich.
Ein objekt fährt durch die erste diese wird unterbrochen, es leuchtet rot. Objekt fährt weiter durchbricht nach einer gewissen distanz die zweite lichtschranke und es wird wieder auf grün umgeschaltet…

Ist es da schon wieder aus der 1. raus? Wann soll es von vorn losgehen? Wenn es aus der 2. raus ist?

Da musst Du Dir noch ein paar Gedanken machen.

Gruß Tommy

Deltaflyer:
Wenn Du nur ein oder Asu von der Lichtschranke haben Willst, nimm den digitalen Ausgang. Denn die lichtschranke gibt darüber aus, wenn der eingestellte Wert erreicht ist. Den Analogen Ausgang nimmt man dann, wenn man den Schwellwert selber in der Software bestimmen will oder gar muss, oder wenn man den Wert des Lichtsensors zur Regelung benötigt.

LG Stefan

ok also muss es dann im grund ding so aussehen oder?

void setup() {
pinMode(13, OUTPUT); // 13 ist Grün
pinMode(12, OUTPUT); // 12 Gelb
pinMode(11, OUTPUT); // 11 Rot
pinMode(2, INPUT); // 2 ist S1
pinMode(4, INPUT); // 4 ist S2
}

Tommy56:
Ist es da schon wieder aus der 1. raus? Wann soll es von vorn losgehen? Wenn es aus der 2. raus ist?

Da musst Du Dir noch ein paar Gedanken machen.

Gruß Tommy

Nein eigentlich nicht.

Ein fahrzeug fährt am start durch die erste lichtschranke dann soll die ampel auf rot schalten. und wenn es durch die zweite gefahren ist (am ziel), wieder auf grün zurück. damit der nächste los fahren kann weil ja die ampel nicht mehr rot sondern wieder grün ist. und wenn der die erste lichtschranke durchfahren hat muss wieder rot sein.

Die Hardware (Lichtschranke und der ablauf passt. strom und signal überall vorhanden) mir geht es wirklich nur noch um das Programm. Aber da kenn ich mich zu wenig aus :frowning:

pinMode(A01, INPUT);  //  A01 ist Lichtschranke 1
pinMode(A02, Input);  //   A02 ist Lichtschranke 2

Analoge Eingänge können als digitale Ein/Ausgänge verwendet werden. In diesem Fall werden sie es.

Ich mein den grenzwert wenn der Fotowiederstand schaltet kann ich an meinem Fotowiederstandsbauteil schön einstellen.

Fotowiderstände sind meist für die Anwendung als Lichtschranke zu langsam. Meist verwendet man Fototransistoren oder die noch schnellere Fotodioden.

Deltaflyer:
Wenn Du nur ein oder Asu von der Lichtschranke haben Willst, nimm den digitalen Ausgang.

Du meinst wahrscheinlich einen digitalen Eingang.

Grüße Uwe

Hi

Bei Deinem Ablauf werden die Lichtschranken NUR unterbrochen - NIE wieder frei gegeben.
Auch die Frage von Tommy56 wurde nicht beantwortet, lässt sich aber halbwegs aus Deinem Kontext erahnen:

Zwei Lichtschranken, 1x am Start, 1x am Ziel.
Diese LS sind örtlich mehr als die Fahrzeuglänge auseinander.
Somit wird LS1 wieder freigegeben, bevor LS2 unterbrochen wird.
Was passiert, wenn LS2 nicht wieder frei gegeben wird, steht allerdings immer noch in den Sternen - wahrscheinlich rast Auto Nummer 2 in das liegen gebliebene Auto Nummer 1 und es erscheint ein formschöner Feuerball ...

MfG

uwefed:

Fotowiderstände sind meist für die Anwendung als Lichtschranke zu langsam. Meist verwendet man Fototransistoren oder die noch schnellere Fotodioden.

Hmm also ich hab einen wo eine led mit drauf ist wo amn schön sieht wenn der schaltet und ich finde der schaltet eigentlich schon sehr schnell also für mich ist er völlig ausreichend.....

postmaster-ino:
Hi

Bei Deinem Ablauf werden die Lichtschranken NUR unterbrochen - NIE wieder frei gegeben.
Auch die Frage von Tommy56 wurde nicht beantwortet, lässt sich aber halbwegs aus Deinem Kontext erahnen:

Zwei Lichtschranken, 1x am Start, 1x am Ziel.
Diese LS sind örtlich mehr als die Fahrzeuglänge auseinander.
Somit wird LS1 wieder freigegeben, bevor LS2 unterbrochen wird.
Was passiert, wenn LS2 nicht wieder frei gegeben wird, steht allerdings immer noch in den Sternen - wahrscheinlich rast Auto Nummer 2 in das liegen gebliebene Auto Nummer 1 und es erscheint ein formschöner Feuerball ...

MfG

naja also solange LS2 nicht durchfahren wird, bleibt die ampel einfach rot..... Das ist so eigentlich kein Problem da die strecke rund 50m gesamt länge hat ist es relativ überschaubar.

LS1 schaltet grün aus und rot an
LS2 schaltet rot aus und grün an

Von daher verstehe ich gerade irgendwie nicht was du damit meinst dass die beiden nicht wieder freigegeben werden. Weil es doch irgendwie logisch ist wenn das fahrzeug da durch fährt wird der laserstrahl unterbrochen und der Fotowiederstand sendet sein signal und wenn das fahrzeug durchgefahren ist leuchtet der laser wieder auf den wiederstand..... somit ist die ja wieder freigegeben oder?

Hi

Bis zu diesem Post war überhaupt noch nicht klar, wie weit Deine Lichtschranken von einander entfernt sind - Das ginge auch mit wenigen Zentimetern.
Aber gut - wenn's doch Alles so logisch ist ... wo ist Dein Problem?
In dem bisschen Ampel hin und her schalten, sehe ich, weder vom Logischen noch vom Programmieren, keine Herausforderung.

MfG

postmaster-ino:
Hi

Bis zu diesem Post war überhaupt noch nicht klar, wie weit Deine Lichtschranken von einander entfernt sind - Das ginge auch mit wenigen Zentimetern.
Aber gut - wenn's doch Alles so logisch ist ... wo ist Dein Problem?
In dem bisschen Ampel hin und her schalten, sehe ich, weder vom Logischen noch vom Programmieren, keine Herausforderung.

MfG

Ähm die entfernung ist doch eigentlich nicht wichtig . glaub ich. Oder? Meinst du wegen der zeit also von LS1 zu LS2?

Ich versteh das ja nicht und es tut mir leid ich wollte dir jetzt absolut nicht irgendwie doof kommen oder so! Tut mir leid dass du das so aufgefasst hast!

Ähm naja Ich hab beim Programmieren wirklich ernsthafte probleme immerhin glaub ich bin ich jetzt ein gutes stück weiter oder?

void setup() {
pinMode(13, OUTPUT); // 13 ist Grün
pinMode(12, OUTPUT); // 12 Gelb
pinMode(11, OUTPUT); // 11 Rot
pinMode(2, INPUT); // 2 ist S1
pinMode(4, INPUT); // 4 ist S2
}

void loop() {
if (digitalRead(2) == LOW) {
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, LOW);

}
else {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
}
if (digitalRead(4) == LOW) {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);

}
else {
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
}
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hi

//Foren-Sketch
// https://forum.arduino.cc/index.php?topic=681966.msg4587720#msg4587720

//Pin-Zuordnung
const byte pin_gn = 13;
const byte pin_ge = 12;
const byte pin_ro = 11;
const byte pin_s1 = 2;
const byte pin_s2 = 4;

//Zuordnung, welcher Pegel AN bedeutet
const bool _AN = HIGH;
const bool _AUS = !_AN;

//Zuordnung, welcher Pegel eine unterbrochene Lichtschranke darstellt
const bool _BETAETIGT = LOW;
const bool _UNBETAETIGT = !_BETAETIGT;

void setup() {
  pinMode(pin_gn, OUTPUT);
  pinMode(pin_ge, OUTPUT);
  pinMode(pin_ro, OUTPUT);
  pinMode(pin_s1, INPUT);
  pinMode(pin_s2, INPUT);
}

void loop() {
  if (digitalRead(pin_s1) == _BETAETIGT) {
    digitalWrite(pin_gn, _AN);
    digitalWrite(pin_ge, _AUS);
    digitalWrite(pin_ro, _AUS);
  } else {
    digitalWrite(pin_gn, _AUS);
    digitalWrite(pin_ge, _AUS);
    digitalWrite(pin_ro, _AN);
  }
  if (digitalRead(pin_2) == _BETAETIGT) {
    digitalWrite(pin_gn, _AUS);
    digitalWrite(pin_ge, _AUS);
    digitalWrite(pin_ro, _AN);

  } else {
    digitalWrite(pin_gn, _AN);
    digitalWrite(pin_ge, _AUS);
    digitalWrite(pin_ro, _AUS);
  }
}

Zumindest erst Mal in lesbar

Da beide Taster-Abfragen die Pins umschalten, kannst Du die Erste auch direkt weg lassen - Diese wird eh direkt im Anschluss durch die zweite Abfrage überschrieben.

MALE (so mit Stift und Papier) Dir auf, WAS Du WANN haben willst.

Dann kann Das was werden - und ich sehe schon einen Unterschied, ob eine Lichtschranke wieder frei gegeben wird, oder nicht.
Da Du selber sagst, daß Diese wohl freigegeben werden müssen (die Fahrzeuge sind halt nicht sooooo lang) - warum steht Das nicht in Deinem Ablauf?

MfG

Edit
Für die Input's reicht bool wohl auch ... geändert

void setup() {
pinMode(13, OUTPUT);  // 13 ist Grün
pinMode(12, OUTPUT);  // 12 Gelb
pinMode(11, OUTPUT);  // 11 Rot
pinMode(2, INPUT);    // 2 ist S1
pinMode(4, INPUT);    // 4 ist S2
}

void loop() {
if (digitalRead(2) == 0 && digitalRead(4) == 0) {
state = 0;
}else if (digitalRead(2) == 1 && digitalRead(4) == 0) {
state = 1;
}else if (digitalRead(2) == 1 && digitalRead(4) == 1) {
state = 3;
}else{
state = 4;
}
switch (state) {
case 1:
digitalWrite (13, HIGH);
digitalWrite (12, LOW);
digitalWrite (11, LOW);
break;
case 2:
digitalWrite (13, LOW);
digitalWrite (12, LOW);
digitalWrite (11, HIGH);
break;
}

Ich glaube jetzt bin ich auf dem richtigen weg......

Aber jetzt sind da wohl ein paar problemchen.
in der
switch (state) {
ist irgenwie state nicht benant warum? muss ich switch (state =0) { machen? dann switch (state =1) { usw?

switch (state) {

state ist die Variable die in den Case kontrolliert wird.

Wenn Dir der Compiler sagt daß state nicht bekannt ist wirst Du es im Sketch nicht definiert haben oder falsch geschrieben sein.

Ohne Sketch fische ich im Dunkeln.
Grüße Uwe

Hi

Der Weg sieht schon ganz gut aus.
Du musst sämtliche Variablen bekannt machen!
Woher soll der Kompiler wissen, wie groß state werden kann?
Mindestens in loop als static - von Da ist's nicht weit weg zu direkt global.

Hier Mal mein Versuch:

//Foren-Sketch
// https://forum.arduino.cc/index.php?topic=681966.msg4587720#msg4587720

//Pin-Zuordnung
const byte pin_gn = 13;
const byte pin_ge = 12;
const byte pin_ro = 11;
const byte pin_s1 = 2;
const byte pin_s2 = 4;

//Zuordnung, welcher Pegel AN bedeutet
const bool _AN = HIGH;
const bool _AUS = !_AN;

//Zuordnung, welcher Pegel eine unterbrochene Lichtschranke darstellt
const bool _BETAETIGT = LOW;
const bool _UNBETAETIGT = !_BETAETIGT;

void setup() {
  pinMode(pin_gn, OUTPUT);
  pinMode(pin_ge, OUTPUT);
  pinMode(pin_ro, OUTPUT);
  pinMode(pin_s1, INPUT);
  pinMode(pin_s2, INPUT);
  digitalWrite(pin_gn, _AN); //Start-Zustand, Einfahrt erlaubt
  digitalWrite(pin_ge, _AUS);
  digitalWrite(pin_ro, _AUS);
}

//Ampel soll eine Rennstrecke sperren, wenn ein Fahrzeug sich auf Dieser befindet
//und wieder frei geben, wenn Dieses Diese verlassen hat.

void loop() {
  byte static ampelstatus = 0;
  switch (ampelstatus) {
    case 0://Ampel Grün, wartet auf Einfahrt
      if (digitalRead(pin_s1) == _BETAETIGT) {
        ampelstatus++;
        digitalWrite(pin_gn, _AUS); //Wechsel von GN auf GE
        digitalWrite(pin_ge, _AN);
      }
      break;
    case 1://Ampel Rot, Fahrzeug in Rennstrecke
      if (digitalRead(pin_s1) == _UNBETAETIGT) {
        ampelstatus++;
        digitalWrite(pin_ge, _AUS); //Wechsel von GE auf RO
        digitalWrite(pin_ro, _AN);
      }
      break;
    case 2://Ampel auf Gelb, Fahrzeug am Ziel
      if (digitalRead(pin_s2) == _BETAETIGT) {
        ampelstatus++;
        digitalWrite(pin_ge, _AN); //Wechsel von RO auf RO-GE
      }
      break;
    case 3://Ampel auf Grün, Fahrzeug hat Strecke verlassen
      if (digitalRead(pin_s2) == _UNBETAETIGT) {
        ampelstatus++;
        digitalWrite(pin_ge, _AUS); //Wechsel auf GN
        digitalWrite(pin_ro, _AUS);
        digitalWrite(pin_gn, _AN);
      }
      break;
    default: ampelstatus = 0; //ungültiger Status wird auf 0 umgebrochen
  }
}
/*
Auf Uno/Nano:
Der Sketch verwendet 1122 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, 2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
 */

Versuche zu verstehen, was ich wo mache.
Auch hat es durchaus einen Sinn, keine 'magic numbers' im Sketch stehen zu lassen.
Alle Zahlen, Die irgendwo gebraucht werden, deklariert man am Anfang des Sketch - so hat diese Zahl einen Namen und kann auch einfachst angepasst werden.
Alles, was konstant ist - auch so deklarieren: mit 'const'.
Die Pin-Zuordnung wird sich während der Laufzeit nicht ändern - also warum nicht fest im Code verbauen lassen? (der Kompiler kann so Zeug prima weg optimieren).
Wenn's als Variable bleibt, ändert Die sich zwar auch nie, aber der Wert des Pin wird jedes Mal aus dem Speicher ausgelesen - Das braucht Zeit und Platz (sowohl für die Variable, wie für den auslesenden Code).

MfG

PS: Drück in der IDE Mal STRG+T - Das rückt den Code auf Klammer-Ebene ein.
Auch setze ich öffnende Klammern gerne in die Zeile der IF/FOR/whatever, wie um ELSE in die gleiche Zeile.
So bleibt der Code kompakt.

bool start = false;
void setup() {
pinMode(13, OUTPUT); // 13 ist Grün
pinMode(12, OUTPUT); // 12 Gelb
pinMode(11, OUTPUT); // 11 Rot
pinMode(2, INPUT); // 2 ist S1
pinMode(4, INPUT); // 4 ist S2
}

void loop() {
if (digitalRead(2) == HIGH && start==false) {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
start = !start;
}

if (digitalRead(4) == HIGH && start == true) {
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
start = !start;
}
}

Ich hab es nochmal ganz anders gemacht :slight_smile:
Ich glaube ich verstehe es jetzt :slight_smile:

Und das wichtigste:
ES FUNKTIONIERT ENDLICH :))

was müßte man denn rein aus neugier dazu schreiben um die gelbe lampe wenn nach z.b. 10 minuten nichts passiert (keine lichtschranke unterbrochen wird) blinken zu lassen bis eine schranke wieder durchfahren wird?

Hi

Du merkst Dir die Zeit, wenn die erste Lichtschranke unterbrochen wird.
Wenn wir immer noch im Zustand 'Strecke besetzt' sind UND die 10 Minuten um sind, lässt Du im 500ms-Takt die gelbe LED blinken.

Gewöhne Dir an SCHÖNEN Code zu schreiben, vermeide 'magic numbers' wo Es nur geht.
Auch wirst Du Deinen ganzen Sketch umschreiben müssen, wenn die grüne LED nun doch besser an Pin 8 aufgehoben wäre.

Schön, daß Es bis hier hin funktioniert!

MfG