Hast du dich schon per Google über endliche Automaten kundig gemacht?
Generationen von Programmierer haben sich da schon einen Kopf drum gemacht.
Und jetzt bist du dran

Ja, ich weiß, vieles im Netz ist sehr theoretisch.
Zu theoretisch.
---------
Du solltest dir mal ein Bild malen.
Mit diesen Dingen:
Die nötigen Zustände (um dein Ziel zu erreichen)
Übergänge (welche und warum Zustandswechsel)
Oder erst einmal eine Liste der Zustände:
(man kann hier im Forum so schlecht malen)
1. LampeIstAus
2. HochDimmen
3. LampeIstAn
4. RunterDimmen
Diese Zustände sollten doch für deinen Zweck reichen, oder?
Dann gehts jetzt an die Übergänge:
Im Zustand 1 wird auf den HochDimTastenDruck gewartet. Wenn gedrückt wird zu Zustand 2 gewechselt.
Im Zustand 2 wird die Helligkeit erhöht. Wenn voll an wird zu Zustand 3 gewechselt.
Im Zustand 3 wird auf den RunterDimTastenDruck gewartet. Wenn gedrückt wird zu Zustand 4 gewechselt.
Im Zustand 4 wird die Helligkeit verringert. Wenn total aus wird zu Zustand 1 gewechselt.
Die Lampe beginnt im Aus Zustand.
Die Zustände rauf und runter dimmen können nicht unterbrochen werden.
Stimmt das so?
Entsprechen die Regeln deinen Vorstellungen?
Wenn ja, hast du da jetzt ein Muster, welches man in Software gießen kann.
In meinem Stil würde das dann so aussehen:
const unsigned int dimpin = 3; // pin -- R -- LED -- GROUND
const unsigned int UpTaster = 4; // Pin -- Taster -- GROUND
const unsigned int DownTaster = 2; // Pin -- Taster -- GROUND
const unsigned int dimSpeed = 50; // mS pro dimschritt
struct Automat
{
typedef enum AutomatenStatus {A_On, A_Off, A_DimUp, A_DimDown};
AutomatenStatus status;
unsigned long lastHit;
byte dim;
Automat() // Konstruktor
{
pinMode(UpTaster, INPUT_PULLUP);
pinMode(DownTaster, INPUT_PULLUP);
lastHit = millis();
dim = 0;
status = A_Off;
analogWrite(dimpin,dim);
}
void handle()
{
switch (status)
{
case A_Off:
if (!digitalRead(UpTaster)) // low = taster gedrückt
{
status = A_DimUp;
lastHit = millis();
}
break;
case A_DimUp:
if (millis() - lastHit > dimSpeed)
{
lastHit = millis();
dim++;
analogWrite(dimpin,dim);
}
if (dim == 255)
{
status = A_On ;
}
break;
case A_On: if
(!digitalRead(DownTaster)) // low = taster gedrückt
{
status = A_DimDown;
lastHit = millis();
}
break;
case A_DimDown:
if (millis() - lastHit > dimSpeed)
{
lastHit = millis();
dim--;
analogWrite(dimpin, dim);
}
if (dim == 0)
{
status = A_Off;
}
break;
}
}
};
Automat Dimmer;
void setup()
{
}
void loop()
{
Dimmer.handle();
}
*ungetestet*