Vamos a crear un sensor de proximidad con el sensor HC-SR04, que utiliza pulsos de ultrasonido para detectar distancias.
El sensor tiene cuatro patitas, una VCC a 5 voltios y otra a masa para alimentar el sensor y dos más, Trigger y Echo, para enviar el frente de impulsos de ultrasonido con un pulso de 10 milisegundos y Echo, que se pone a 1 durante el tiempo que tarda en recibir el eco del frente de impulsos. Ojo con las superficies en ángulo, suelen generar distancias erróneas.
El circuito que vamos a montar es este:
Tenemos por una parte las conexiones con el sensor, 5 voltios para el vcc, masa y dos señales, una de entrada y otra de salida. El conector 11 será la salida que activará la patita Trigger, que generará el frente de onda, y pondrá a 1 la salida echo del sensor hasta que rebote la señal. Esta salida del sensor será la entrada al arduino, en el conector 12.
El sensor sólo nos va a marcar el tiempo que tarda la señal en ir y volver, pero con este tiempo y conociendo la velocidad del sonido, podemos calcular la distancia desde el sensor al primer obstáculo. Sabemos que la velocidad del sonido es de 343 m/s, o en nuestro caso 0,0343 cm/μs. Obtenemos los microsegundos que tarda en ir y volver la señal con la función pulseIn, y de ahí calculamos la distancia en centímetros como (0,0343/2) * t
En función de esta distancia calculada, encenderemos uno de los leds, rojo a menos de 10 cm, amarillo entre 10 y 15, verde entre 15 y 25 y azul a más de 25 cm.
Vamos con el código:
int ledrojo = 7; int lednaranja = 6; int ledverde = 5; int ledazul = 4; int disparador = 11; int eco = 12 long distancia; long tiempo; int led; void setup() { Serial.begin(9600); pinMode(disparador, OUTPUT); pinMode(eco, INPUT); pinMode(ledrojo, OUTPUT); pinMode(lednaranja, OUTPUT); pinMode(ledverde, OUTPUT); pinMode(ledazul, OUTPUT); } void loop() { digitalWrite(disparador , LOW); delayMicroseconds(10); digitalWrite(disparador, HIGH); delayMicroseconds(10); tiempo = pulseIn(eco, HIGH); distancia = int(0.0172 * tiempo); if (distancia > 25) { led = 1; } if (distancia <= 25 && distancia > 15) { led = 2; } if (distancia <= 15 && distancia > 10) { led = 3; } if (distancia <= 10) { led = 4; } switch (led) { case 1: digitalWrite(ledazul, HIGH); digitalWrite(ledverde, LOW); digitalWrite(lednaranja, LOW); digitalWrite(ledrojo, LOW); break; case 2: digitalWrite(ledazul, LOW); digitalWrite(ledverde, HIGH); digitalWrite(lednaranja, LOW); digitalWrite(ledrojo, LOW); break; case 3: digitalWrite(ledazul, LOW); digitalWrite(ledverde, LOW); digitalWrite(lednaranja, HIGH); digitalWrite(ledrojo, LOW); break; case 4: digitalWrite(ledazul, LOW); digitalWrite(ledverde, LOW); digitalWrite(lednaranja, LOW); digitalWrite(ledrojo, HIGH); } Serial.print("Distancia "); Serial.print(distancia); Serial.println(" cm"); delay(1); }