Semáforo con sensor de distancia.

Hola, tengo un problema con la programación.
Me encuentro realizando un semáforo con un sensor de distancia. Primero comencé a realizar la programación con un pulsador, el mismo contiene una interrupción. Pero necesito reemplazar el mismo por un sensor manteniendo la interrupción.El primer código es del semáforo con el pulsador, el segundo es de el sensor con un led solo.

int VERDE = 11;  
int AMARILLO = 12; 
int ROJO = 13;  
int PULSADOR = 0; //TEngo que cambiar el pulsador por el sensor, 
int tiempo = 0;
int fue_apretado = 0;

void setup() {
  pinMode (ROJO, OUTPUT);  
  pinMode (VERDE, OUTPUT);  
  pinMode (AMARILLO, OUTPUT);  
  attachInterrupt (PULSADOR, apretado, HIGH); 
  digitalWrite (ROJO, HIGH);
   
}

void loop() {
  if ((tiempo == 0) && (fue_apretado == 1)){
    delay(2000);
  digitalWrite(ROJO, LOW);  
  digitalWrite (VERDE, HIGH);  
  delay(1000);
  digitalWrite (VERDE,LOW);
  digitalWrite (AMARILLO, HIGH); 
  delay(1000);
  digitalWrite (AMARILLO, LOW);  
  tiempo = 60;
  digitalWrite(ROJO, HIGH);
  fue_apretado = 0;
  }  
  if (tiempo > 0){
    delay (1000);
    tiempo--;
    
  }
}
void apretado(){
    fue_apretado = 1;
 
  
}
#define Pecho 6
#define Ptrig 7
long duracion, distancia;   
 
void setup() {                
  Serial.begin (9600);       
  pinMode(Pecho, INPUT);     
  pinMode(Ptrig, OUTPUT);    
  pinMode(13, 1);            
  }
  
void loop() {
  
  digitalWrite(Ptrig, LOW);
  delayMicroseconds(2);
  digitalWrite(Ptrig, HIGH);   
  delayMicroseconds(10);
  digitalWrite(Ptrig, LOW);
  
  duracion = pulseIn(Pecho, HIGH);
  distancia = (duracion/2) / 29;            
  
  if (distancia >= 500 || distancia <= 0){   
    Serial.println("---");                  
  }
  else {
    Serial.print(distancia);           
    Serial.println("cm");              
    digitalWrite(13, 0);                                
  }
  
   if (distancia <= 10 && distancia >= 1){
    digitalWrite(13, 1);    
    Serial.println("Alarma.......");         
  }
  delay(400);                                
}

Ambos códigos me funcionaron por separado.
Estoy utilizando Arduino UNO.
Desde ya muchas gracias.

I assume that the forum in Spanish is to speak in our language, I recommend you go there: Español - Arduino Forum

And you can use the code labels to insert code, it's better than writing it like that.

Buenas!

Hace tiempo que no toco una arduino, así que estoy algo oxidado jeje.

Por lo que recuerdo, es incompatible el uso de una interrupción externa con este sensor de distancia.

En el código del sensor:

  digitalWrite(Ptrig, LOW);
 delayMicroseconds(2);
 digitalWrite(Ptrig, HIGH);  
 delayMicroseconds(10);
 digitalWrite(Ptrig, LOW);
 
 duracion = pulseIn(Pecho, HIGH);
 distancia = (duracion/2) / 29;

Acá estas emitiendo una onda de ultrasonido durante 10ms. y luego tomando el tiempo del pulso calcula la distancia.

Si queres utilizar una interrupción podes usar algún sensor tipo barrera... o, al inicio del loop verificar si hay un objeto dentro de la distancia deseada para activar y cambiar el valor de la variable. Me explico?

Cuando ya tengas un hilo abierto en algun sitio del foro no puedes ir por ahi abriendo otros para lograr mayor atención.
Cuando se te pide que edites debes hacerlo en el mismo y no creando uno nuevo. Esto es un conjetura mía.
Como sea, uni los hilos y puse lo bueno del que acabas de postear en el viejo que ya tenía respuestas.
Presta atención y lee bien TODAS las normas del foro.
Y olvidé otra cosa. Si escribes en español JAMAS lo haces en un foro de idioma diferente. Pasará esto.. te mueven el hilo al foro del idioma con el que escribiste.

Respecto a tu código con sensor, tu necesitas que continuamente se lea la distancia mientras este en rojo por eso la lectura esta en loop() y eso esta bien.

Luego antes de iniciar con algún código debes definir lo que quieres lograr.

Por ejemplo si yo quiero que el semáforo esta en rojo hasta que distancia <1 (llego un vehículo al crucero) y el tiempo transcurrido de la luz en rojo es de mas de 3 min, darle verde durante 15 segundos (que pasen los que puedan) y volver nuevamente a rojo por lo menos 3 min mas. El código seria así:

const byte VERDE = 11;  
const byte AMARILLO = 12; 
const byte ROJO = 13;  
#define Pecho 6
#define Ptrig 7
long distancia;
unsigned long tiempo = 0;
bool pase = false;

void setup() {
   pinMode(VERDE, OUTPUT);  
   pinMode(AMARILLO, OUTPUT);  
   pinMode(ROJO, OUTPUT);  
   pinMode(Pecho, INPUT);     
   pinMode(Ptrig, OUTPUT);    
   digitalWrite(ROJO, HIGH);  
}

void loop() {
   //Medir distancia
   digitalWrite(Ptrig, LOW);
   delayMicroseconds(2);
   digitalWrite(Ptrig, HIGH);   
   delayMicroseconds(10);
   digitalWrite(Ptrig, LOW);
   distancia = pulseIn(Pecho, HIGH)/58;            

   //Ya paso 3 min y hay vehiculo
   if (millis()-tiempo>180000 && distancia<=1){
      tiempo = millis();
      pase = true
   }

   //Dar pase
   if (pase){
      digitalWrite(AMARILLO, HIGH); 
      delay(3000);
      digitalWrite(AMARILLO, LOW);  
      digitalWrite(VERDE, HIGH);  
      delay(15000);
      digitalWrite(VERDE, LOW);  
      digitalWrite(AMARILLO, HIGH); 
      delay(3000);
      digitalWrite(AMARILLO, LOW);  
      digitalWrite(ROJO, HIGH);
      pase = false;
   }
}

Nota que no hay ningún delay() mientras la luz esta en rojo, dándole oportunidad al sensor a medir la distancia. Una vez que el sensor detecte menos de 1 ya no es importante que funcione el sensor y alli es que puedo usar los delay() sin problemas.

PD: Lo correcto seria reemplazar todos los delay() por millis()-x>y, pero eso podria ser tu 2da versión una vez que logras que funcione a tu requerimiento este primer código.