LABORATORIO 3 - SEMAFORO
Realizar un programa en Arduino, para el circuito mostrado abajo, el cual simule el funcionamiento de un semáforo con tiempos imaginarios.
Materiales
1 Arduino LEONARDO
1 Pulsador
3 resistencias 1 Kohms
3 LED (rojo, amarillo, verde)
1 Cable USB Micro-B
6 Conectores rápidos
Los estudiantes crearan un semáforo con tiempos inferiores a los reales, para poder probarlo más rápidamente. Introducimos un pulsador para ir conmutando entre semáforo y otras funciones como dejar encendido un led rojo, etc.
CÓDIGO FUENTE:
//Semaforo controlado por pulsador
void encendersemaforo();
//const int buttonPin = 2; // PULSADOR
int ledPin1 = 8; //LED VERDE
int ledPin2 = 9; //LED AMBAR
int ledPin3 = 10; //LED ROJO
int contador = 0;
long tpo = millis();
void setup()
{
Serial.begin(9600);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
// pinMode(buttonPin, INPUT);
attachInterrupt(0, Fon_Contar, RISING);
}
void loop ()
{
switch (contador)
{
case 0: // APAGA TODOS LOS LEDS
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,LOW);
digitalWrite(ledPin3,LOW);
break;
case 1: // ENCIENDE EL SEMAFORO
encenderSemaforo();
break;
case 2: // ENCIENDE EL LED ROJO
digitalWrite(ledPin1,LOW); // APAPGA VERDE
digitalWrite(ledPin2,LOW); // APAGA AMBAR
digitalWrite(ledPin3,HIGH); // ENCIENDE ROJO
break;
case 3: // ENCIENDE EL LED AMBAR
digitalWrite(ledPin1,LOW); // APAPGA VERDE
digitalWrite(ledPin2,HIGH); // ENCIENDE AMBAR
digitalWrite(ledPin3,LOW); // APAGA ROJO
break;
case 4: // ENCIENDE EL LED VERDE
digitalWrite(ledPin1,HIGH); // ENCIENDE VERDE
digitalWrite(ledPin2,LOW); // APAGA AMBAR
digitalWrite(ledPin3,LOW); // APAGA ROJO
break;
case 5: // REINICIA EL CONTADOR
contador= 0;
break;
}
}
void Fon_Contar() // Este contador cuenda cada vez que el pulsador pasa de estado LOW a HIGH
{
contador++;
Serial.println(contador);
if (contador > 4) contador = 0;
}
void encenderSemaforo()
{
delayx(500);
digitalWrite(ledPin1, HIGH); // VERDE
delayx (2500);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH); // AMBAR
delayx(200);
digitalWrite(ledPin2, LOW);
delayx(200);
digitalWrite(ledPin2, HIGH); // AMBAR
delayx(200);
digitalWrite(ledPin2, LOW);
delayx(200);
digitalWrite(ledPin2, HIGH); // AMBAR
delayx(2000);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, HIGH); // ROJO
delayx(2000);
digitalWrite(ledPin3, LOW);
}
void delayx(int valor)
{
long tpo = millis();
while ((( millis() - tpo) < valor) && (contador == 1))
;
}