top of page

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))
    ;
}

bottom of page