//Tarea de PSM2
//echo por Edgar Ramirez y Marcelo Barrios
// Pines donde van los LEDs y el botón
int LED_VERDE = PB13;  // El verde está en este pin
int LED_ROJO = PB12;   // El rojo en este otro
int SWITCH = PB14;      // El botón, obvio

// Definimos los estados del semáforo
int estado_actual = 0;  // Empieza en verde porque así se arranca
unsigned long tiempo_cambio = 0; // Para controlar el tiempo, algo tipo cronómetro
bool boton_presionado = false;   // Si el botón está apretado o no

void setup() {
  // Configuración básica, nada raro
  pinMode(LED_VERDE, OUTPUT);
  pinMode(LED_ROJO, OUTPUT);
  pinMode(SWITCH, INPUT_PULLUP); // Para que el botón no necesite resistencia externa
  
  // Arrancamos con el verde encendido y el rojo apagado
  digitalWrite(LED_VERDE, HIGH);
  digitalWrite(LED_ROJO, LOW);
}

void loop() {
  // Revisamos si apretaron el botón, pero sin complicarse mucho
  if (digitalRead(SWITCH) == LOW && !boton_presionado) {
    boton_presionado = true;  // Guardamos que apretaron el botón
    if (estado_actual == 0) { // Solo hacemos caso si estamos en verde
      cambiar_estado(1);  // Cambiamos a "verde parpadeante"
    }
  } else if (digitalRead(SWITCH) == HIGH) {
    boton_presionado = false;  // Si sueltan el botón, lo liberamos
  }

  // Vamos viendo si pasó el tiempo suficiente
  if (millis() - tiempo_cambio >= 1000) {
    manejar_temporizador();
  }
}

// Esto es lo que pasa cuando se acaba el tiempo de un estado
void manejar_temporizador() {
  if (estado_actual == 1) { // Si está parpadeando en verde
    cambiar_estado(2);  // Ahora toca el rojo
  } else if (estado_actual == 2) { // Si está en rojo
    if (millis() - tiempo_cambio >= 3000) {  // Lo dejamos en rojo 3 segundos
      cambiar_estado(3);  // Luego parpadea el rojo
    }
  } else if (estado_actual == 3) { // Si está parpadeando en rojo
    cambiar_estado(0);  // Volvemos al verde
  }
}

// Esta función cambia el estado y enciende/apaga los LEDs
void cambiar_estado(int nuevo_estado) {
  estado_actual = nuevo_estado;  // Guardamos el nuevo estado
  tiempo_cambio = millis();  // Reiniciamos el tiempo

  // Según el estado, encendemos o apagamos los LEDs
  if (estado_actual == 0) { // Estado verde
    digitalWrite(LED_VERDE, HIGH);  // Prendemos el verde
    digitalWrite(LED_ROJO, LOW);    // Apagamos el rojo
  } else if (estado_actual == 1) { // Verde parpadeante
    parpadear(LED_VERDE, 5);  // Parpadea un par de veces
  } else if (estado_actual == 2) { // Estado rojo
    digitalWrite(LED_VERDE, LOW);   // Apagamos el verde
    digitalWrite(LED_ROJO, HIGH);   // Prendemos el rojo
  } else if (estado_actual == 3) { // Rojo parpadeante
    parpadear(LED_ROJO, 5);  // El rojo parpadea
  }
}

// Parpadeamos el LED unas cuantas veces
void parpadear(int ledPin, int veces) {
  for (int i = 0; i < veces; i++) {
    digitalWrite(ledPin, HIGH);  // Prende el LED
    delay(100);                  // Esperamos un poco
    digitalWrite(ledPin, LOW);   // Apaga el LED
    delay(100);                  // Esperamos otro poco
  }
}
Loading
stm32-bluepill