uint8_t pinLED_Y=2, pinLED_G=3,pinLED_R=4;
uint8_t boton = A0, led_boton=12;

/* plantilla de objeto de led (poder gener leds que parpadeen)

  almacenar definiciones de conexion
  configurar manejo de GPIO (General Purpuse Input/Output)
  manipular el estado logico del led
  gestionar el timpo para manipulacion de led

*/

class LED{
  private:
    byte pin; //Los pines de los LEDS
    bool estado;
    long current_time;
    long periodo;

  public: 

    LED(byte pin){
      this->pin = pin;
      pinMode(pin,OUTPUT);
      estado = LOW;
      digitalWrite(pin,estado);
      current_time = 0;
    }

    void setPeriodo(long periodo_ms){
      periodo = periodo_ms;
    }

    void update(){
      if((millis()-current_time)>= periodo){
        estado = !estado;
        digitalWrite(pin,estado);
        current_time = millis();
      }
    }
};

LED LED_YELLOW(pinLED_Y);
LED LED_RED(pinLED_R);
LED LED_GREEN(pinLED_G);

void setup() {
  pinMode(boton, INPUT_PULLUP); //logica inversa
  pinMode(led_boton, OUTPUT);
  
  LED_YELLOW.setPeriodo(200);
  LED_RED.setPeriodo(500);
  LED_GREEN.setPeriodo(575);

}

void loop() {
  LED_YELLOW.update();
  LED_RED.update();
  LED_GREEN.update();
  digitalWrite(led_boton, !digitalRead(boton));
}