Zähler, der rauf und runter zählen kann

Hi, angenommen man hat 2 Taster. Drückt man den ersten Taster, dann soll ein Timer bis 10 Sekunden zählen. Wenn in diesen 10 Sekunden jedoch der Taster losgelassen wird, dann soll sich der Timer seinen Zustand merken. Drückt man den gleichen Taster soll normal mit dem Zählen fortgefahren werden. Wenn jedoch der andere Taster gedrückt wird, soll der Timer hinunter zählen.

Wie kann man das am Besten programmiertechnisch lösen?

Danke schon mal im Vorhinein :)

abvd: ... Wie kann man das am Besten programmiertechnisch lösen? ...

Zeichne das, was Du machen möchtest, als Programmablaufplan auf (Wikipedia-Seite). Wenn Du das hast, ist es zum fertigen Programm nicht mehr weit.

Gruß

Gregor

z.B. so:

// In der Loop

  buttonStateDown = digitalRead(buttonDown);
  buttonStateUp = digitalRead(buttonUp);

  if (buttonStateUp == LOW) {
  Zaehler ++
}

  if (buttonStateDown == LOW) {
  Zaehler --
}

Dies ist Beispielcode, nicht getestet. Die Variablen müssen natürlich richtig deklariert werden.

Da fehlt das Entprellen der Taster

Aber er möchte dass automatisch gezählt wird solange der Taster gedrückt ist. Das ist etwas komplizierter.

Wir haben das mal kurz auf einen Zettel gezeichnet. :) https://imageshack.com/i/hlXAbAeAj ist nicht schön aber besser geht es gerade nicht :D lg.

Serenifly: Da fehlt das Entprellen der Taster

Aber er möchte dass automatisch gezählt wird solange der Taster gedrückt ist. Das ist etwas komplizierter.

Das stimmt, Entprellen habe ich dabei nicht berücksichtigt.

Nur warum sollte das so nicht gehen? (ich habe es leider nicht testen können) Es muss nur die Begrenzung bei 10 noch eingesetzt werden.

Der zählt evtl. etwas schnell, aber das ist durch das entprellen und einen Timer doch langsamer zu bekommen.

Da muss eine Verzögerung rein und die darf nicht blockieren

Serenifly: Da muss eine Verzögerung rein und die darf nicht blockieren

Ja, ok das versteh ich und hatte ich mir auch so gedacht. millis ist sein Freund.

Was meint ihr mit Entprellen? Und warum spielt das überhaupt für das gewünschte Programm eine Rolle? und was genau ist millis?

abv_dipl_htl:
Was meint ihr mit Entprellen? Und warum spielt das überhaupt für das gewünschte Programm eine Rolle?
und was genau ist millis?

Sorry, aber bei diesen Fragen kann ich nur antworten:

Bitte lerne die Basics.

Wenn du mit den Beispielen der IDE durch bist, dann wird dir einiges klarer und die Grundlagen sind ein wichtiger Bestandteil um selbst Programme zu erstellen.

Entprellen ist in dieser Funktion wichtig , da jeder Taster (mechanischer Kontakt) beim Schließen prellt und damit mehrfach Kontakt gibt. Drückst du den Taster vermeintlich ein mal, können so sehr viele Impulse entstehen.

Und millis, lies dir dazu “BlinkWithoutDelay” durch, da wird es beschrieben.

abv_dipl_htl: Was meint ihr mit Entprellen? Und warum spielt das überhaupt für das gewünschte Programm eine Rolle? und was genau ist millis?

„Prellen“ ist das schnelle Wechseln zwischen „an“ und „aus“, wenn der Taster noch nicht ganz gedrückt ist. Bei Tastaturen ist das besonders blöd, weil man z. B. drei Buchstaben bekommt, wenn man nur einmal gedrückt hat. Entprellen macht man zum Beispiel, indem man zwischen dem ersten „an“-Signal und dem „Akzeptieren“ des Tastendrucks eine kurze Pause macht. Dabei geht es oft nur um sehr kurze Pausen (Millisekunde oder so). „millis“ ist die Abfrage eines Zählers, der ständig läuft (auch, wenn sonst gerade ein Programm abgearbeitet wird). Der Vorteil von millis besteht darin, dass man Pausen in ein Programm einbauen kann, ohne delay() benutzen zu müssen. Mit delay() wird der Programmablauf vollständig gestoppt („blockiert“).

Gruß

Gregor

gregorss: „Prellen“ ist das schnelle Wechseln zwischen „an“ und „aus“, wenn der Taster noch nicht ganz gedrückt ist.

Genauer ist es das mechanische Prellen der Kontakte. Wenn man einen Kontakt schließt dann spring er ein paar mal hin und her bis er richtig aufliegt.

abvd:
Wir haben das mal kurz auf einen Zettel gezeichnet. :slight_smile:
https://imageshack.com/i/hlXAbAeAj

Pluralis Majestatis, Euer Ehren?

Oder seid Ihr wirklich ein Team aus mehreren Leuten und absolut keiner von Euch kann irgendeine Zeile Arduino-Code unfallfrei geradeaus programmieren, obwohl ein (halbwegs sinnvolles) Ablaufdiagramm vorliegt?

// Buttons anschliessen: 
// Ein Anschluss an GND, der andere an den definierten Pin
const byte taster1Pin=2;
const byte taster2Pin=3;

const long maxCount=10000; // maximaler Zählerstand in Millisekunden

void setup()
{
  Serial.begin(9600); // zum seriellen Debuggen
  Serial.println("Good night and good luck");
  pinMode(taster1Pin, INPUT_PULLUP);
  pinMode(taster2Pin, INPUT_PULLUP);
}

unsigned long lastMillis;
long countMillis;
void loop()
{
  long nowMillis= millis(); // aktuellen Stand des Millisekundenzählers
  long diff= nowMillis-lastMillis; // Veränderung?
  if (diff==0) return; // keine Veränderung ==> loop verlassen
  boolean displayNeedsUpdate=false;
  lastMillis+=diff; // letzten Stand des Millisekundenzählers merken
  
  // taster1Pin abfragen und hochzählen falls gedrückt
  boolean taster1= (digitalRead(taster1Pin)==LOW);
  if (taster1) // Taster1 gedrückt?
  {
    countMillis+=diff; // hochzählen
    if (countMillis>maxCount) countMillis=maxCount; // obere Grenze beachten
    displayNeedsUpdate=true;
  }
  
  // taster2Pin abfragen und runterzählen falls gedrückt
  boolean taster2= (digitalRead(taster2Pin)==LOW); 
  if (taster2) // Taster2 gedrückt?
  {
    countMillis-=diff;  // rimterzählen
    if (countMillis<0) countMillis=0; // untere Grenze 0 beachten
    displayNeedsUpdate=true;
  }

  // Zählerwert beo Bedarf irgendwo anzeigen, z.B. auzf Serial:
  if (displayNeedsUpdate) Serial.println(countMillis/1000.0,3);  
}

Wenn die zeitliche Auflösung zu gering ist, also die ausgegebenen Zählerstände zeitlich zu weit auseindander liegen, kannst Du die Aktualisierungsrate des Zählers erhöhen, indem Du die Baudrate (im Programm und im seriellen Monitor) auf jeweils 115200 Baud setzt.

Serenifly: Genauer ist es das mechanische Prellen der Kontakte. Wenn man einen Kontakt schließt dann spring er ein paar mal hin und her bis er richtig aufliegt.

Ist dieses Prellen tatsächlich mechanisch bedingt? Ich dachte bislang, dass es die „Art“ von Prellen ist, mit der man (alte) Lichtschalter dazu bringen konnte, eine Glühbirne zu „dimmen“.

Gruß

Gregor

gregorss: Ist dieses Prellen tatsächlich mechanisch bedingt? Ich dachte bislang, dass es die „Art“ von Prellen ist, mit der man (alte) Lichtschalter dazu bringen konnte, eine Glühbirne zu „dimmen“.

War das nicht mechanisch?

HotSystems: War das nicht mechanisch?

Dem Klang nach nicht. Das „Britzeln“ klang nicht nach „Aufschlag“.

Gruß

Gregor

Prellen ist wirklich ein mechanisches Hüpfen des beweglichen Teils des Kontakts auf dem feststehenden da der bewegliche Teil mittels Feder an den feststehenden gedrückt wird.

Es gibt einige Konstruktionen die nicht prellen. Eine Möglichkeit davon sind Reedkontakte (2 metallzungen ziehen sich magnetich durch ein externes Magnetfeld an .

Grüße Uwe

Ich denke mal hier wird nichts "britzeln", hier muss nur vernünftig entprellt werden.

Und hier kann auch ein zittriger Finger schuld sein. ;)

Dem Klang nach nicht. Das „Britzeln" klang nicht nach „Aufschlag".