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.
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.
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.
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.
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 .
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.
@ 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.
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