Hallo sirpsyko
Hier kommt ein Beispiel für mehrere Sacklöcher beim Flipper.
Die Anzahl und Verhalten dafür ist im Sketch konfigurierbar.
//make configuration here
constexpr uint8_t InputPins[] {A0, A1, A2};
constexpr uint8_t OutputPins[] {9, 10, 11};
constexpr uint32_t DelayTimes[] {3000, 3000, 3000};
constexpr uint32_t MosFetTimes[] {500, 500, 500};
und hier kommt der Sketch:
//https://forum.arduino.cc/t/taster-betatigt-zeitversetzt-led-schalten/1355850
//https://europe1.discourse-cdn.com/arduino/original/4X/7/e/0/7e0ee1e51f1df32e30893550c85f0dd33244fb0e.jpeg
#define ProjectName "Taster betätigt, zeitversetzt LED schalten"
#define NotesOnRelease "Arduino MEGA tested"
// -- some useful text replacements used because I'm lazy with typing --
#define toogle(x) digitalWrite (x,digitalRead(x)?LOW:HIGH)
#define CheckPin(pin) Serial.print ("test output@pin:"),Serial.print(pin),digitalWrite(pin,HIGH),delay(100),digitalWrite(pin,LOW),delay(100),Serial.println (" .. done")
// make names
enum TimerEvent {NotExpired, Expired};
enum TimerControl {Halt, Run};
enum ButtonState {Released, Pressed};
enum OffOn {Off, On};
// make variables
uint32_t currentMillis = millis();
//make configuration here
constexpr uint8_t InputPins[] {A0, A1, A2};
constexpr uint8_t OutputPins[] {9, 10, 11};
constexpr uint32_t DelayTimes[] {3000, 3000, 3000};
constexpr uint32_t MosFetTimes[] {500, 500, 500};
//-----------------------
// make structures
//-----------------------------------------
struct TIMER
{
uint32_t interval;
uint8_t control;
uint32_t now;
void start(uint32_t currentMillis)
{
now = currentMillis;
control = Run;
}
void halt()
{
control = Halt;
}
uint8_t expired(uint32_t currentMillis)
{
uint8_t timerEvent = currentMillis - now >= interval and control;
if (timerEvent == Expired) now = currentMillis;
return timerEvent;
}
};
struct BUTTONFED
{
uint8_t led;
uint8_t button;
uint8_t stateOld;
TIMER debounce;
TIMER delayTime;
TIMER mosFetTime;
void make(uint8_t button_, uint8_t led_, uint32_t delayTime_, uint32_t mosFetTime_)
{
led = led_;
pinMode (led, OUTPUT);
button = button_;
pinMode (button, INPUT_PULLUP);
stateOld = digitalRead(button) ? Off : On;
debounce.control = Run;
debounce.interval = 20;
delayTime.control = Halt;
delayTime.interval = delayTime_;
mosFetTime.control = Halt;
mosFetTime.interval = mosFetTime_;
CheckPin(led);
}
void run(uint32_t currentMillis)
{
if (debounce.expired(currentMillis) == Expired)
{
uint8_t stateNew = digitalRead(button) ? Off : On;
if ( stateOld != stateNew)
{
stateOld = stateNew;
(stateNew == Pressed) ? delayTime.start(currentMillis) : delayTime.halt();
}
}
if (delayTime.expired(currentMillis) == Expired)
{
delayTime.halt();
digitalWrite(led, On);
mosFetTime.start(currentMillis);
}
if (mosFetTime.expired(currentMillis) == Expired)
{
mosFetTime.halt();
digitalWrite(led, Off);
}
}
};
BUTTONFED buttonFeds[sizeof(InputPins)];
//-----------------------------------------
// make support
void heartBeat(const uint8_t LedPin, uint32_t currentMillis)
{
static bool setUp = false;
if (setUp == false) pinMode (LedPin, OUTPUT), setUp = true;
digitalWrite(LedPin, (currentMillis / 500) % 2);
}
// make application
void setup()
{
Serial.begin(115200);
for (uint8_t n = 0; n < 32; n++) Serial.println("");
Serial.print("Source: "), Serial.println(__FILE__);
Serial.print(ProjectName), Serial.print(" - "), Serial.println(NotesOnRelease);
uint8_t index = 0;
for (auto &buttonFed : buttonFeds)
{
buttonFed.make(InputPins[index], OutputPins[index], DelayTimes[index] , MosFetTimes[index]) ;
index ++;
}
delay(2000);
Serial.println(" =-> and off we go\n");
}
void loop()
{
currentMillis = millis();
heartBeat(LED_BUILTIN, currentMillis);
for (auto &buttonFed : buttonFeds) buttonFed.run(currentMillis);
}
Viel Spass beim Testen und Spielen 