Lichtschranke zu langer Impuls

Hallo Zusammen.

Bin ganz neu im Arduino geschehen daher leider auch noch ziemlich unwissend zum Thema Programmierung.
Versuche jetzt schon mehrere Stunden erfolglos ein einfaches Programm umzusetzen.

Habe folgendes Problem:

Das Ausgangssignal einer Lichtschranke schaltet für ca. 1 sek durchgehend dürfte aber max. einen Impuls von 150ms ausgeben.

Daher meine Idee mit einem Arduino. Die Lichtschranke schaltet egal wie lange auf DI2 der Arduino gibt nur einen kurzen Impuls von 150ms auf D13 aus und wartet dann wieder auf die Lichtschranke.

Wie kann ich sowas am besten umsetzen?
Hab mir steigende Flanke, debounce, treppenhausschalter etc. angesehen und versucht umzuschreiben aber alles Erfolglos.

Vielen Dank

LG Thomas

Hallo,

na dann zeig doch mal her ...
Allgemein ist "der Trick" das dein "Pulsformer" nicht retriggerbar sein darf. Er muss warten bis das Eingangssignal wieder Ruhepegel hat. Erst beim erneuten Wechsel darf er wieder einen Puls raushauen.

Mal als (ungetester) Simpel-Code-Schnipsel:

if ( digitalRead(lsInput) == HIGH ) {          // Wenn Lichtschranke aktiv
  digitalWrite( pulsOut, HIGH );  // Pulsausgang setzen
  delay( 150 );                   // 150ms warten
  digitalWrite( pulsOut, LOW );   // Pulsausgang wieder zurücksetzen
  while( digitalRead(lsInput) == HIGH ) ;      // warten bis Lichtschranke wieder inaktiv
}

Das ist jetzt natürlich nicht gerade ein optimaler Code, weil der Arduino da während der aktiven Lichtschranke nichts anderes machen kann, sondern nur Däumchen dreht. Aber so ist das Prinzip, und wenn er tatsächlich nichts anderes machen braucht, sollte es so auch funktionieren.

Hallo,

wie schon erwähnt basiert das auf einem entprellten Taster der nicht retriggert werden kann. Zum Bsp. ein Taster der immer nur beim erneuten drücken zählt und nicht bei jedem entprellten Pegelwechsel. Den Taster ersetzt man durch das Lichtschrankensignal und die Entprellung kann ggf. raus.

Vielen Dank,

Hat tatsächlich funktioniert.
Hier noch der gesamte Code.
LG Thomas

const byte pulsOut = 13;
const byte lsInput = 2;
volatile byte state = LOW;

void setup() {
pinMode(pulsOut, OUTPUT);
pinMode(lsInput, INPUT_PULLUP);
}

void loop() {
if ( digitalRead(lsInput) == HIGH ) { // Wenn Lichtschranke aktiv
digitalWrite( pulsOut, HIGH ); // Pulsausgang setzen
delay( 150 ); // 150ms warten
digitalWrite( pulsOut, LOW ); // Pulsausgang wieder zurücksetzen
while( digitalRead(lsInput) == HIGH ) ; // warten bis Lichtschranke wieder inaktiv
}
}

void blink() {
state = !state;
}

Schön, dass es funktioniert. Wenn Du hier Code einstellst, dann bitte in Codetags ( das </> oben links im Editor ). Und benutze auch mal ctrl-T zur Formatierung :wink: .

const byte pulsOut = 13;
const byte lsInput = 2;
volatile byte state = LOW;

void setup() {
  pinMode(pulsOut, OUTPUT);
  pinMode(lsInput, INPUT_PULLUP);
}

void loop() {
  if ( digitalRead(lsInput) == HIGH ) {     // Wenn Lichtschranke aktiv
    digitalWrite( pulsOut, HIGH );          // Pulsausgang setzen
    delay( 150 );                           // 150ms warten
    digitalWrite( pulsOut, LOW );           // Pulsausgang wieder zurücksetzen
    while ( digitalRead(lsInput) == HIGH ); // warten bis Lichtschranke wieder inaktiv
  }
}

void blink() {
  state = !state;
}

Was hast Du denn mit dem blink() vor? Das wird ja derzeit gar nicht aufgerufen.

Hallo,

@ TO:
das kann aber nur als Ansatz dienen. Wenn du den Sketch erweiterst wirst du es merken.
Beschäftige dich mit millis und ersetze delay und auch while in der Logik.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0

Deshalb ja auch die Frage, was er mit dem blink() vor hat :wink: . Aber immer schön eins nach dem anderen.

Hallo,

ich habe damit kein Problem. Wollte nur das der TO am Ball bleibt und nicht denkt das wars jetzt für immer. :slight_smile:

Nachtrag:
Pin 13 ist die falsche Wahl. Da dort eine LED dranhängt benutzt der Bootloader das Pin um Beim Starten Lebenszeichen zu geben. Darum hast Du beim Einschalten immer einige Impulse aud pin 13. Nimm einfach einen anderen Pin.
Grüße Uwe

Nimm aber nicht 0 oder 1, die sind von der seriellen Schnittstelle belegt. Zumindest bei den Standard Arduinos.