Ein Taster bei jedem Click anderen Befehle ausführen lassen

Hallo :smiley:

Ich arbeite zurzeit an meiner Projektarbeit für die Schule. Ich möchte einen Taster dazu bringen das wenn ich ihn zum 1. mal anclicke das mein Licht angeht. Beim 2. Mal anclicken soll das Licht (also die Led) etwas dunkler werden. Beim 3. und 4. mal soll es noch dunkler werden also von 100% auf 75% auf 50% auf 25% helligkeit. Beim 5. mal anclicken soll es wieder ausgehen.

ist es den überhaupt möglich eine Led so zu "dimmen" ?
Und geht es das ich den Schalter so programmiere das er bei jedem click was anderes macht?

Kenne mich um ehrlich zu sein nicht so richtig damit aus. Hab auch versucht in meinem Arduino Heft was zu finden aber da steht nichts von so einem Programm.

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.

schau dir mal diese Beispiele in der IDE an:

State Change Detection
Debounce

Hallo mini_taigaaa

Herzlich Willkommen im weltbesten Arduinoforum.

Poste am Besten deinen aktuellen Sketch, damit wir sehen können wie wir helfen können.

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Ja
und
Ja.

Wie weit ist Deine Erfahrung mit Tastern und LED?
Auf welchem Controller soll das nachher funktionieren?

nicht wirklich weit, wir haben in der Schule nicht viel mit Arduino gearbeitet leider :frowning:

und auf arduino uno warscheinlich

Wenn ich dir zeigen würde, wie das bei mir aussieht, bringt dich das vermutlich keinen Millimeter weiter.

Tipp:
Die Sprache, welche du verwendest, nennt sich C++.
C++ in der Variante C++11

Das Problem ist, dass es mehr Möglichkeiten gibt, etwas zu machen als in ein Heft passt.
Das gilt sogar für das Internet mit den Millionen Beispielen, die du dort finden kannst.

Und für jede mögliche Funktion gibt es zig Varianten, wie man es machen kann.
@combie s Art zeichnet sich dadurch aus, dass man gar nichts sieht. Das nennt sich Kapselung, ist elegant, hilft dir aber nicht weiter.

  1. "dimmen" ist schon der richtige Ausdruck, da solltest du viel finden.
    Leider geht beim Uno analogWrite nicht mit der eingebauten LED, da müsstest du dich entscheiden, ob du einen anderen Pin, Vorwiderstand und LED nimmst, oder die eingebaute LED anders zum vermeintlich schwächer leuchten bringen willst.

  2. "Bei jedem Click eine andere Funktion"
    Mach mal, dass bei "jedem Click" eine Zeile im SerialMonitor ausgegeben wird. Das ist schon schwierig. ( @noiasca's Tip "state change detection") Wenn das geht, kannst du ja bei jeder Ausgabe eine Zahl um eins hochzählend ausgeben.
    Dann bist du schon ziemlich nah dran.

Danke für die Blumen!
Kapselung ist nicht der einzige Aspekt.
Modularisierung, Wiederverwendung und Flachheit spielen auch eine Rolle.
z.B. hat meine Variante nur ein if an der Oberfläche und keine Schleifen.

Schalter sind doof. Die kann man nicht programmieren.
Tipp:
Du willst keine 5 verschiedenen Funktionen/Befehle. sondern 5 verschiedene Werte ausgeben.
Es bietet sich ein Array an.

const int ledPin = 9; // Pin, an dem die LED angeschlossen ist
const int buttonPin = 2; // Pin, an dem der Taster angeschlossen ist
int brightness = 0; // Variable zur Speicherung der Helligkeit
int buttonState = 0; // Variable zur Speicherung des aktuellen Tasterzustands
int lastButtonState = 0; // Variable zur Speicherung des vorherigen Tasterzustands

void setup() {
  pinMode(ledPin, OUTPUT); // Der Pin, an dem die LED angeschlossen ist, wird als Ausgang konfiguriert
  pinMode(buttonPin, INPUT); // Der Pin, an dem der Taster angeschlossen ist, wird als Eingang konfiguriert
}

void loop() {
  buttonState = digitalRead(buttonPin); // Lese den aktuellen Tasterzustand

  // Wenn der Taster gedrückt wird
  if (buttonState != lastButtonState && buttonState == HIGH) {
    brightness += 25; // Erhöhe die Helligkeit um 25%
    if (brightness > 100) {
      brightness = 0; // Wenn die maximale Helligkeit erreicht ist, setze sie auf 0 zurück
    }
    analogWrite(ledPin, (brightness / 100.0) * 255); // Setze die Helligkeit der LED entsprechend der aktuellen Variable
  }

  lastButtonState = buttonState; // Speichere den aktuellen Tasterzustand für den nächsten Durchlauf
  delay(50); // Warte kurz, um Fehlauslösungen durch Prellungen zu vermeiden
}

erstellt mit Chatgpt, getestet mit wokwi.

Warum ?

Weil ich mir den code den Anforderungen entsprechend generiert lassen habe, ihn mir durchgelesen habe, für gut befunden habe, aber aufgrund von Zeit/Hardwaremangel ihn nicht auf einem Arduino ausprobiert habe.

Entsorge das Bespiel.

Es funktioniert. Nachdem das Parameter für pinMode() angepaßt wurde.

Veröffentliche nur selbsterstellte und getestete Sketche.

und was genau funktioniert nicht?

habe das ganze in wokwi nachgebaut und da funktioniert es einwandfrei

Es ist unanständig, Fremdcode als eigenen auszugeben.
Auch wg. dem Urheberrecht.
Mit Quellenangabe ist das schon anständiger.

Ich poste auch ungetesteten Code.
Bei mir steht das auch dran, wenn ungetestet.

was soll da angepasst werden, da ist alles korrekt! So wie ich es gepostet habe funktioniert es.

ja sorry bin noch nicht so lange im Forum aktiv, aber man lernt jeden Tag gern dazu. Habe mein Beispiel entsprechend ergänzt.

Mit Trash erzeugt von CHATGBT macht du dir im Forum keine Freunde.

Ich bin hier nicht auf einer Partnerbörse und bin deswegen nicht auf das finden von Freunden hier im Forum angewiesen. Damit kann ich also leben. Und das sich hier im Forum die Elite gleich auf den Schlips getreten fühlt wenn es nicht nach ihrem Kopf geht, dass ist mir auch schon aufgefallen.
Aber anstatt hier alles schlecht zu reden, trage doch einfach mal was sinnvolles zum Thema bei und stelle meinen von mir gepostetetn (müll) code in den Schatten!
Weil mit Sicherheit, kann man aus der einfachen Aufgabenstellung auch eine Wissenschaftliche Arbeit machen und dieses dann mit Doktortitel abschließen, aber ganz ehrlich sollte es selbst der (müll) code von Chatgpt in diesem fall völlig tun und man kann sich mehrere Stunden Zeitintensives programmieren sparen.
Und am Ende (so meine Meinung) kommt es nicht drauf an wo der code herkommt, sondern das es funktioniert!

Aber ja um es zu perfektionieren, könnte man die LED im Setupbereich noch auf LOW setzen

Kein Problem!

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"

// meine Libs: https://forum.arduino.cc/uploads/short-url/vdTvKr7F8mHxi2F1J2plss2IKrv.zip
#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>

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



using Counter = Combie::Tools::Counter<byte>;

Counter            counter;

Combie::Pin::TasterGND<2>        wahlTaster; // Taster zwischen Pin und GND(invertierend)
Combie::Timer::EntprellTimer     wahlEntprell {20_ms};
Combie::Tools::FlankenErkennung  wahlFlankenerkennung;


constexpr byte leuchte {11};
constexpr byte wahlMoeglichkeiten {5};
constexpr byte wahl[wahlMoeglichkeiten] {0,255,175,150,50}; // helligkeitsstufen

void setup() 
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;
  wahlTaster.initPullup();
  counter.onCount( [](Counter &counter)   
                   {
                     if(counter >= wahlMoeglichkeiten) counter.reStart();
                     analogWrite(leuchte,wahl[counter]);
                     cout << "Auswahl: " << counter << "  Value: " << wahl[counter] << endl;
                   }
                 );
}

void loop() 
{
  counter = wahlFlankenerkennung = wahlEntprell = wahlTaster;
}