LED Zähler mit Taster, hilfe!

Hi,
ich versuche hier gerade mit meinem Arduino Nano zwei Punktestandzähler zu bauen und bräuchte etwas hilfe, da ich ein Anfänger im Bauen und programmieren von Microcontrollern bin.
Die Anzahl der "Aufblinker" jeder Led soll durch die Anzahl an Tastendrücker bestimmt werden (Wenn man den Taster das erste mal drückt soll dieser nur einmal blinken, wenn man ihn daraufhin ein zweites mal drückt soll er zweimal blinken, usw.). Nachdem einer der beiden Zähler eine gewisse Anzahl erreicht hat, bspw.:5, soll eine RGB-LED aufleuchten.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Hallo cs134

Herzlich Willkommen im Forum!

Die Hilfe ist ganzzzzzzzz einfach.
Zeige dein aktulles Programm, wohlformatiert und kommentiert in Codetags und einen Schaltplan dazu.

Hast du bereits Erfahrung im Programmieren in C++?

Danke,
einen Schaltplan habe ich bisher nur als Zkitzze (Bis auf den Teil mit der RGB LED da hab ich noch absolut keine Ahnung wie ich das machen soll). Ich denke aber die geplanten Anschlüsse der LEDs und Taster sind mit dem Programmcode zu verstehen:

const int led1=12; //LED des ersten Zählers wird auf Pin12 gesetzt
int taster1=11; //Taster des ersten Zählers wird auf Pin 11 gesetzt
int zaehler1=0; // Zählervariable des ersten Zählers, wird später um 1 pro Tasterdruck vergrößert
const int led2=10;//LED 2 des zweiten Zählers wird auf Pin 10 gesetzt
int taster2=9;//Taster 2 wird auf Pin 9 gesetzt
int zaehler2=0; //(siehe int zähler1)


void setup() {
  // put your setup code here, to run once:
pinMode(led1,OUTPUT); //setzt erste LED als Ausgang
pinMode(taster1, INPUT);//setzt ersten Taster als Eingang
pinMode(led2,OUTPUT); //setzt zweite LED als Ausgang
pinMode(taster2, INPUT);//setzt zweiten Taster als Eingang
}

void loop() {
  // put your main code here, to run repeatedly:
delay(20);
if(digitalRead(taster1)) == HIGH;
{
  zaehler1++; // Wenn der Taster1 gedrückt wird wird der Zähler um 1 vergrößert
}
if(zaehler1==0)
{
  led1=LOW; //Wenn der Taster nicht gedrückt wurde ist die LED1 aus
}
if(zaehler1==1)
{
  led1=HIGH; delay(1000); led1=LOW; //Wenn der Taster 1x gedrückt wurde geht die LED1 1x für 1 Sekunde an
}
if(zaehler1==2)
{
  led1=HIGH; delay(1000); led1=LOW; delay(1000); led1=HIGH; delay(1000); led1=LOW;//Wenn der Taster 2x gedrückt wurde geht die LED1 2x für jeweils 1 Sekunde an
}
if(zaehler1==3)
{
  led1=HIGH; delay(1000); led1=LOW; delay(1000); led1=HIGH; delay(1000); led1=LOW; delay(1000); led1=HIGH; delay(1000); led1=LOW;//Wenn der Taster 3x gedrückt wurde geht die LED1 3x für jeweils 1 Sekunde an
}
}
retun=0

Ich habe den Code noch nicht fertig geschieben, da ich keine Ahnung habe wie ich eine RGB LED programmiere, außerdem soll der Code in der loop nach dem selben Muster weiter gehen und danach kopiert und mit den Variablen für den zweiten Zähler hinten angefügt.

P.S.: Ich habe bereits einpaar einfache Programme mit C++ geschrieben.Vorformatierter Text

loop heißt loop, weil es in einer Schleife andauernd wieder dran kommt.
Das ist praktisch, weil ein Arduino-Sketch im Normalfall ewig läuft und nie fertig wird.
Wenn man den Sketch so schreibt, dass loop gar keine Zeit braucht, dafür andauernd immer wieder dran kommt, wird die Programmlogik sogar einfacher.
Dann kann man nämlich gleichzeitig auf Tastendrücken reagieren und Leds blinken lassen.

Das setzt die Variable zaehler auf 2 und das Ergebnis der if-Prüfung auf true.
Ein Vergleich wäre (zaehler==2)
Das ist bei C++ immer so, und keine Arduino-Besonderheit.

Und Variablennamen nur ohne Umlaute...

Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.

Gruß Tommy

So? (siehe Oben)

Ja. Du liest nirgendwo Deinen Taster ein.

Gruß Tommy

Meinst du sowas?

void loop() {
`zaehler=digitalRead(taster1);`

Hallo cs134

Dann sind das die besten Vorraussetzungen.

Programmiere ein Objekt für die Taste, Led und Zeitinformation zum Entprellen und für das Blinken.
Ein Service nimmt diese Informationen und verarbeitet diese entsprechend der geplanten Funktionen.
Dafür sind Klassen nicht notwendig, wenn du diese nicht magst.

Ich glaub sowas haben wir noch nicht gelernt

Hallo,
Zunächst sollten wir mal klären wie Du denn den Taster angeschlossen hast. Du möchtets den Taster auf HIGH abfragen, dann sollte ein Pulldown Widerstand angeschlossen sein. Wenn Dem so ist dann ändere das mal

void loop() {
  // put your main code here, to run repeatedly:
// if(taster1 == HIGH)
if(digitalRead(taster1))==HIGH;

Vermutlich musst Du dann den Taster noch irgendwie eintprellen damit Dein Zähler nicht ungewollt gleich mehrfach weiterzählt. Dazu kannst Du im einfachsten Fall mal um zu probieren ein delay(20) in den loop einbauen. Es gibt ein Beispiel in der IDE dazu Beispiel /02digital/ Debounce.

void loop() {
  // put your main code here, to run repeatedly:
// if(taster1 == HIGH)
delay(20);
if(digitalRead(taster1))==HIGH;

Ja ich hab den mit einem Pulldown Widerstand angeschlossen und danke für den Tipp.

Hallo cs134

Diese Übersicht ist extrem hilfreich.

Eigentlich braucht es Entprellen, Zustandserkennung usw.. Richtig.

Wenn man es mal vereinfacht und einen loop-Durchlauf 500 ms lang macht, zählt der Sketch eine gedrückte Taste alle halbe Sekunde um 1 hoch und kann in der Zeit schön einmal blinken.

unsigned int zahler = 0;
unsigned int blinks = 0;
void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); // Taster zwischen 2 und GND
  pinMode(13,OUTPUT);  // die blink - Led
}

void loop() {
  if (digitalRead(2) == LOW) {  // gedrückt
   Serial.println(++zahler);       // hochzählen
   blinks = 0;                               // Blink-Zähler neu starten
  } 
  delay(300);
  if (blinks < zahler ) {
     digitalWrite(13,HIGH);
     blinks++;
  }
  delay(200);
  digitalWrite (13, LOW);
}

Dass bei 5 mal Drücken was anderes passieren soll, lässt sich natürlich auch einbauen

Ok. Da das mit der RGB LED noch nciht ganz klar ist, fällt die erstmal unter den Tisch.
Du wilst eigentlich zwei gleiche Abläufe.
Dann fang mit einem an. Wenn der funktioniert, kannst Du durch einfaches erweitern der Variablen den Code weiternutzen ohne neu zu schreiben.

Ok, der Taster reagiert auf HIGH als Auslöser.

Dann sollte das mit einem Taster und einer LED eigentlich funktionieren.
Mit jedem Tastendruck wird der Zaehler hochgezählt. Das geht aber nur, wenn die LED nicht im Blinkmodus ist :wink:

Wenn der Zaehler 10 erreicht hat, wird wieder bei 0 begonnen.
Wenn das funktioniert, dann kannst Du darauf aufbauen.

const byte ledPin = 12; //LED des ersten Zählers wird auf Pin12 gesetzt
const byte tasterPin = 11; //Taster des ersten Zählers wird auf Pin 11 gesetzt
unsigned int zaehler = 0; // Zählervariable des ersten Zählers, wird später um 1 pro Tasterdruck vergrößert
unsigned int lastZaehler = 0;
unsigned long lastSwitchTime = 0;
bool isBlink = false;
const bool gedrueckt = HIGH;
bool lastSwitchValue = false;


void setup()
{
  pinMode(ledPin, OUTPUT); //setzt erste LED als Ausgang
  pinMode(tasterPin, INPUT);//setzt ersten Taster als Eingang
}

void loop()
{
  if (!isBlink)                                             // Nur, wenn es nicht blinkt
  { getTaste(); }                                           // wird die Taste abgefragt
  setLed();                                                 // Auswertung
}
//
void getTaste()
{
  const uint32_t bounceTime = 40;                            // Prellzeit in ms
  if (digitalRead(tasterPin) == gedrueckt)                   // Taste gedrückt?
  {
    if (lastSwitchValue == !gedrueckt)                       // vorher nicht gedrückt?
    {
      lastSwitchValue = gedrueckt;                           // merken, das gedrueckt
      lastSwitchTime = millis();                             // Schaltzeit merken
      zaehler++;                                             // zaehler aufaddieren
    }
  }
  else                                                       // Taste nicht gedrückt?
  {
    if (lastSwitchValue == gedrueckt &&                      // vorher gedrueckt?
        millis() - lastSwitchTime > bounceTime)              // und prellen ausgeschlossen
    {
      lastSwitchValue = false;                               // setze Merker zurück
    }
  }
}

void setLed()
{
  const uint32_t blinkTime = 1000;          // Ein Zyklus! Halbe Zeit an / andere Hälfte aus
  if (zaehler != lastZaehler && !isBlink)   // neuer zaehlerstand und blinkt nicht
  {
    isBlink = true;                         // Merker setzen
    lastZaehler = zaehler;                  // zaehler übernehmen
  }
  if (lastZaehler == 0 && isBlink)          // wenn runtergesezählt UND blinken aktiv
  {
    isBlink = false;                        // merker löschen
    if (zaehler < 10)                       // Wenn noch nciht am Ende
    { lastZaehler = zaehler; }              // zaehlerstand merken
    else                                    // wenn am Ende
    {
      lastZaehler = 0;                      // löschen
      zaehler = 0;
    }
  }
  if (isBlink)                              // Wenn blinken aktiv
  {
    if (millis() - lastSwitchTime > blinkTime) // Blinkgesamtzeit abgelaufen
    {
      digitalWrite(ledPin, HIGH);           // an machen
      lastZaehler--;                        // zaehler
      lastSwitchTime = millis();            // Zeit merken
    }
  }
  if (millis() - lastSwitchTime > blinkTime / 2 || // Auf halber Strecke
      zaehler == 0 ||                              // oder zaehler gelöscht
      !isBlink)                                    // oder blinken aus
  {
    digitalWrite(ledPin, LOW);              // Ruhe....
  }
}

Wieso soll ein externer Pullup-Widerstand schlecht sein?
Das erschließt mich sich mir nicht.
Wieso soll ein Kurzschluß (5V mit Masse) möglich sein?

Grüße Uwe

Du bist nicht der Einzige, der diese beiden Aussagen merkwürdig findet.
Sie zeugen nicht von Fachverständnis.

Gruß Tommy