Kurzen Taster Impuls mit Moba Tools erzeugen

Hallo liebe Forum Freunde,

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"

schau mal:

Hallo,
also es gibt da zwei Fälle

  1. 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.
  2. 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.

Wie oft brauchst Du das denn.

Heinz

Hallo,

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.

Hallo trixi2000

Eigentlich werden nur zwei Timer benötigt. Einen zum Entprellen des Tasters und einen für die fünf Sekunden.

Probier mal aus:

const byte led1 =  5;                      //  LED Pin 5
const byte taster1 = A0;                   // Taster
struct TIMER
{
  uint32_t intervalMillis;
  uint32_t previousMillis;
};
TIMER debounce {20};
TIMER myDelay {5000};
void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(taster1, INPUT_PULLUP );
  digitalWrite( led1, LOW );               //  LED Pin 5 Aus
}
void loop()
{
  uint32_t currentMillis = millis();
  if (currentMillis - debounce.previousMillis >= debounce.intervalMillis)
  {
    debounce.previousMillis = currentMillis;
    uint8_t newState = digitalRead(taster1) ? LOW : HIGH;
    static uint8_t oldState = LOW;
    if (oldState != newState)
    {
      oldState = newState;
      if (newState == HIGH)
      {
        myDelay.previousMillis = currentMillis;
        digitalWrite (led1, HIGH);
      }
    }
  }
   if (currentMillis - myDelay.previousMillis >= myDelay.intervalMillis) digitalWrite (led1, LOW);
}

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Du könntest Fotos, Beschreibungen oder was auch immer auf Zeigt her eure geilen Projekte! veröffentlichen. Das ist eine Fundgrube für Inspirationen!

Ich mag auch die Moba Tools, wenn Du die eh am Start hast, könntest Du MoToButtons verwenden:

Programm
#define MAX8BUTTONS
#include <MobaTools.h>

const byte led1 =  5;                           // LED Pin 5 
const byte tasterPinNr [] = { A0 };             // Taster
const byte anzahlTaster = sizeof(tasterPinNr);  // Anzahl der angeschlossenen Taster

MoToTimer Blinkzeit2;
MoToButtons Buttons( tasterPinNr, anzahlTaster, 30, 500 );  // Entprellzeit in ms; Zeit ( in ms ) um zwischne kurzen und langen Tastendrücken zu unterscheiden.

void setup() 
{
  pinMode(led1, OUTPUT);
  pinMode(tasterPinNr[0], INPUT_PULLUP);
}

void loop() 
{
  Buttons.processButtons();

  if ( Buttons.pressed(0) && !Blinkzeit2.running() )      
  {
    Blinkzeit2.setTime( 500 );
    digitalWrite( led1, HIGH );                    //  LED Pin 5 Ein
  }
  if ( Blinkzeit2.expired() )                      // Zeit abgelaufen
  {
    digitalWrite( led1, LOW);                      //  LED Pin 5 Aus
  }
}

Was meint Dein Sound Modul dazu?

1 Like

Ich hab da noch ein Verständnisproblem zur Aufgabe: Was soll passieren, wenn der Button kürzer gedrückt wird?

Jede Betätigung soll einen 500ms Puls auslösen. Egal wie kurz oder lang auf den Taster gehämmert wird.

Dann braucht es kein debounce im klassischen Sinne.
Und ein retrigger ebenfalls nicht.

constexpr byte btnPin {3};
constexpr byte outPin {LED_BUILTIN};
constexpr uint32_t onTime {500};

bool isPressed;
uint32_t startTime;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\r\nStart...\r\n"));
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(outPin, OUTPUT);
}

void  loop()
{
  if (!digitalRead(btnPin))
  {
    if (!isPressed)
    {
      startTime = millis();
      isPressed = true;
    }
  }
  else if (millis() - startTime > onTime)
  { isPressed = false; }
  digitalWrite(outPin, millis() - startTime < onTime);
}

Das wärs doch - oder?

Hallo,

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? :wink:

Hallo liebe Forum Freunde,

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.

Nochmals Danke an allen.

Gruß Jürgen

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.

Ich bezog mich auf mein Codezeilen oben. Ich "entprelle" auch. Nur anders. :wink: egal - der Dreizeiler hats eh nicht geachafft.

Du hast die Vernunft angesprochen, ich die Emotionen. Natürlich gewinnt die Liebe zur Bibliothek :crazy_face:

1 Like

Hallo Doc_Arduino,

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.

Gruß Jürgen

Nur Mut!

Das Rezept ist im Prinzip ein Überschaubares:

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

Hallo,

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.

Wenn Du beide zeigst, könnte man abschätzen, wie schwierig eine Zusammenführung wird.