Ayuda!, Programación ATmega328 Arduino uno y HCSR04

Hola, soy nuevo en Arduino y necesito un poco ayuda con el tema de programación…
Estoy usando arduino Uno con Atmega328 y un sensor HCSR04, lo que necesito que haga es lo siguiente…
Necesito que mida entre 3 metros y valla volcando la medición en pantalla a la vez que según la distancia brille un led, a medida que la distancia disminuye debe aumentar el brillo del led…
Creo que se utiliza PWM en estos casos pero no puedo hacerlo funcionar
Por ende lo que hago es que titile el led, a menos distancia titila mas rápido, el problema surge cuando el led va titilando, a medida que disminuye la distancia se queda encendido unos segundos (como si se colgara el procesador) hasta que vuelve a titilar.
Les paso el código que estoy usando

"//Codigo para calcular las distancias censadas por el dispositivo HC-SR04 a menor distancia mas rapido //oscila //la luz del led

#define PIN_LUZ 2
#define PIN_TRIG 12 //azul
#define PIN_ECO 13 //dorado
double duracion = 0;
double distancia = 0;
int tempo = 0;

void setup(){
Serial.begin(9600); //inicializacion de la comunicacin serial
pinMode(PIN_LUZ, OUTPUT);//pin que activa el encendido del led
pinMode(PIN_TRIG, OUTPUT); //Inicializacin de pines digitales
pinMode(PIN_ECO, INPUT); //Inicializacin de pines digitales
}

void disparo(){ //metodo que activa el disparo de la rafaga
digitalWrite(PIN_TRIG, LOW); //tiempo inicial de espera entre disparos
delayMicroseconds(5); //tiempo de espera
digitalWrite(PIN_TRIG, HIGH); //activacion del disparo poniendo en alta durante 10
//milisegundos al PIN_TRIG
delayMicroseconds(10); //tiempo de espera
}

double calcularDistancia(){ //metodo que calcula la distancia real hacia algun objeto
duracion = pulseIn(PIN_ECO, HIGH); //Se mide la duracion del flanco en alta de PIN_ECO
distancia = (duracion/2) * 0.034; //Calculo de la distancia
return (distancia);
}

void imprimir(){ //Metodo que imprime en el monitor serial las distancias y si se sale del rango
if(distancia >= 300 || distancia <= 0){ //Si la distancia no esta entre 1 cm y 499 cm Imprima que se esta Fuera de rango
Serial.println(“Fuera de rango”);
}else{ //Si no Imprima la distancia en cm y espere 100 ms para que los datos no // //aparescan tan rapido
Serial.print(distancia);
Serial.println(" cm");
}
delay(400);
}

void titilar(){ //Metodo que hace titilar el led. A menor distancia el led titila mas rapido
digitalWrite(PIN_LUZ, HIGH);
tempo = distancia * 2;
delay(tempo);
digitalWrite(PIN_LUZ, LOW);

}
void loop(){ //método que implementa un ciclo tipo loop iterativo llamando a los métodos
disparo();
calcularDistancia();
titilar();
imprimir();
}"
Espero puedan ayudarme de no ser mucha molestia, saludos!