//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
stm32-bluepill