CALCULO DE AREAS Y VOLUMENES UTILIZANDO EL SENSOR ULTRASONICO HC-SR04 CON ARDUINO


El sensor Ultrasónico HC-SR04 sirve para conocer la distancia en que se encuentra algún objeto del Sensor. Funciona emitiendo un sonido por el pin de disparo (Trigger), devolviendo en el pin de eco (echo) el tiempo en micro segundos que tarda en rebotar en algún objeto.
He aquí un pequeño diagrama de como más o menos funciona este sensor…
Resultado de imagen para como funciona el sensor ultrasonico hc-sr04

MATERIALES NECESARIOS
  • ·         1 Tarjeta Arduino UNO
  • ·         HC-SR04 Modulo Sensor Ultrasónico
  • ·         3 pulsadores
  • ·         3 resistencias de 1K
  • ·         3 Leds de cualquier color
  • ·         Puentes de varios tipos
  • ·         Protoboard

 CALCULO DE ÁREAS

El primer ejercicio a realizarse es que, utilizando los datos proporcionados por el sensor, podamos calcular el área utilizando la formula Área=Dato1*Dato2. Cabe mencionar que los datos 1 y 2, serán dados por el sensor.
¿Qué es lo que tiene que hacer el programa?
  • ·         Al accionar el primer pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en una variable. La primera Led se va a encender y se va a imprimir en pantalla “El valor de A es: [el dato]”.
  • ·         Al accionar el segundo pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en otra variable. La segunda Led se va a encender y se va a imprimir en pantalla “El valor de B es: [el dato]”. Se calcula el área y se imprime en pantalla “El área es: [área]” y se enciende la tercera Led.
  • ·         Al accionar el tercer pulsador, se reinicia el programa, apagando los tres leds.


El circuito va estar dado de la siguiente manera:
  • 1.       Los tres pulsadores estarán conectados a los pines 5, 6 y 7 del Arduino con sus respectivos resistores de 1k.
  • 2.       Los tres Leds estarán conectados a los pines 11, 12 y 13 del Arduino.
  • 3.       Los pines del Sensor HC-SR04, el Trigg y Echo estarán conectados a los pines 9 y 8 respectivamente del Arduino.

El diagrama de conexiones se presenta a continuación:



La codificación en Arduino se va a hacer sin usar ninguna Librería, solo utilizaremos la función “PulseIn”.
---------------------------------------------------------------------------------------------
int A;
int B;
int C;
int area;
const int pinecho = 8;
const int pintrigger = 9;
int tiempo,distancia;
int cont1=0,cont2=0,cont3=0;

void setup() {
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
  Serial.begin(9600);
  pinMode(pinecho, INPUT);
  pinMode(pintrigger, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop() {
areaa();
  
}

void sensor(){
   // ENVIAR PULSO DE DISPARO EN EL PIN "TRIGGER"
  digitalWrite(pintrigger, LOW);
  delayMicroseconds(2);
  digitalWrite(pintrigger, HIGH);
  // EL PULSO DURA AL MENOS 10 uS EN ESTADO ALTO
  delayMicroseconds(10);
  digitalWrite(pintrigger, LOW);

  tiempo = pulseIn(pinecho, HIGH);
  // LA VELOCIDAD DEL SONIDO ES DE 340 M/S O 29 MICROSEGUNDOS POR CENTIMETRO
  // DIVIDIMOS EL TIEMPO DEL PULSO ENTRE 58, TIEMPO QUE TARDA RECORRER IDA Y VUELTA UN CENTIMETRO LA ONDA SONORA
  distancia = tiempo / 58;

}
void areaa(){
    sensor();
    delay(200);  
    if(digitalRead(5) == HIGH && cont1==0)
  {
    cont1=1;
    A=distancia; 
      Serial.print("El valor A es: ");   
      Serial.print(A);  
      Serial.println(" cm");
      
      digitalWrite(11,HIGH);  
  }
   if(digitalRead(6) == HIGH && cont2 == 0)
  {
    cont2=1;
    B=distancia; 
    Serial.print("El valor B es: "); 
    Serial.print(B);
    Serial.println(" cm");
    Serial.print("\n \n"); 
    
     digitalWrite(12,HIGH);      
  }
  if(cont1>0 && cont2>0){
    area= A*B;
    delay(1000);
    Serial.print("El area es: "); 
    Serial.print(area);
    Serial.println(" cm cuadrados");
    digitalWrite(13,HIGH);
    delay(500);
  }
  if(digitalRead(7) == HIGH){
    Serial.print("Reinicio: \n \n"); 
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    delay(500);
    cont1=0;
    cont2=0;
    A=0;
    B=0;
    distancia=0;
    area=0;
  }  
}
---------------------------------------------------------------------------------------------
EXPLICACIÓN DE CADA BLOQUE DE CÓDIGO.
Declaración de Variables y constantes
int A; (variable entera para guardar el primer valor)
int B; (variable entera para guardar el segundo valor)
int area; (variable entera para guardar el área calculada)
const int pinecho = 8; (constante entera referenciando el pin del Arduino (8) para el pin Echo del Sensor)
const int pintrigger = 9; (constante entera referenciando el pin del Arduino (9) para el pin Trig del Sensor)
int tiempo,distancia; (variables enteras, una para guardar el tiempo dado por el sensor y la otra para hacer el cálculo de la distancia usando el tiempo).
int cont1=0,cont2=0; (variables para llevar el control de los pulsadores)

Funcion Setup
(configuración de los pines 5, 6 y 7 como entradas porque ahí están conectados los pulsadores.)
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
 
  Serial.begin(9600); (Preparar la comunicación serial)
  pinMode(pinecho, INPUT); (se configura el pin del Echo al pin 8 del Arduino como Entrada)
  pinMode(pintrigger, OUTPUT); (se configura el pin del Trig al pin 9 del Arduino como Salida

(configuración de los pines 11, 12 y 13 como Salidas ya que ahí están conectados los Leds.
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);

PROCEDIMIENTO sensor() , se crea el siguiente procedimiento para obtener los datos del sensor, para cada vez que necesitemos el dato, solo llamemos la función.
void sensor(){
   // enviar pulso de disparo en el pin "trigger"
  digitalWrite(pintrigger, LOW);
  delayMicroseconds(2);
  digitalWrite(pintrigger, HIGH);
  // el pulso dura al menos 10 microsegundos en estado alto
  delayMicroseconds(10);
  digitalWrite(pintrigger, LOW);

  tiempo = pulseIn(pinecho, HIGH);(se guarda el tiempo que tardo en rebotar el pulso utilizando la función PulseIn)
La velocidad del sonido es de 340 m/s o 29 microsegundos por centímetro, dividimos el tiempo del pulso entre 58, tiempo que tarda recorrer ida y vuelta un centímetro la onda sonora
  distancia = tiempo / 58; (la distancia recorrida se guarda en la variable)
}

PROCEDIMIENTO areaa()
void areaa(){
    sensor(); (se llama la función que nos calcula la distancia en cm)
    delay(200); 
(cuando se pulsa el primer botón y la variable cont1 que sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en 0)
    if(digitalRead(5) == HIGH && cont1==0)
  {
    cont1=1; (se le asigna el valor de 1, indicando que ya se pulso el primer botón)
    A=distancia; (la variable A recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
      Serial.print("El valor A es: ");  
      Serial.print(A); 
      Serial.println(" cm");
     
      digitalWrite(11,HIGH);  (se enciende la primera led)
  }

(cuando se pulsa el segundo botón y la variable cont2 que sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en 0)
   if(digitalRead(6) == HIGH && cont2 == 0)
  {
    cont2=1; (se le asigna el valor de 1, indicando que ya se pulso el segundo botón)

    B=distancia; (la variable B recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
    Serial.print("El valor B es: ");
    Serial.print(B);
    Serial.println(" cm");
    Serial.print("\n \n");
   
     digitalWrite(12,HIGH); (se enciende la segunda led)
  }
(condición para saber si ya se pulsaron los dos pulsadores)
  if(cont1>0 && cont2>0){
    area= A*B; (se calcula el área)
    delay(1000);
(se hace la impresión en pantalla)
    Serial.print("El area es: ");
    Serial.print(area);
    Serial.println(" cm cuadrados");

    digitalWrite(13,HIGH);(se enciende la tercera led)
    delay(500);
  }
(si se acciona el tercer pulsador)
  if(digitalRead(7) == HIGH){
    Serial.print("Reinicio: \n \n"); (se imprime Reinicio)
(se apagan todas las leds)
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    delay(500);
(se les asigna 0 a las variables que funcionan como banderas)
    cont1=0;
    cont2=0;
(todas las variables las reiniciamos en 0)
    A=0;
    B=0;
    distancia=0;
    area=0;
  } 
}

EL setup()
(En este bloque solo llamamos el procedimiento creado llamado areaa()).
void setup(){
areaa();
}

CALCULO DE VOLÚMENES

El segundo ejercicio consiste en que, utilizando los datos proporcionados por el sensor, podamos calcular el volumen utilizando la formula Volumen=Dato1*Dato2*Dato3. Casi lo mismo que en el cálculo de áreas.
Para este ejercicio se va a utilizar el mismo diagrama anterior, lo único que cambiara es el código de programación del micro controlador.
¿Qué es lo que tiene que hacer el programa?
  • ·       Al accionar el primer pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en una variable. La primera Led se va a encender y se va a imprimir en pantalla “El valor de A es: [el dato]”.
  • ·         Al accionar el segundo pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en otra variable. La segunda Led se va a encender y se va a imprimir en pantalla “El valor de B es: [el dato]”.
  • ·         Al accionar el tercer pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en otra variable. La tercera Led se va a encender y se va a imprimir en pantalla “El valor de C es: [el dato]”. Se calcula el volumen y se imprime en pantalla “El volumen es: [volumen]”.
  • ·         Si se acciona el tercer pulsador, habiendo ya calculado el volumen, se reinicia el programa, apagando los tres leds.

A continuación, el código del programa
int A;
int B;
int C;
int volumen;
const int pinecho = 8;
const int pintrigger = 9;
int tiempo,distancia;

int cont1=0,cont2=0, cont3=0;
void setup() {
  pinMode(5,INPUT);
  pinMode(6,INPUT);
  pinMode(7,INPUT);
 
// PREPARAR LA COMUNICACION SERIAL
  Serial.begin(9600);
  // CONFIGURAR PINES DE ENTRADA Y SALIDA
  pinMode(pinecho, INPUT);
  pinMode(pintrigger, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop() {
volumenn();
 
}

void sensor(){
   // ENVIAR PULSO DE DISPARO EN EL PIN "TRIGGER"
  digitalWrite(pintrigger, LOW);
  delayMicroseconds(2);
  digitalWrite(pintrigger, HIGH);
  // EL PULSO DURA AL MENOS 10 uS EN ESTADO ALTO
  delayMicroseconds(10);
  digitalWrite(pintrigger, LOW);

  tiempo = pulseIn(pinecho, HIGH);

  // LA VELOCIDAD DEL SONIDO ES DE 340 M/S O 29 MICROSEGUNDOS POR CENTIMETRO
  // DIVIDIMOS EL TIEMPO DEL PULSO ENTRE 58, TIEMPO QUE TARDA RECORRER IDA Y VUELTA UN CENTIMETRO LA ONDA SONORA
  distancia = tiempo / 58;

}

void volumenn(){
    sensor();
    delay(100); 
    if(digitalRead(5) == HIGH && cont1==0)
  {
    cont1= 1;
    A=distancia;
    Serial.print("El valor A es: ");  
    Serial.print(A); 
    Serial.println(" cm");
    digitalWrite(11,HIGH);
  }
   if(digitalRead(6) == HIGH && cont2 == 0)
  {
    cont2=1;
    B=distancia;
    Serial.print("El valor B es: ");
    Serial.print(B);
    Serial.println(" cm");
    digitalWrite(12,HIGH);   
  }
    if(digitalRead(7) == HIGH && cont3 == 0)
  {
    cont3=1;
    C=distancia;
    Serial.print("El valor C es: ");
    Serial.print(C);
    Serial.println(" cm");
    digitalWrite(13,HIGH);
    Serial.print("\n \n");   
  }
  if(cont1>0 && cont2>0 && cont3>0){
    volumen= A*B*C;
    delay(1000);
    Serial.print("El volumen es: ");
    Serial.print(volumen);
    Serial.println(" cm cubicos");
  }
 
  if(digitalRead(7) == HIGH && cont3>0){
    Serial.print("Reinicio: \n \n");
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    cont1=0;
    cont2=0;
    cont3=0;
    A=0;
    B=0;
    C=0;
    distancia=0;
    volumen=0;
  } 
}



EXPLICACIÓN DE CADA BLOQUE DE CÓDIGO.
Declaración de Variables y constantes
int A; (variable entera para guardar el primer valor)
int B; (variable entera para guardar el segundo valor)
int C; (variable entera para guardar el tercer valor)
int volumen; (variable entera para guardar el volumen calculado)
const int pinecho = 8; (constante entera referenciando el pin del Arduino (8) para el pin Echo del Sensor)
const int pintrigger = 9; (constante entera referenciando el pin del Arduino (9) para el pin Trig del Sensor)
int tiempo,distancia; (variables enteras, una para guardar el tiempo dado por el sensor y la otra para hacer el cálculo de la distancia usando el tiempo).
int cont1=0,cont2=0,cont3=0; (variables para llevar el control de los pulsadores)

Funcion Setup
(configuración de los pines 5, 6 y 7 como entradas porque ahí están conectados los pulsadores.)
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
 
  Serial.begin(9600); (Preparar la comunicación serial)
  pinMode(pinecho, INPUT); (se configura el pin del Echo al pin 8 del Arduino como Entrada)
  pinMode(pintrigger, OUTPUT); (se configura el pin del Trig al pin 9 del Arduino como Salida

(configuración de los pines 11, 12 y 13 como Salidas ya que ahí están conectados los Leds.
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);

PROCEDIMIENTO sensor() , se crea el siguiente procedimiento para obtener los datos del sensor, para cada vez que necesitemos el dato, solo llamemos la función. LOS DETALLES FUERON EXPLICADOS EN EL PRIMER EJERCICIO YA QUE ES EL MISMO.

PROCEDIMIENTO volumenn()
void volumenn(){
    sensor(); (se llama la función que nos calcula la distancia en cm)
    delay(200); 
(cuando se pulsa el primer botón y la variable cont1 que sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en 0)
    if(digitalRead(5) == HIGH && cont1==0)
  {
    cont1=1; (se le asigna el valor de 1, indicando que ya se pulso el primer botón)
    A=distancia; (la variable A recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
      Serial.print("El valor A es: ");  
      Serial.print(A); 
      Serial.println(" cm");
     
      digitalWrite(11,HIGH);  (se enciende la primera led)
  }

(cuando se pulsa el segundo botón y la variable cont2 que sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en 0)
   if(digitalRead(6) == HIGH && cont2 == 0)
  {
    cont2=1; (se le asigna el valor de 1, indicando que ya se pulso el segundo botón)

    B=distancia; (la variable B recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
    Serial.print("El valor B es: ");
    Serial.print(B);
    Serial.println(" cm");
    Serial.print("\n \n");
   
     digitalWrite(12,HIGH); (se enciende la segunda led)
  }
(cuando se pulsa el tercer botón y la variable cont3 que sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en 0)
    if(digitalRead(7) == HIGH && cont3 == 0)
  {
    cont3=1; (se le asigna el valor de 1, indicando que ya se pulso el segundo botón)
    C=distancia; (la variable recibe el dato de la distancia)
(se hace la impresión en pantalla)
    Serial.print("El valor C es: ");
    Serial.print(C);
    Serial.println(" cm");
    digitalWrite(13,HIGH); (se enciende la tercera led)
    Serial.print("\n \n");   
  }
(condición para saber si ya se pulsaron los tres pulsadores)
  if(cont1>0 && cont2>0 && cont3>0){
    volumen= A*B*C; (se calcula el volumen)
    delay(1000);
(se imprimen los datos en pantalla)
    Serial.print("El volumen es: ");
    Serial.print(volumen);
    Serial.println(" cm cubicos");
  }
(si se acciona nuevamente el tercer pulsador se reinicia el programa)
if(digitalRead(7) == HIGH && cont3>0){
    Serial.print("Reinicio: \n \n");
(se apagan todas las leds)
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
(se reinician todas las variables en 0)
    cont1=0;
    cont2=0;
    cont3=0;
    A=0;
    B=0;
    C=0;
    distancia=0;
    volumen=0;
  } 
}

EL setup()
(En este bloque solo llamamos el procedimiento creado llamado volumenn ()).
void setup(){
volumenn();
}

Comentarios

Entradas más populares de este blog

Como ser romántico nivel programador

Felicitaciones de cumpleaños para un programador [tomado de frasesparacumpleaños.com]

INDICADOR LUMINOSO DE VOLUMEN DE UN EQUIPO DE SONIDO (PROGRAMACIÓN EN ARDUINO)