Bei Unterbrechung 2er Lichtschranken auf bzw abwärts zählen

Hallo miteinander,

momentan arbeite ich an einem Projekt, jedoch komme ich nicht weiter und bräuchte Hilfe.

Folgendes will ich realisieren: Bei Unterbrechung der ersten Lichtschranke soll mein Zähler um eins hoch zählen, bei Unterbrechung der zweiten Lichtschranke soll er um eins runter zählen. Der jeweilige Wert soll immer auf einer 7 Segment Anzeige angezeigt werden.

Meine Lichtschranke besteht aus einer Fotodiode und einem Fototransistor und dahinter hab ich noch ein NAND Gatter sowie ein paar Widerstände, Transistor und eine LED gesteckt, die mir anzeigt, wann eben die Lichtschranke unterbrochen ist und wann nicht.

Ich verwende den Arduino Mega 2560

So nun zu meinen vielen kleinen Problemen :)

Wenn ich nur eine Lichtschranke an die 5V angeschlossen habe, zählt meistens mein Zähler brav um 1 hoch. Manchmal springt er aber auch um 2 bzw um 3 hoch. Liegt das daran, dass ich keine Entprellung für die Lichtschranke eingebaut habe ??

Wenn ich nun auch die 2te Lichtschranke an die 5V anschließe, dann spinnt der Wert auf meiner Anzeige komplett und es sind Sprünge von meinem Zähler von 50 bis manchmal mehrere 100 festzustellen. Könnte das an einem Spannungszusammenbruch liegen oder an was könnte das sonst liegen ?

Nun habe ich meine 2te Lichtschranke an die 5V eines älteren Arduinos angeschlossen, den ich noch zu Hause hatte. Der Wert des Anzeige ädert sich dann zum Glück nicht mehr so sprunghaft wie davor, jedoch ist der Startwert -1, obwohl ich ihn ja auf 0 gestellt habe. Und meine 2te Interrupt routine wird nicht ausgeführt. Habe ich jetzt einen Fehler in meinem Code ??

Desweiteren ist mir aufgefallen, dass wenn ich die gesteckten Kabel auf meinem Steckboard berühre, dass sich der Wert der 7 Segment Anzeige ebenfalls sich ändert, obwohl die Lichtschranke nicht unterbrochen worden ist. Liegt das an einem Wackelkontakt ?? Und ist dann das Problem, wenn man die ganze Schaltung verlötet, behoben ?

Zur Ergänzung: Das Signal lese ich am Kollektor des Fototransistors ein. Ohne Unterbrechung liegt dort ein 0 Signal an, bei einer Unterbrechung ein 1 Signal

Habe ich in meinem Code etwas falsch oder habe ich mich beim stecken auf dem Steckboard komplett vertan?

Ich freue mich über eure Antworten

Vielen Dank im Voraus

Warum machst du es mit einem Interrupt ? Und warum ist pinmode zweimal identisch eingefügt ?

Stimmt beim Pinmode habe ich bei Interrupt Pin hinten die 2 vergessen…

Wie würdest du es machen? Für mich schien es so am einfachsten, da ich ja pro Unterbrechung nur ein mal auf/ab zählen will.

Wenn es nicht gerade ein Geschoss ist, was die Schranke unterbricht, genügt ein Loop ohne delay zur Abfrage.

Gruß Tommy

ju_ra456: Stimmt beim Pinmode habe ich bei Interrupt Pin hinten die 2 vergessen..

Wie würdest du es machen? Für mich schien es so am einfachsten, da ich ja pro Unterbrechung nur ein mal auf/ab zählen will.

Da es bei deinem Zählen ja nicht in sehr schneller Folge abläuft, reicht das Zählen sicher in der Loop. Du brauchst da nur die Pins entsprechend abzufragen. Ein Entprellen ist da nicht wichtig, wenn alles elektronisch abläuft.

HotSystems: Da es bei deinem Zählen ja nicht in sehr schneller Folge abläuft, reicht das Zählen sicher in der Loop. Du brauchst da nur die Pins entsprechend abzufragen. Ein Entprellen ist da nicht wichtig, wenn alles elektronisch abläuft.

Wie müsste ich das denn dann schreiben, wenn ich die Pins in der Loop abfrage und es ohne Interrupt machen würde?

Liebe Grüße

ju_ra456: Wie müsste ich das denn dann schreiben, wenn ich die Pins in der Loop abfrage und es ohne Interrupt machen würde?

Da findest du doch auch als Beispiel in der IDE. Einfach abfragen ob Pin High oder Low ist. Kommt drauf an wie deine Schaltung aussieht.

Hi

Wenn’s denn ein Interrupt bleiben soll, fehlt das Wörtchen volatile - da Anzahl ein INT ist, muß Das auch atomar ausgelesen werden.

Das Alles für einen Zähler, Der per Lichtschranke getriggert wird?? Mir ist’s aber recht so.

Abfrage in loop() … Gegenfrage: Wie würdest Du einen beliebigen Pin abfragen?
Genau So fragst Du auch Deinen Lichtschranken-Pins ab.
Zur Not, wie bereits angedeutet, bietet die IDE auch Beispiele für digitalRead.

Und, damit auch noch was gemeckert wird: Die 19 in Deinem attach solltest Du dringend gegen den Variablen-Namen tauschen - wofür gibst Du dem Ding einen Namen, wenn Du danach mit der Nummer weiter machst?
Auch kannst Du viel leichter Änderungen vornehmen, wenn im Sketch selber NUR der Name benutzt wird und die Zuweisung genau 1x im Sketch vorhanden ist.
So stellst Du ALLES, was einstellbar ist, ganz vorne ein - kein Rumgesuche im Sketch, wo Du noch einen der Pins vergessen hast.

MfG

ju_ra456:
Wie müsste ich das denn dann schreiben, wenn ich die Pins in der Loop abfrage und es ohne Interrupt machen würde?

Ich kann dir nicht sagen, was du machen müsstest.

Aber ich kann dir zeigen, wie es bei mir aussehen würde!
Frei nach dem Motto:
:o (Symmetrie == Kunst für Doofe) :o

/*
 * Ein Foerderband
 * Eine Lichtschranke am Eingang
 * Eine Lichtschranke am Ausgang
 * 
 * Bei jedem Lichtschrankendurchgang wird angezeigt, wieviele Pakete auf dem Band liegen.
 * 
 * 
 */

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>


using Counter = Combie::Tools::Counter<int>;


Combie::Pin::InputPin<2> lichtschrankeEingang;
Combie::Pin::InputPin<3> lichtschrankeAusgang;
Combie::Timer::EntprellTimer entprellenEingang(20); //ms prellzeit
Combie::Timer::EntprellTimer entprellenAusgang(20); //ms prellzeit
Combie::Tools::FlankenErkennung  flankenerkennungEingang;
Combie::Tools::FlankenErkennung  flankenerkennungAusgang;
Counter counterEingang;
Counter counterAusgang;

void onCount(Counter&)
{
  Serial.print("Es liegen ");
  Serial.print(counterEingang-counterAusgang);
  Serial.println(" Pakete auf dem Band");
}


void setup() 
{
  Serial.begin(9600);
  lichtschrankeEingang.initPullup();
  lichtschrankeAusgang.initPullup();
  counterEingang.onCount(onCount);
  counterAusgang.onCount(onCount);
}

void loop() 
{
  counterEingang = flankenerkennungEingang = entprellenEingang = lichtschrankeEingang;
  counterAusgang = flankenerkennungAusgang = entprellenAusgang = lichtschrankeAusgang;
}

CombieLib.zip (56.1 KB)

Dann setze deine Sketch doch bitte in Code-Tags, das hast du doch im ersten Beitrag schon gekonnt.

Dann ist dieser von allen besser lesbar.

nur habe ich Ihn auf die Schnelle beim Überfliegen nicht gleich auf Anhieb verstanden.

Da mach dir mal nix draus. Denn damit dürftest du wohl nicht alleine sein.

Nachtrag: Das delay() solltest du entfernen, denn für die Zeit ist dein Programm blind.

Hallo,

wenn das was die Lichtschranke unterbricht nicht gleichförmig bewegt wird kann es dazu kommen das auch mehrfach gezählt wird. Ich weiß ja nicht was da wie gezählt werden soll. Entprellen schadet da also nicht.

Heinz

HotSystems: Dann setze deine Sketch doch bitte in Code-Tags

erledigt.

combie: Aber ich kann dir zeigen, wie es bei mir aussehen würde!

wenn ich deine CombieLip.zip in meine Bibliothek einbinden will, kommt leider eine Fehlermeldung, dass die angegebene Zip Datei keine gültige Bibliothek enthält..

Momentan unterbreche ich die Lichtschranke mit meinem Zeigefinger wenn ich "delay() " entferne spinnt komischerweise relativ oft die Anzeige deswegen habe ich sie noch drinnen gelassen..

Also das Runterzählen funktioniert einwandfrei, nur eben beim Aufwärtszählen spinnt es manchmal, sodass der Wert manchmal um 1 runterzählt statt rauf bzw manchmal aber auch um 2 hochzählt..

Grüße

Du musst dich mal fragen wie schnell maximal gezählt werden soll. Voll Speed, was immer auch geht? Oder reicht es alle 10ms, oder alle 30ms, oder alle 100ms?

Wenn du also ein Ereignis gezählt hast kannst du dann die nächsten z.B. 30ms ausschließen, das da ein gewolltes nächstes Ereignis kommt?

Am besten ist es GENAU das zu beschreiben was man eigentlich erreichen will. Bitte nichts sinngemäßes oder verallgemeinertes, sondern GENAU das was man machen möchte. Dann kann man das viel besser verstehen und somit dir viel besser helfen.

Willst du Tore zählen, oder Brieftauben, oder Bienen, die den Bienenstock verlassen oder wieder reinfliegen?

wenn ich deine CombieLip.zip in meine Bibliothek einbinden will, kommt leider eine Fehlermeldung, dass die angegebene Zip Datei keine gültige Bibliothek enthält..

Die Zip enthält mehrere Libraries.

Werfe die benötigten Libs aus der Zip händisch in deinen stetchbook/libraries Ordner. Dann tuts das auch.

themanfrommoon: Du musst dich mal fragen wie schnell maximal gezählt werden soll. Voll Speed, was immer auch geht? Oder reicht es alle 10ms, oder alle 30ms, oder alle 100ms?

Wenn du also ein Ereignis gezählt hast kannst du dann die nächsten z.B. 30ms ausschließen, das da ein gewolltes nächstes Ereignis kommt?

Am besten ist es GENAU das zu beschreiben was man eigentlich erreichen will. Bitte nichts sinngemäßes oder verallgemeinertes, sondern GENAU das was man machen möchte. Dann kann man das viel besser verstehen und somit dir viel besser helfen.

Willst du Tore zählen, oder Brieftauben, oder Bienen, die den Bienenstock verlassen oder wieder reinfliegen?

Also es soll eine Art Parkhaus werden. Am Ein bzw Ausgang soll eine Lichtschranke stehen, die duch ein Matchboxauto unterbrochen werden soll. Und pro rein/rausfahrendes Auto soll es 1 hoch/runter zählen.

Dementsprechen hätte ich gesagt, es würde von 500ms bis 2s auch noch reichen, und wenns sein müsste auch noch länger. Sprich ja ich könnte dann z.B die nächsten 30ms ausschließen, nachdem es gezählt hat.

combie: Die Zip enthält mehrere Libraries.

Werfe die benötigten Libs aus der Zip händisch in deinen stetchbook/libraries Ordner. Dann tuts das auch.

Hat funktioniert, Vielen Dank.

Hat funktioniert, Vielen Dank.

Fein!