Variable hochzählen mit Taster druck

Hallo Zusammen,

ich steh gerade bei einer eigentlich Aufgabe auf dem Schlauch.
Ich möchte eine Zahl immer um eins hochzählen beim drücken des Tasters, egal wie lange ich den Taster drücke.
Mein Taster habe ich entprellt mit einem Pull-Up Widerstand.
Wie das hochzählen abläuft ist mir bewusst, nur wie ich es hinbekomme das die Variable nur um eins hochgezählt bekomme ich nicht hin.
Mein Taster ist LOW aktiv, also bei einem LOW Signal soll hochgezählt werden.

Schonmal vielen dank für eure Antworten im voraus.

Gruß
Andreas

Hallo
dann zeige mal deinen Sketch in Code Tags und im IDE vorher
mit CRTL-T formatiert.

Mit einem Pullup-Widerstand wird der Taster nicht entprellt.
Da brauchst du noch min. einen Kondensator. Besser ist es, du machst es per Software, also im Sketch.
Der Pullup-Widerstand ist dazu da, um den Pin einen definierten Zustand zu geben, wenn der Eingang offen ist.

const int taster = 3;
int counter = 0;



void setup() {
  pinMode(taster, INPUT);
  Serial.begin(9600);
  Serial.println("beginn");
}

void loop() {

  if (digitalRead(taster) == LOW) {
    Serial.println("virtualcount");
   counter++;
  }

  Serial.println(counter);
}

Du hast keine Tastenentprellung drin, siehe meinen vorherigen Post.

Hast du den Taster hardwaremäßig entprellt ?

Nein das habe ich noch nicht das muss ich noch machen, habe bis jetzt dem Pin immer nur einen definierten Pegel gegeben.

Ich gucke nachher was ich noch in der Sketchkiste habe

Dann lies bitte alles:
In Hardware z.B. So. In Software mit einem delay oder der Lib debounce.

Und wieso schreibst du, du hast ihn entprellt ?

Vorlage: Variable bei längerem Tastendruck schnell hochzählen - #5 by combie
Dort finden sich auch die Libs.

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>


#include <CombieTypeMangling.h>
using namespace Combie::Millis;


using CounterType = Combie::Tools::Counter<unsigned long>;
CounterType  counter;


Combie::Pin::TasterGND<3>        taster; // Taster gegen GND geschaltet
Combie::Timer::EntprellTimer     entprellen {20_ms};
Combie::Tools::FlankenErkennung  flankenerkennung;




void setup() 
{
    Serial.begin(9600);
    taster.initPullup();
    counter.onCount([](CounterType &counter)
                    { 
                      Serial.print("Ereignis Nr: ");
                      Serial.println(counter);
                    });
}

void loop() 
{ 
  counter = flankenerkennung = entprellen = taster;
}

Und wieso schreibst du, du hast ihn entprellt ?

Sorry war mein Fehler.

Ok, da du jetzt alles zusammen hast, kann es ja los gehen.

Danke euch!

Hallo
ich war faul und habe den Zähler in den "debouncer" eingebaut. :slight_smile:

// https://forum.arduino.cc/t/variable-hochzahlen-mit-taster-druck/862480/4
// https://www.arduino.cc/reference/en/
//---------- Declarations
const int HeartBeat {LED_BUILTIN};
const byte ButtonPin = A0; 
//---------- 
void setup() { // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode (HeartBeat, OUTPUT);
  pinMode (ButtonPin,INPUT_PULLUP); 
}
void loop() {  // put your main code here, to run repeatedly:
  digitalWrite(HeartBeat, millis() / 500 % 2);
static unsigned long buttonMillis; 
const unsigned long buttonDebounce=20; 
  if (millis()-buttonMillis>= buttonDebounce) {
    buttonMillis=millis(); 
    bool statePin=!digitalRead(ButtonPin);
    static bool statePinOld=0; 
    if (statePinOld!=statePin) {
      statePinOld=statePin;
      static unsigned int counter;
      if (statePin) Serial.println(++counter); 
    }
  }
}

Danke dir @paulpaulson .

Das ist nicht schick. Mehr noch, ich halte das für gefährlich.

Mein Vorschlag. Achtung, ich formatiere etwa anders.

const byte taster = 3;
int counter = 0;
void setup()
{
  pinMode(taster, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("beginn");
}

void loop()
{
  zaehler();
}

void zaehler()
{
  const unsigned long bouncetime = 40; // Zeiten in ms
  static bool gedrueckt = false;
  static unsigned long lastmillis = 0;

  if (digitalRead(taster) == LOW)
  {
    if (gedrueckt == false)
    {
      lastmillis = millis();
      counter++;
      gedrueckt = true;
      Serial.print("virtualcount: ");
      Serial.println(counter);
    }
  }
  else if (millis() - lastmillis > bouncetime)
  {
    gedrueckt = false;
  }
}

das ist schön für dich

Das ist nicht schön für den Anwender, der sich verzweifelt fragt, warum der Pegel auf dem Pin nicht das tut.

Na dann..

Ok,

Und damit diesen Beitrag erneut als editiert markiert.

Dann eben Deine Einlassung so:

Und nein - für mich ganz bestimmt nicht. Das solltest Du wissen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.