nach langer Zeit, Bau von Modulen mit Landschaft und Häuser, beschäftige ich mich mal wieder mit Arduino. Ich verwende am liebsten die Moba Tools, damit habe ich schon viel Bewegung auf meiner Anlage realisieren können.
Mein Problem, zur Ansteuerung eines Sound Moduls brauche ich einen kurzen Impuls von ca. 500 Millisekunden. Mit delay funktioniert es nicht.
Was kann ich machen, dass das Signal nur 500 Millisekunden dauert, obwohl ich den Taster länger betätige.
Über eine Anregung wäre ich dankbar.
Gruß Jürgen
[code]
#include <MobaTools.h>
const byte led1 = 5; // LED Pin 5
const byte taster1 = A0; // Taster
MoToTimer Blinkzeit2;
void setup()
{
pinMode(led1, OUTPUT);
pinMode(taster1, INPUT_PULLUP );
digitalWrite( led1, LOW ); // LED Pin 5 Aus
}
void loop()
{
if ( !digitalRead(taster1) && !Blinkzeit2.running() )
{
Blinkzeit2.setTime( 500 );
digitalWrite( led1, HIGH ); // LED Pin 5 Ein
}
if ( Blinkzeit2.expired() ) // Zeit abgelaufen
{
digitalWrite( led1, LOW); // LED Pin 5 Aus
}
}
[/code]
Ich kenne die moba tools nicht, aber ein Ansatz wäre solange der Taster gedrückt ist passiert mal nix und sobald er losgelassen wird fängt etwas aller blink without delay beispiel an zu zählen bis die 500 millisekunden erreicht sind und wenn das passiert ist macht dann dein Arduino das was er machen soll.
Somit wärst du unabhängig von der Drückdauer deines buttons
hast schon irgend eine Button Library im Einsatz? Wenn ja welche?
edit:
wenn nicht, dann kannst dir ja eine Buttonklasse selber schreiben.
Und das pulsen von einem Ausgang geht eigentlich wie ein "Blink Without Delay"
der Taster wird kürzer gedrückt als 500ms aber der Impuls soll 500ms sein, in dem Fall spricht man von einem verlängertem Impuls.
Der Taster wird länger als 500ms gedrückt , der Impuls soll aber nur 500ms sein .
damit das für beide Fälle passt müsste man mit der Flanke des gedrückten Taster arbeiten, oder aber wie bereits angesprochen den nicht mehr gedrückten Taster abfragen.
man muss die entprellte Gedrückt-Flanke erkennen. Das muss nicht retriggerbar programmiert sein, sodass jede Tasterabfrage erst mit erneuten drücken wahr wird. Wenn du das hast kannste damit alles erdenklich anstellen. Ist zum Bsp. mit der Bounce2 Lib leicht programmierbar.
Würde in deinem Fall bedeuten der Impuls wird sofort ausgelöst aber ohne Folgepulse, weil der Taster erst erneut gedrückt werden muss.
es mag tun wie gewünscht. Nur ich würde immer nur entprellte Signale verarbeiten. Heute sind es 500ms und morgen sollen es nur 2ms sein. Es macht viel zu viel Arbeit jedesmal den Code anzupassen. Einmal richtig und dann für vieles nutzbar ist meine Herangehensweise. Außerdem sollte der TO Entprellen verstehen und anwenden können. Früher oder später benötigt das jeder.
Egal wie lang - Du kannst die 500ms durch irgendwas ersetzen. 2ms Laufzeit und entprellen von 40ms passt dann natürlich nicht mehr. Solange aber die entprellZeit nicht unter die onZeit fällt, passt das schon.
Und ob das entprellen mit MoBa.Buttons besser verstanden wird, als wenn "zu Fuß" geschrieben?
Danke für Eure interessanten Infos.
Hallo paulpaulson dein Sketch ist super, habe mich aber für den von agmue entschieden.
Hallo agmue , du hast mir vor 2 Jahren einen Sketch für meinen „Fliegenden Teppich“ geschrieben, den ich für mein neues Projekt „ Baumstämme mit Traktor mit Motorgeräusch aus einem Wald herausziehen in HO „ verwende. Jetzt hoffe ich, dass ich deinen neuen Sketch, in dem vom „Fliegenden Teppich“, integrieren kann.
Ich werde, wenn ich fertig bin, deiner Anregung nach, mein Projekt in Zeigt her eure geilen Projekte! Veröffentlichen.
Verstehe ich nicht ganz. Wenn man einen Taster normal entprellt ist die Entprellzeit unabhängig von der gewünschten Pulszeit oder was auch immer. Das Event "Taster wurde gedrückt" wird doch erst nach der Entprellzeit aktiv und damit wird die Pulsform oder sonstwas ausgelöst.
da meine Arduino Programmier Kenntnisse leider noch auf dem Anfänger Level sind, verwende ich für die Steuerung und das Sound Modul 2 Nano. Ich traue mir nicht zu, die zwei Sketche zu einem zu verbinden. Da das Sound Modul einen Impuls von ca. 500 ms braucht, um zu starten, muss ich den Dauer Impuls von dem Steuerungs Modul in einen kurzen umwandeln. Ich wollte das Problem so einfach wie möglich dokumentieren, um unnötiges hin und her schreiben zu vermeiden. Tut mir leid, dass dies nicht von jedem verstanden wurde. Bitte um Entschuldigung.
Alle Zeilen aus beiden setup() gehören in das Kombinations-setup(). Doppelungen (z.B. Serial.begin()) nur einmal ausführen
Alle Zeilen aus beiden loop() gehören in das Kombinations-loop()
Alle anderen Header-Includes, globale Konstanten, Variablen, Klassen, Objekte und Funktionen komplett übernehmen
Evtl. vorhandene gleiche Namen in beiden Ausgangssketches müssen in einem der beiden umbenannt werden
Resourcen (Pins) überprüfen, ob Doppelnutzung vorliegt; ggf. entzerren. I2C dürfen beide benutzen, solange die angeschlossenen Geräte verschieden sind. SPI geht auch, jedes externe Gerät braucht einen eigenen Chip Select.
delay() sind mindestens schwierig, eher zu vermeiden und eigentlich doof.
kein Problem, musst dich dafür nicht entschuldigen. Probiere es wie wno158 schreibt. Ansonsten beide Sketche hier zur Verfügung stellen, geht per Drag & Drop.