class TimerOFF
{
  private:    
    uint8_t  m_pinOut;
    uint32_t m_activeTime;
    uint32_t m_ToffTime;
    bool     m_rising;       
    
  public:    
    TimerOFF(uint32_t _time, uint8_t _pin) { 
      m_rising = false;
      m_ToffTime = _time;      
      m_pinOut = _pin;
      pinMode(m_pinOut, OUTPUT);      
    }

    void run(bool& input) {
      if(input && !m_rising) {
        m_rising = true;
        m_activeTime = millis();
        digitalWrite(m_pinOut, HIGH);
      } 
      if(millis() - m_activeTime > m_ToffTime ) {
        m_rising = false;        
        digitalWrite(m_pinOut, LOW);
      }      
    }
};

// Temporizzatore con ritardo alla diseccitazione NON bloccante
#define BUTTON 12
#define LED_GRN 6
#define LED_RED 7


TimerOFF redLed(2000, LED_RED);
TimerOFF greenLed(5000, LED_GRN);


void setup() {
  pinMode(BUTTON, INPUT_PULLUP);
}

void loop() {
  // Esecuzione del timer con ritardo alla diseccitazione
  bool sigInput = digitalRead(BUTTON) == LOW;
  redLed.run(sigInput);  
  greenLed.run(sigInput);
}