Taster Zählen => min und maximalwert definieren

Hallo,

könnt ihr mir eventuell kurz weiterhelfen ?

Ich habe 2 Tasten (Taste_hoch und Taste_runter), welche ich beim Drücken gerne zählen möchte.
Der Sketch zum zählen funktioniert nun soweit.

Ich würde jetzt gerne den Zählbereich festlegen => d.h der Zähler soll nie unter 2 bzw. über 9 zählen (in meinem Sketch beginne ich von 3 aus zu zählen).

Wie könnte ich das am besten anstellen ?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int Taster_hoch = 6;
bool Taster_hochStatus;
bool hoch = 0;
const int Taster_runter = 7;
bool Taster_runterStatus;
bool runter = 0;
uint32_t aktMillis, altMillis;

int Zaehler = 3;

void setup()
{
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  // lcd.begin(20,4);
  Serial.begin(9600);
  pinMode(Taster_hoch, INPUT_PULLUP);
  pinMode(Taster_runter, INPUT_PULLUP);
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Zaehler");
  lcd.setCursor(0, 1);
  lcd.print(Zaehler);
  lcd.setCursor(0, 2);
  lcd.print(Zaehler * 1000);    // Zeitwert in ms

  aktMillis = millis();
  if (aktMillis - altMillis >= 30) {
    altMillis = aktMillis;
    hoch = Taster_hochStatus;
    Taster_hochStatus = digitalRead(Taster_hoch);
    if (Taster_hochStatus && !hoch)
    {
      Zaehler++;
      Serial.println(Zaehler);
    }

    runter = Taster_runterStatus;
    Taster_runterStatus = digitalRead(Taster_runter);
    if (Taster_runterStatus && !runter)
    {
      Zaehler--;
      Serial.println(Zaehler);
    }
  }
}

Sieh dir mal die for-Schleife an.
In den Beispielen der IDE oder hier im Forum unter Referenz

Hallo
Schaue dir in der Arduino-Referenz die MODULO Anweisung an.

p.s. Wobei sich die CONSTRAIN Anweisung besser eignet.

christian_auer_11:
könnt ihr mir eventuell kurz weiterhelfen ?
Der Sketch zum zählen funktioniert nun soweit.

Erst wenn die Taste losgelassen wird, wird der Zaehler angezeigt. Ist das so gewollt?

Ansonsten ist das eine Frage, für die es sicher hunderte Lösungen gäbe.
Eine:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const unsigned int maxZaehler = 9;
const unsigned int minZaehler = 2;
const int Taster_hoch = 6;
bool Taster_hochStatus;
bool hoch = false;
const int Taster_runter = 7;
bool Taster_runterStatus;
bool runter = false;
uint32_t aktMillis, altMillis;

int Zaehler = 3;

void setup()
{
  // lcd.init();                      // initialize the lcd
  lcd.backlight();
  // lcd.begin(20,4);
  Serial.begin(115200);
  pinMode(Taster_hoch, INPUT_PULLUP);
  pinMode(Taster_runter, INPUT_PULLUP);
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Zaehler");
  lcd.setCursor(0, 1);
  lcd.print(Zaehler);
  lcd.setCursor(0, 2);
  lcd.print(Zaehler * 1000);    // Zeitwert in ms

  aktMillis = millis();
  if (aktMillis - altMillis >= 30) {
    altMillis = aktMillis;
    hoch = Taster_hochStatus;
    Taster_hochStatus = digitalRead(Taster_hoch);
    if (Taster_hochStatus && !hoch && Zaehler < maxZaehler)
    {
      Zaehler++;
      Serial.println(Zaehler);
    }

    runter = Taster_runterStatus;
    Taster_runterStatus = digitalRead(Taster_runter);
    if (Taster_runterStatus && !runter && Zaehler > minZaehler)
    {
      Zaehler--;
      Serial.println(Zaehler);
    }
  }
}

Wie könnte ich das am besten anstellen ?

Ich würde mir wohl einen Datentypen bauen, welcher nur die gewünschten Werte annehmen kann.

my_xy_projekt:
Erst wenn die Taste losgelassen wird, wird der Zaehler angezeigt. Ist das so gewollt?

Ansonsten ist das eine Frage, für die es sicher hunderte Lösungen gäbe.

1000 Dank, deine Verbesserung vom Code funktioniert super :slight_smile:

Das der Zähler erst beim loslasen der Taste zählt stört mich nicht weiter, was wäre denn zu machen, damit schon beim Drücken hochgezählt wird ?
LG
Christian

christian_auer_11:
was wäre denn zu machen, damit schon beim Drücken hochgezählt wird ?

Versuche mal dies:

   Taster_hochStatus = !digitalRead(Taster_hoch);
...
    Taster_runterStatus = !digitalRead(Taster_runter);

Bitte das Ausrufezeichen als Invertierung beachten!

Hallo
und nun noch die Ausgabe zum LCD in die If-Schleife :slight_smile:

paulpaulson:
... die If-Schleife

Gibt es nicht!

paulpaulson:
If-Schleife

JA

na klar gibt es die, das ist eine ge"Fork"te :slight_smile:

christian_auer_11:
Das der Zähler erst beim loslasen der Taste zählt stört mich nicht weiter, was wäre denn zu machen, damit schon beim Drücken hochgezählt wird ?

Auch da gibt es hunderte Möglichkeiten....

Eine wäre die folgende.
Wenn Den Code so nimmst, kannst Du in Zeile 36 am Ende die Klammer entfernen UND in Zeile 37 die // entfernen.

Den Effekt merkst Du bei gedrückter Taste.
Das "Repeat" stellst mit der Variable tick ein. Die ist gleichzeitig Dein "debounce".

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int Taster_hoch = 6;
const int Taster_runter = 7;

const unsigned int maxZaehler = 9;
const unsigned int minZaehler = 2;
const int tick = 300; // Wert in ms
unsigned long lastmillis;
bool lastread = false;

int Zaehler = 3;

void setup()
{
  // lcd.init();                      // initialize the lcd
  lcd.backlight();
  // lcd.begin(20,4);
  Serial.begin(115200);
  pinMode(Taster_hoch, INPUT_PULLUP);
  pinMode(Taster_runter, INPUT_PULLUP);
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Zaehler");
  lcd.setCursor(0, 1);
  lcd.print(Zaehler);
  lcd.setCursor(0, 2);
  lcd.print(Zaehler * 1000);    // Zeitwert in ms

  if (millis() - lastmillis > tick)
//    && digitalRead(Taster_hoch) && digitalRead(Taster_runter))
    lastread = false;

  if (!digitalRead(Taster_hoch) && !lastread && Zaehler < maxZaehler)
  {
    Zaehler++;
    lastmillis = millis(); lastread = true;
  }
  if (!digitalRead(Taster_runter) && !lastread && Zaehler > minZaehler)
  {
    Zaehler--;
    lastmillis = millis(); lastread = true;
  }
  Serial.println(Zaehler);
}

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