// --- Pulsación Corta ON-OF/Pulsación Larga ---
#define buttonPin 12
#define LED 13
#define LED2 11

const int intervalSw = 50;                  // Intervalo de tiempo (mseg) entre dos lecturas del pulsador 
bool flag_sw = false;                       // Bandera ON/OF
bool swStatePrevious = HIGH;                // Estado previo de pulsador
bool swStateLongPress = false;              // True si es una pulsación larga
unsigned long swLongPressDuration = 2000;   // Tiempo (seg) de espera pulsacion larga
unsigned long swLongPressMillis;            // Tiempo (mseg) cuando se presionó el pulsador 
unsigned long previousSwMillis;             // Tiempo de la última lectura del pulsador
unsigned long swPressDuration;              // Tiempo (mseg) que se mantiene presionado el pulsador

unsigned long currentMillis;                // Milisegundos desde que se inició el código

void setup() {
  Serial.begin(9600);                 
  pinMode(buttonPin, INPUT); 
  pinMode(LED, OUTPUT);    
  pinMode(LED2, OUTPUT);   
  Serial.println("Pulsacion Corta ON-OF/Larga");
}

void loop() {
  currentMillis = millis();    // almacenar el tiempo actual
  readButtonState();           // Leer estado del pulsador
}

// Leer estado del pusador
void readButtonState() {
  // Si la diferencia de tiempo entre la lectura anterior es mayor que "intervalButton"
  if(currentMillis - previousSwMillis > intervalSw) {
    
    // Leer el valor digital del pulsador (LOW/HIGH)
    bool buttonState3 = digitalRead(buttonPin);    
    
    // Pulsador presionado
    if (buttonState3 == LOW && swStatePrevious == HIGH && !swStateLongPress) {
      swLongPressMillis = currentMillis;
      swStatePrevious = LOW;
      //Serial.println("Pulsador Presionado");
    }

    // Calcular cuanto tiempo se ha presionado el pulsador
    swPressDuration = currentMillis - swLongPressMillis;

    // Pulsación Larga
    if (buttonState3 == LOW && !swStateLongPress && swPressDuration >= swLongPressDuration) {
      swStateLongPress = true;
      Serial.println("Pulsacion Larga");
      digitalWrite(LED2, HIGH);
      //digitalWrite(LED, LOW);
    }
      
    // Pulsador liberado - Pulsación Corta
    if (buttonState3 == HIGH && swStatePrevious == LOW) {
      swStatePrevious = HIGH;
      swStateLongPress = false;
      //Serial.println("Pulsador Liberado");

      if (swPressDuration < swLongPressDuration) {
        Serial.println("Pulsacion Corta");
        if (flag_sw == false){
        digitalWrite(LED, HIGH);
        digitalWrite(LED2, LOW);
        Serial.println("ON");
        flag_sw = true;
        }else {
        digitalWrite(LED, LOW);
        digitalWrite(LED2, LOW);
        Serial.println("OF");
        flag_sw = false;
      }
      }
    }
  
    previousSwMillis = currentMillis;   // Marca de tiempo actual
  }
}