Go Down

Topic: Zeitverzögerte Auswertung von Eingängen? (Read 676 times) previous topic - next topic

4711

OK, sorry, das hab ich dann nicht kapiert. Dann is ja gut! Danke!

combie

#31
Jun 20, 2019, 08:34 am Last Edit: Jun 20, 2019, 05:44 pm by combie
Quote
Ggf. meinen Versuch da Oben Mal ansehen?
Hach...
Ich habe ihm auch meine schönste und einfachste Entprellung angeboten.
Aber: Schmeckte nicht!
Nobody is perfect!
(und selbst der nicht zu 100%)

4711

Hach...
Ich habe ihm auch meine schönster und einfachste Entprellung angeboten.
Aber: Schmeckte nicht!
Hmm, dein Beispiel kann ich da nur schwerlich lesen, mit den Libs und dem C++ Style.
Einen einfachen habe ich ja nachgebaut, das Array ging noch ab.
Oder kapier ich was nicht ?

ElEspanol

Ich habe ihm auch meine schönster und einfachste Entprellung angeboten.
Aber: Schmeckte nicht!
Das kommt noch. Warte mal so 5 Jahre und 4000 postings.

P.S. Um alle Kommentaren vorzubeugen, ich beziehe mich nicht im entferntesten auf die Intelligenz/Interesse/Lust des TE, sondern auf die Programmierkenntnisse von combie.

4711

So ist es, meine Programmierkenntnisse sind jetzt ein paar Tage jung ;)
Ich möchte auch kein Profi werden, die Umsetzung meiner Interessen mit eurer Hilfe reicht mir völlig.
Und so wie sich das alles abzeichnet, wird das auch klappen.

postmaster-ino

Hi

Das ist allerdings schade, daß Du nicht darauf zielst, dem Steinchen das Maximum entlocken zu wollen.
(wobei combie in einer gaaanz anderen Liga spielt - wobei - in Ligen, in Denen ich kaum als Zuschauer erlaubt bin, spielen hier Einige ;) )
Wenn ich aber so weit bin, werde ich den ganzen Kram schamlos abkupfern ... versprochen!

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

combie

Herzlichen Dank für die Blumen!

Ja, ein bisschen fachliche Kompetenz habe ich mir wohl erarbeitet.
Mit C++ bin ich allerdings erst hier, mit Arduino, angefangen.

Was die CombieTimer Lib betrifft, folgt sie einigen Mantras, welche ich mir auch schon vor meiner C++ Zeit ins Hirn gebrannt habe:

> Wenn du irgendwas drei mal auf eine bestimmte Art gemacht hast,
> dann mach eine Funktion oder Klasse draus.

> Wenn du eine Funktion/Klasse baust, sorge für eine möglich simple Schnittstelle
> Damit das Ding von jedem benutzt werden kann.

> Bedingungen und Blockschachtelungen:
> 1 Ebene, schön. 2 Ebenen, ok geht noch. 3 Ebenen, muss das? 4 Ebenen, igitt!


Der EntprellTimer meiner Lib ist ganz einfach zu benutzen.
Ok, von innen mag er etwas kompliziert aussehen, aber da muss man ja nicht hinschauen.
Nobody is perfect!
(und selbst der nicht zu 100%)

4711

Klein anfangen, groß werden. Ja nicht den Spaß an der Sache verlieren, darum die Ziele in griffweite halten.
Heute noch ist das Interesse, dass es einfach nur funktioniert. Morgen, wer weiß ;)

Ist es das?
Code: [Select]
#include <CombieTimer.h>
using Combie::Timer::EntprellTimer;

const byte taster =  2; // taster gegen GND schaltend

EntprellTimer entprellen(200);   // in der Praxis wird man wohl eher 20ms verwenden

void setup()
{
 pinMode(LED_BUILTIN,OUTPUT);   
 pinMode(taster,INPUT_PULLUP);
}

void loop()
{
  // die LED zeigt das, vom prellen bereinigte, Signal
  digitalWrite(LED_BUILTIN,entprellen(!digitalRead(taster)));  // invers, wg. pullup
}


das ist das Kunststück richtig ?
Code: [Select]
entprellen(!digitalRead(taster))

damit müsste ich meinen Merkerzuweisungen nur das entprellen( ) hinzufügen ?

combie

#38
Jun 20, 2019, 03:36 pm Last Edit: Jun 20, 2019, 04:05 pm by combie
Quote
damit müsste ich meinen Merkerzuweisungen nur das entprellen( ) hinzufügen ?
Ja, denke schon...



Code: [Select]

// oder so
bool merker = entprellen = not digitalRead(taster);


Natürlich benötigt jede Taste seinen eigenen Entpreller.
Nobody is perfect!
(und selbst der nicht zu 100%)

4711

Also, wenn man es denn verstanden hat, ist es die einfachste Möglichkeit! Danke.
Lib einfügen
entprellen Aufruf zu jedem Pin-Lesen
fertig

könnte man verm. auch in eine Schleife packen, weniger Zeilen...

combie

Quote
ist es die einfachste Möglichkeit
Ist es!

Und, wie du siehst, ist es nicht C++, oder die Komplexität des Entprellers, welche dich erst davon abgehalten hat, ihn zu nutzen, sonder eher ein innerer Widerstand.
Und diese, kann nur der Eigentümer der Widerstände bearbeiten.
Was du ja jetzt wohl erfolgreich gemeistert hast.

Von außen, kommt man/ich da nicht ran.....
Nobody is perfect!
(und selbst der nicht zu 100%)

4711

Ja schon, aber wenn man das Wissen nicht hat, wie sollst das erkennen geschweige verstehen.
Man kann einfach nicht auf ein galoppierendes Pferd aufspringen, ich zumindest nicht.
Ich muss es häppchenweise machen und ohne die richtungsweisende Führung, bist halt im Wald.

Ich hab grad das Gefühl, dass ich auf einen Schnellzug aufspringe ;)
So lange ihr mir nicht abspringt, fährt der Zug!

C++ steht auf der Todo, aber so schnell geht das nicht, das wird seine Zeit brauchen.
Aktuell möchte ich nur nicht die Lust und Laune verlieren und mal das gesetzte Ziel schaffen.

Die Schleife fehlt mir noch, dann würde ich meinen wäre diese Aufgabenstellung gelöst.

Doc_Arduino

#42
Jun 20, 2019, 05:15 pm Last Edit: Jun 20, 2019, 05:18 pm by Doc_Arduino
Hallo,

habe mich heute auch rangesetzt. Ergebnis ist ähnlich wie das von postmaster. Wenn es mehrere Eingänge sein sollen, würde ich auch ein struct array erstellen und alles in einer for erschlagen. Im Endeffekt wirds dann recht zügig zu einer Klasse.

Code: [Select]
const byte pin_Taster = 2;
const byte pin_Led = 13;

void setup(void) {
  pinMode(pin_Taster, INPUT_PULLUP);
  pinMode(pin_Led, OUTPUT);
}

void loop(void) {
  
  bool var = update_Taster(pin_Taster, 100);
  digitalWrite(pin_Led, var);

}


// ****** Funktionen ******

bool update_Taster (const byte pin, const byte zeit)                        
{
  static unsigned long last_ms = 0;
  static bool last_state = true;
  static bool new_state = true;
  
  unsigned long ms = millis();

  bool state = digitalRead(pin);    // pin einlesen

  if (state != last_state) {        // Hat sich Eingangspegel geändert?
    last_ms = ms;                   // Wenn ja aktuelle Zeit
    last_state = state;             // und diesen Zustand merken
  }
  
  if (ms - last_ms >= zeit) {       // Blieb letzter Zustand für x ms stabil ?
    new_state = state;              // Wenn ja aktuellen Zustand merken
  }

  return new_state;                 // und zurückgeben
}


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

... und die Klasse ist fertig   ;)

Code: [Select]

// https://forum.arduino.cc/index.php?topic=621568.0

class Sensor
{
  private:
    const byte pin;
    bool last_state;
    bool new_state;
    const byte debounce;    // max. 255ms, ansonsten auf unsigned int/long ändern
    unsigned long last_ms;

  public:
    // Konstruktor
    Sensor (byte p, unsigned long deb) :
      // Initialisierungsliste
      pin(p),
      last_state(true),
      new_state(true),
      debounce(deb),
      last_ms(0)
    {}

    // Methoden
    void init()
    {
      pinMode(pin, INPUT_PULLUP);
    }

    void entflattern ()
    {
      unsigned long ms = millis();
      bool state = digitalRead(pin);    // pin einlesen

      if (state != last_state) {        // Hat sich Eingangspegel geändert?
        last_ms = ms;                   // Wenn ja aktuelle Zeit
        last_state = state;             // und diesen Zustand merken
      }

      if (ms - last_ms >= debounce) {   // Blieb letzter Zustand für x ms stabil ?
        new_state = state;              // Wenn ja aktuellen Zustand merken
      }
    }

    bool get_state() { return new_state; }
};

Sensor sensoren[] = {
      {2, 100},   // pin, Entprellzeit
      {3, 90},
      {4, 110},
      {5, 80}
}; 


void setup()
{
  Serial.begin(9600);
     
  for (Sensor & s : sensoren)
  {
    s.init();
  }

}

void loop()
{
  for (Sensor &s : sensoren)
  {
    s.entflattern();
  }

  serieller_Monitor (500);      // nur zum sichtbar machen
}


void serieller_Monitor (const unsigned int INTERVALL)
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();

  if (ms - last_ms > INTERVALL)
  {
    last_ms = ms;
    for (Sensor &s : sensoren)
    {
      Serial.print(s.get_state() );
      Serial.print('\t');
    }
    Serial.println();
  }
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up