Mostrando entradas con la etiqueta Sensores Ultrasonidos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Sensores Ultrasonidos. Mostrar todas las entradas

jueves, 18 de enero de 2024

Dispositivo de asistencia en el aparcamiento y evacuación de gases inflamables



Alumno: D. David García Martín

Asignatura: Innovación Docente de la Especialidad de Tecnología.

Máster: Máster Universitario en Profesor de Educación Secundaria Obligatoria y Bachillerato, Formación Profesional y Enseñanza de Idiomas

Centro: Universidad de Salamanca.

Curso: 2023/24

PROYECTO




Descripción del proyecto:

El dispositivo que se ha creado tiene la finalidad de prestar asistencia en la maniobra de aparcamiento en de una plaza de garaje individual mediente la emisión de sonidos y luces diversas, así cómo la detección y evacuaciónde  gases inflamables que se encuentren en el habitáculo. La idea es que se encuentre intalado de forma fija en la plaza de garaje en cuestión, con el sensor de ultrasonidos apuntando al morro del coche y la pantalla LCD a una altura suficiente como para que la distancia al obstáculo, que en esta se muestra en todo momento, pueda ser visualizada sin probelmas por el conductor del vehículo. El motor de DC simula el funcionamiento de un ventilador más grande ubicado en el techo de la plaza de garaje.

Los dispositivos de entrada de información de este sistema son el sensor de ultrasonidos HC-SR04 y el sensor de gas MQ-2. En función de sus lecturas, el sistema electrónico realizará diferentes acciones.

  • Lectura del HC-SR04:

    1. Si la distancia al obstáculo (de ahora en adelante "d") es mayor de 50 cm, el LED verde permanecerá encendido y el buzzer no emitirá ningún sonido.
    2. Si 31 < d < 50 cm: el LED amarillo comenzará a parpadear a una velocidad derminada y el buzzer emitirá un sonido de 1600 Hz y 400 ms de duración.
    3. Si 10 < d < 30 cm: el LED rojo comenzará a parpadear a una velocidad más rápida que en el caso anterior y el buzzer emitirá un sonido de 1200 Hz y 150 ms de duración.
    4. Si 0 < d < 9 cm: todos los LED parpadearán al unísono a una velocidad mayor que en los casos anteriores y el buzzer emitirá un sonido de 800 Hz y 50 ms de duración.
  • Lectura del MQ-2: Si el nivel de gas supera un umbral determinado por la calibración del propio sensor, éste emitirá una señal digital del tipo LOW al Arduino. Cuando esto suceda el motor DC se pondrá en marcha a una velocidad constante (señal PWM de 200), de manera que evacuará el gas inflamable del habitáculo. Una vez que la concentración del gas haya disminuido lo suficiente como para que no se active el sensor MQ-2, el motor se parará.


Componentes:

x1 Arduino MEGA 2560

x1 motor DC

x1 transistor NPN PN2222

x1 diodo rectificador

x1 resistencia de 330 Ω

x1 sensor de ultrasonidos HC-SR04

x1 buzzer pasivo

x1 pantalla LCD de 16x2

x1 sensor de gas MQ-2

x3 LED (rojo, amarillo y verde)

x1 potenciómetro de 10 kΩ

x3 resistencias de 220 Ω

Cables macho - macho y protoboard.


ESQUEMA DE CONEXIONES






CÓDIGO ARDUINO


/*Trabajo autónomo Innovación Docente  | MUPES  | Curso 2023/24.
Título: SENSOR DE APARCAMIENTO CON DETECCIÓN DE GAS INFLAMABLE
AUTOR: DAVID GARCÍA MARTÍN   dagama@usal.es
*/

#include <LiquidCrystal.h> //Incluyo la librería correspondiente para utilizar la pantalla LCD.

//Defino los pines de la pantalla LCD de 16x2 y se asigna
const int rs = 5, en = 6, d4 = 7, d5 = 8, d6 = 9, d7 = 10;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//Inicializo constantes enteras globales que son el número al que se conecta el elemento que da nombre a la constante entera
const int pinTRIG =2;   //Al pin 2 conecto TRIGGER del sensor ultrasónico
const int pinECCO = 3;  //Al pin 3 conecto ECCO del sensor ultrasónico
const int ledVERDE = 22;  //Al pin 22 conecto el LED verde
const int ledAMARILLO = 23;   //Al pin 23 conecto el LED amarillo
const int ledROJO = 24;   //Al pin 24 conecto el LED rojo
const int buzzer = 4;   //Al pin 4 conecto el buzzer pasivo
const int motor = 11;   //Defino pin motor
const int pingas = 50;  //Defino pin del sensor de gas
//Defino las variables necersarias para el cálculo de la distancia con el sensor ultrasónico
long duracion;  //Variable numérica global de tipo long
int distancia;  //Variable numérica global de tipo entera


void setup() {//Pasos que se ejecutan en el arranque del Arduino MEGA
  // Inicializo los pines que voy a usar y los configuro como entradas o salidas según corresponda
  pinMode(pinTRIG, OUTPUT);   //Configuro el pin "pinTRIGG" como pin de salida
  pinMode(pinECCO, INPUT);    //Configuro el pin "pinECCO" como pin de entrada
  pinMode(ledVERDE, OUTPUT);    //Configuro el pin "ledVERDE" como pin de salida
  pinMode(ledAMARILLO, OUTPUT);   //Configuro el pin "ledAMARILLO" como pin de salida
  pinMode(ledROJO, OUTPUT);   //Configuro el pin "ledROJO" como pin de salida
  pinMode(buzzer, OUTPUT);    //Configuro el pin "buzzer" como pin de salida
  pinMode(pingas, INPUT);    //Configuro el pin "pingas" como pin de entrada
  pinMode(motor, OUTPUT);

  //Inicializo la pantalla LCD de 16x2
  lcd.begin(16, 2);
 
  /*Inicializo el puerto serie. Con este se podrá comprobar que las lecturas que
  devuleve la pantalla LCD son correctas.*/
  Serial.begin(9600);
  analogWrite(motor, 0);  //empieza el sketch con el motor parado
}

void loop() {//Bucle principal del programa

  /*Si detecta que hay gas inflamable, activa el ventilador
  para que se vaya el gas*/

  //Genero un pulso en el pin de trigger del sensor ultrasónico
  digitalWrite(pinTRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(pinTRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTRIG, LOW);
 

  //Mido la duración del eco del sensor ultrasónico y calculo la distancia
  duracion = pulseIn(pinECCO, HIGH);
  distancia = duracion * 0.034 / 2; //Fórmula para obtener la distancia en cm al obstáculo

  //Muestro en monitor serial la distancia medida por el sensor ultrasónico
  Serial.print("Distancia: ");
  Serial.println(distancia);

  //En la pantalla LCD se imprime lo siguiente:
  lcd.clear();
  lcd.print("Distancia:");
  lcd.setCursor(0, 1);
  lcd.print(distancia);
  lcd.print(" cm");
 

  //Programación del funcionamiento de los LEDs y del buzzer según la distancia que mide el sensor ultrasónico:
  switch(distancia){
    case 31 ... 50: //Si la distancia al obstáculo está dentro del intervalo [21,50] cm, realiza lo siguiente:
      digitalWrite(ledVERDE, LOW);
      digitalWrite(ledAMARILLO, HIGH);  //Enciende el LED amarillo y apaga el resto
      digitalWrite(ledROJO, LOW);
      tone(buzzer, 1600);  //Emite un sonido de 500 Hz durante 500ms. Posteriormente permanece callado 500ms.
      delay(400);
      noTone(buzzer);
      delay(300);
      digitalWrite(ledAMARILLO, LOW);
      delay(10);
      break;    //sale del caso

    case 10 ... 30: //Si la distancia al obstáculo está dentro del intervalo [0,20] cm, realiza lo siguiente:
      digitalWrite(ledVERDE, LOW);
      digitalWrite(ledAMARILLO, LOW);
      digitalWrite(ledROJO, HIGH);  //Enciende el LED rojo y apaga el resto
      tone(buzzer, 1200); //Emite un sonido de 1000 Hz durante 300ms. Posteriormente permanece callado 300ms.
      delay(150);
      noTone(buzzer);
      delay(50);
      digitalWrite(ledROJO, LOW);
      delay(10);
      break;    //sale del caso

    case 0 ... 9:
      digitalWrite(ledVERDE, HIGH);
      digitalWrite(ledAMARILLO, HIGH);
      digitalWrite(ledROJO, HIGH);  //Enciende todos los LED
      tone(buzzer, 800); //Emite un sonido de 1000 Hz durante 300ms. Posteriormente permanece callado 300ms.
      delay(100);
      noTone(buzzer);
      delay(50);
      digitalWrite(ledVERDE, LOW);
      digitalWrite(ledAMARILLO, LOW);
      digitalWrite(ledROJO, LOW);
      delay(5);
      break;  //sale del caso

    default:  /*Si la distancia al obstáculo es mayor que 50 cm, es decir que no es ninguno de
              los dos intervalos anteriores, realiza lo siguiente:*/
      digitalWrite(ledVERDE, HIGH); //Enciende el LED verde y los demás permanecen apagados
      digitalWrite(ledAMARILLO, LOW);
      digitalWrite(ledROJO, LOW);
      noTone(buzzer); //No genera pitido
      break;    //sale del caso
  }


  /*Introduzco una pequeña pausa antes de que se reinicie el bucle.
  De esta manera evito que trabaje a una velocidad excesivamente alta,
  además de que se podrán visualizar las medidas con más calma*/
  delay(100);

  int estado = digitalRead(pingas); //creo una valiable de estado que recoge la señal digital del MQ-2
  if (estado == LOW) {      ////del sesnor MQ-2. Como este trabaja con lógica inversa, el código queda así.
      analogWrite(motor, 200);
  } else {
    analogWrite(motor, 0);
  }

}   // Fin del bucle


martes, 16 de febrero de 2021

Sistema de Frenado


SISTEMA DE FRENADO

DESCRIPCIÓN

El proyecto consiste en la programación de un prototipo de sistema de frenado para vehículos utilizando Arduino UNO y otros componentes descritos más adelante.

El prototipo se basa en un servo que adoptará diferentes posiciones definidas en el código dependiendo de la distancia a la que esté el obstáculo, este dato lo proporcionará un sensor de ultrasonidos. Además se han incorporado estímulos lumínicos (LEDs de colores que brillarán en función de la distancia siguiendo el código de color estandarizado) y auditivos (mediante un zumbador que sonará con mayor frecuencia cuando la distancia al obstáculo sea crítica).



CONTEXTO

4º de ESO tanto en la rama de académicas como de aplicadas.

  • Académicas:
    • Bloque 1: Electrónica Aplicada.
    • Bloque 2: Control y Robótica.
  • Aplicadas:
    • Bloque 3: Electrónica.
    • Bloque 4: Control y Robótica.

ESQUEMA


COMPONENTES

  • Arduino UNO
  • Protoboard
  • Sensor de Ultrasonidos
  • Servo
  • Buzzer Pasivo
  • 3 x LEDs
    • LED verde
    • LED amarillo
    • LED rojo
  • 3 x Resistencias 220 Ω
  • Cables

IMÁGENES



DESCARGAS

CÓDIGO COMENTADO

PROGRAMA

CREADOR/A

Ester Martín Rodríguez

Asignatura: Innovación Docente en la Especialidad de Tecnología

Máster Universitario en Profesor de Educación Secundaria Obligatoria, Bachillerato, Formación Profesional y Enseñanza de Idiomas (Universidad de Salamanca)



Contenedor Inteligente

 

Contenedor inteligente con Arduino y ThingSpeak

DATOS

Master Universitario en Profesor de Educación Secundaria Obligatoria, Bachillerato, Formación Profesional y Enseñanza de Idiomas.

Universidad de Salamanca

Asignatura: Innovación Docente en la Especialidad de Tecnología.

Curso: 2020/2021

Autor: Álvaro Lozano Murciego

CONTEXTO 

La actividad se enmarca como un proyecto a desarrollar a lo largo de varias sesiones en la asignatura de Tecnología de 4ºESO de Aplicadas. Se parte de unos conocimientos mínimos previos de electrónica y se podrá enseñar programación con Arduino y temas más avanzados relacionados con la conexión con servicios de Internet.

Se encuentra enmarcado en el Bloque Robótica y Control.

ENUNCIADO

El objetivo de este proyecto es el desarrollo de un contenedor "inteligente" que presente las siguientes características:

  • Se pueda abrir su tapa sin contacto y sin esfuerzo: Se accionará con un sensor de ultrasonidos cuando la distancia con un obstáculo sea menor que cierto valor.
  • Monitorice y muestre el nivel de llenado y lo publique en un sitio web: el porcentaje de llenado deberá estar accesible tanto de forma online como localmente en el propio dispositivo.

MATERIALES NECESARIOS Y REQUISITOS PREVIOS

Para llevar a cabo el siguiente proyecto serán necesarios los siguientes materiales:
  • 1 x Cubo de basura comercial: shorturl.at/AHIW5. La idea principal es modificarlo para hacerlo "inteligente" con distintos sensores. Este apartado es libre.
  • 1 x Sensor de ultrasonidos HC-SR04: Tendrá la función de sensor de distancia para aproximar el porcentaje del contenedor, en este caso el sensor apuntará hacia el interior del contendor para tal fin.
  • 1 x Sensor de distancia Time of Flight (ToF): Se trata de un sensor de distancia más preciso que el de ultrasonidos y sin tanto rango de apertura. Este sensor será el empleado para accionar la apertura de la tapa del contenedor si se detecta una distancia menor a un umbral definido.

  • 1 x MicroServo 9g : Este actuador será el encargado de abrir la tapa del contenedor.



  • 1 x M5Stick C Plus: En este caso se empleará este dispositivo como microcontrolador. Este dispositivo esta basado en el microcontrolador ESP32 (de la empresa Espressiff) y forma parte de la empresa M5Stack, empresa de hardware electrónico educativo. La diferencia fundamental con Arduino UNO (ATMega328p) consiste en que el microcontrolador ESP32 posee conexión WiFi y Bluetooth BLE, un factor que lo hace perfecto para Internet de las Cosas (IoT) a la vez de su bajo coste, unos 5 euros un ESP32. Por lo demás, es posible utilizar el Core de Arduino (el lenguaje de programación Arduino y sus bibliotecas) con este microcontrolador. Para instalar esta placa en el IDE de Arduino es sumamente sencillo, basta seguir los pasos que se indican AQUI. Una vez instalado ya podemos seleccionar la placa en el IDE de Arduino. Una vez explicado qué es el ESP32, podemos abordar el M5Stick C Plus, dispositivo con distintos periféricos (Pantalla LED, Micrófono, Acelerómetro, etc.) Esto es muy útil ya que permite realizar muchas prácticas con el mismo dispositivo, sin embargo puede quedarse algo corto en cuanto a pines disponibles, M5Stack posee más dispositivos como el M5Stack Core Basic.

  • N x Cableado: Serán necesarios varios cables y jumpers para el prototipo en la protoboard y posteriormente para instalar el cableado en la papelera.
  • Pegamento termofusible: Necesario para fijar toda la parte de cableado y la caja en la parte de la tapa del contenedor.
Además de estos materiales, será necesario contar con el siguiente software/cuentas:
  • Arduino IDE y con placa ESP32 instalada:  Seguir los pasos descritos AQUI.
  • Cuenta en ThingSpeak: Será necesario crear una cuenta en https://thingspeak.com/ aquí podremos crear hasta 4 "channels" o canales donde podremos publicar la información del sensor. Con crear un solo canal será necesario. Posteriormente en el código se detallarán los pasos a seguir.
  • ThingSpeak Arduino: Será necesario instalar la biblioteca de ThingSpeak para Arduino en el IDE desde el gestor de bibliotecas.
  • M5Stick C Plus: Instalar la biblioteca con este nombre desde el gestor de bibliotecas.

DESCRIPCIÓN DE LOS MECANISMOS DEL PROTOTIPO Y DEL FUNCIONAMIENTO

La idea principal del proyecto consiste en conseguir desarrollar un programa que se accione un motor para poder abrir la tapadera durante unos segundos y posteriormente pasar a cerrarla. Por tanto, deberemos realizar un mecanismo con el que abrir la tapa como se muestra a continuación:


Por otro lado, el programa del microcontrolador también deberá medir la distancia desde la parte superior del contenedor de tal forma que se pueda aproximar el volumen de llenado del contenedor.

La información de llenado se enviará a ThingSpeak a través de una petición HTTP utilizando la biblioteca de Arduino para tal servicio. En ThingSpeak será necesario configurar un canal en el que recibir los datos y mostrar una visualización de éstos en una gráfica:

DISEÑO DEL CIRCUITO ELECTRÓNICO (TINKERCAD y Diagrams.net)



DIAGRAMA DE FLUJO DEL PROGRAMA



CÓDIGO ARDUINO, BIBLIOTECAS Y REPOSITORIO GITHUB

Bibliotecas Necesarias:

  • ESP32Servo
  • ThingSpeak Arduino ESP32
  • Wire
  • Wifi
Repositorio:

IMAGEN DEL PROTOTIPO




VIDEO DEMOSTRATIVO







viernes, 8 de febrero de 2019

PROYECTO DE UN FARO CON ARDUINO


Imagen del proyecto acabado


COMPONENTES DEL GRUPO

Lidia Sánchez Calvo
Ismael Peña Sánchez
Enrique José Guzmán de la Iglesia

DATOS 

Universidad de Salamanca

Máster de Profesor de Educación Secundaria Obligatoria, Bachillerato, Formación profesional y enseñanza de idiomas. 

  • Especialidad en Tecnología 2018/2019
  • Asignatura: Innovación docente en la especialidad de Tecnología

CONTEXTO

Este proyecto está pensado para ser realizado como proyecto final de la asignatura de Tecnología en Educación Secundaria Obligatoria.

  • Cursos: 4º ESO de Académicas y 4º ESO de Aplicadas
  • Bloques con los que se relaciona: Bloque de electrónica y Bloque de control y robótica

FUNCIONAMIENTO

Este proyecto cuenta con tres partes diferentes:

Una de ellas es el faro que tiene una LDR que captará la luz del sol, si es de noche se encenderá un LED y un servo girará simulando el movimiento del faro. En la función setup durante los primeros cinco segundos, se calibrará la LDR para que los valores máximo y mínimo sean reales y no establecidos por el programador.


Otra parte del proyecto es un sensor de ultrasonidos que va a captar si algún barco está próximo al muelle, si está a una distancia entre 10 y 26 cm un piezoeléctrico emitirá un pitido de forma intermitente, mientras que si la distancia del barco al sensor es menor a 10 el pitido sonará de forma continua.


La última parte que tiene el proyecto es un control de aparcamiento. Este control se ha simulado con tres sensores de ultrasonidos, una pantalla LCD y otro Arduino. Los sensores están conectados al primer Arduino que recibirá la señal de estos y la procesará. Cuando este note que una plaza ha sido ocupada o vaciada mandará una señal al otro Arduino que la procesará y mostrará el cambio en la pantalla LCD sumando uno al número de plazas si alguna ha sido vaciada o restando uno en el caso de que una plaza haya sido ocupada.





Las dos placas están comunicadas por el protocolo de comunicación serie I2C, para ello se han unido los pines analógicos 4 y 5 y las dos tierras. Se ha tenido que utilizar dos Arduinos, porque el primero no tenía suficientes pines digitales para poder conectar todos los sensores y actuadores necesarios.


MÁS FOTOGRAFÍAS DEL PROYECTO










 VÍDEO




ESQUEMA DEL CIRCUITO REALIZADO CON FRITZING





SERVO, LED, LDR Y SENSORES ULTRASONIDOS



PANTALLA LCD

COMUNICACIÓN ENTRE LAS PLACAS


MATERIALES UTILIZADOS

  • Arduino Uno
  • Arduino Duemilanove
  • 2 placas protoboard
  • 1 piezoeléctrico
  • 1 LED amarillo
  • 1 servomotor
  • 1 condensador de 100 µF
  • 4 sensores de ultrasonidos
  • 1 LDR
  • 1 pantalla LCD
  • 2 resistencias 220 Ω
  • 1 resistencia 1 kΩ
  • 1 resistencia 10 kΩ
  • Cables para el montaje de los circuitos
Materiales utilizados para la maqueta:
  • 1 caja de cartón
  • 1 rollo de papel de cocina
  • Parte superior de una botella
  • Pinturas
  • Pegamento
  • Cinta adhesiva
  • Cartulina
  • Goma elástica
CÓDIGO FUENTE

/* PROYECTO FARO */
#include <Servo.h>
#include <pitches.h>
#include <Wire.h>
/*  Ismael Peña Sánchez
 Lidia Sánchez Calvo
 Enrique José Guzmán de la Iglesia
*/

/*En esta primera parte del proyecto se encuentran declarados todos
los pines que se van a utilizar, las variables auxiliares y un objeto
de la clase Servo que va a controlar el servo que simulará el faro.*/
Servo faro;
const int pinLED = 2;
const int pinZumbador = 7;
int sensorluz = A0;
int valorsensor = 0;
int sensorLow = 1023;
int sensorHigh = 0;
int angulo = 0;
boolean flag = true;

unsigned long pulso;
long distancia;

unsigned long pulso_1;
long distancia_1;
unsigned long pulso_2;
long distancia_2;
unsigned long pulso_3;
long distancia_3;

boolean flag_1 = true, flag_2 = true, flag_3 = true;

int trig = 8;
int echo = 9;

int plaza_1 = 3;
int plaza_2 = 5;
int plaza_3 = 11;
int trig_plaza1 = 4;
int trig_plaza2 = 10;
int trig_plaza3 = 12;

void setup() {
  //Utilizando la clase Wire se dice que se van a utilizar dos
  //arduinos conectados de forma común
  Wire.begin();
  
  //El servo va a estar situado en el pin número 6
  faro.attach(6);
  //Se incia el puerto serie
  Serial.begin(9600);
  //Se pone como pines de salida el LED que simulará la luz del faro
  pinMode(pinLED, OUTPUT);
  //y el zumbador que simulará la alarma
  pinMode(pinZumbador, OUTPUT);

  //A continuación, se han declarado los pines que se utilizarán 
  //en los sensores de ultrasonidos, poniendo el pin trig como salida
  //y el pin echo como entrada
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(trig_plaza1, OUTPUT);
  pinMode(plaza_1, INPUT);
  pinMode(trig_plaza2, OUTPUT);
  pinMode(plaza_2, INPUT);
  pinMode(trig_plaza3, OUTPUT);
  pinMode(plaza_3, INPUT);
  
  //Durante 5 segundos se va a calibrar la LDR
  while (millis() < 5000) {
    valorsensor = analogRead(A0);
    if (valorsensor > sensorHigh) {
      sensorHigh = valorsensor;
    }
    if (valorsensor < sensorLow) {
      sensorLow = valorsensor;
    }
  }
  
}


void loop() {
  //Con la llamada a esta función se controlorá si el motor
  //girará o no y si el LED estará encendido o no
  controlFaro();
  //Con esta función se va a gestionar la alarma del faro
  alarmaFaro();
  controlFaro();
  //Llamando a esta última función se controlorá el número de
  //plazas que quedan libres en el puerto
  plazas();
 
}


void controlFaro(){
  //Al comienzo se lee la LDR que indica si es de día o de noche
  valorsensor = analogRead(sensorluz);
  //Una vez leído el valor lo escribimos en el puerto serie
  Serial.print("LDR: ");
  Serial.println(valorsensor);
  
  //Si el valor del sensor es menor de 500, se supone que es de noche
  if(valorsensor<=500) {
 /*Este if se utiliza para saber si el motor tiene que girar
    a la izquierda o a la derecha
    Mientras que el motor no llegue a los 180 grados, este irá
    sumando grados hasta llegar al máximo.
    Cuando llegue el flag se pone a false, para que empiece a girar
    en el otro sentido*/
    if(flag){
      angulo += 2;
      if(angulo == 180) flag = false;
    }
    else{
      angulo -= 2;
      if(angulo == 0) flag = true;
    }
 /*Una vez que se ha calculado el ángulo del motor, se le pasará
    a este para que se sitúe en esa posición*/
    faro.write(angulo);
 //Se enciende el LED
    digitalWrite(pinLED, HIGH);
 //Se hace una pequeña pausa para que el motor puede girar de forma correcta
    delay(30);
  }
  //Si es de día, la luz tiene que estar apagada
  else digitalWrite(pinLED, LOW);
}


void alarmaFaro(){
  //Lo primero que se hace es lanzar un pulso desde el sensor de ultrasonidos
  //Para ello, se activa el trigger, se espera 10 microsegundos y se desactiva
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  //A continuación, con la función pulseIn se mide el pulso de salida en microsegundos
  pulso = pulseIn(echo, HIGH); 
  //Con esta función, transformamos los microsegundos en centimetros
  /*La velocidad del sonido a 20º es de 340m/s
  29 microsegundos por cm
  la señal va y vuelve por la misma distancia
  por lo tanto, la distancia a la que se encuentra el objeto es la mitad de la distancia recorrida*/
  distancia = pulso/29/2;

  //Si la distancia está entre 26 y 10 suena un pitido de forma intermitente para avisar
  //a la gente que hay un barco cerca
  if (distancia<=26 && distancia>10){
    tone(pinZumbador, NOTE_D6, 500);
    delay(600);
  }
  //Si la distancia es menor de 10, el pitido suene de forma continua
  else if (distancia <10)  {
    tone(pinZumbador, NOTE_D6, 500);}
  
  //Finalmente, se imprime la distancia en el puerto serie
  Serial.print("Distancia puerto: ");
  Serial.println(distancia);

}


void plazas(){
  //Cada plaza de aparcamiento tiene un sensor de ultrasonidos diferente
  //El proceso para calcular la distancia es el mismo que en la función anterior
  digitalWrite(trig_plaza1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig_plaza1, LOW);
  pulso_1 = pulseIn(plaza_1, HIGH); 
  distancia_1 = pulso_1/29/2;
  
  digitalWrite(trig_plaza2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig_plaza2, LOW);
  pulso_2 = pulseIn(plaza_2, HIGH); 
  distancia_2 = pulso_2/29/2;
  
  digitalWrite(trig_plaza3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig_plaza3, LOW);
  pulso_3 = pulseIn(plaza_3, HIGH); 
  distancia_3 = pulso_3/29/2;
 
  //Una vez calculadas, se muestran en el puerto serie
  Serial.print("Distancia 1: ");
  Serial.println(distancia_1);
  Serial.print("Distancia 2: ");
  Serial.println(distancia_2);
  Serial.print("Distancia 3: ");
  Serial.println(distancia_3);
  
  //Si la distancia del sensor 1 es menor de 5, quiere decir que hay un
  //barco dentro de esa plaza
  if(distancia_1<5){
 //Se utiliza un flag para mandar la señal al otro arduino solo cuando cambie de estado
    //Si no se utilizara ningún flag, cada vez que se hiciera una nueva lectura con un
    //barco en el muelle se indicaría al otro arduino que hay una plaza menos
    if(flag_1){
  //Para comenzar la transmisión, se indica al número de arduino que se va a transmitir
        Wire.beginTransmission(8); 
  //A continuación se envia la información, en este caso un 1 para indicar que tiene 
        que restar una plaza
        Wire.write(1);  
  //Finalmente, se termina la transmisión       
        Wire.endTransmission();    
  //El flag utilizado se tiene que poner a false para que no vuelva a entrar aquí hasta 
que se haya ido el barco
        flag_1=false;
    }
  }
  //Si la distancia del sensor es mayor que 5, quiere decir que no hay un barco en este muelle
  else {
 //Si el flag está desactivado quiere decir que el barco se acaba de ir y se puede mandar
    //al otro arduino la información
    if(!flag_1){
  //La transmisión de información es igual que en el caso anterior
        //a excepción de que se transmite un cero en lugar de un uno
        //Un cero quiere decir que una plaza se ha quedado vacía
        Wire.beginTransmission(8); 
        Wire.write(0);             
        Wire.endTransmission();    
  //El flag que controla este muelle se pone a true para indicar que el muelle 
se ha quedado vacío
        flag_1=true;
    }
  }

  //El control de los otros muelles se realiza de la misma forma que en el muelle uno.
  if(distancia_2<5){
    if(flag_2){
        Wire.beginTransmission(8); 
        Wire.write(1);  
        Wire.endTransmission(); 
        flag_2=false;
    }
  }
  else {
    if(!flag_2){
        Wire.beginTransmission(8);
        Wire.write(0);            
        Wire.endTransmission();   
        flag_2=true;
    }
  }


  if(distancia_3<5){
    if(flag_3){
        Wire.beginTransmission(8);
        Wire.write(1);            
        Wire.endTransmission();   
        flag_3=false;
    }
  }
  else {
    if(!flag_3){
        Wire.beginTransmission(8);
        Wire.write(0);            
        Wire.endTransmission();   
        flag_3=true;
    }
  }
}
Código Pantalla LCD
#include <LiquidCrystal.h>
#include <Wire.h>

/*  Ismael Peña Sánchez
 Lidia Sánchez Calvo
 Enrique José Guzmán de la Iglesia
*/

//Al principio se declara un objeto de la clase LiquidCrystal con los pines que se van a utilizar
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int i=0;
//Esta variable sirve para guardar el número de plazas que hay en el muelle
int numPlazas = 3;

void setup() {
  //Se comienza indicando el número identificativo que va a tener este arduino
  Wire.begin(8);
  //Se inicia el puerto serie
  Serial.begin(9600);
  //Con esta línea se indica que función va a gestionar las excepciones que reciba
  Wire.onReceive(receiveEvent);
  //Una vez registrado el evento, se inicia la pantalla LCD con 16 columnas y 2 filas
  lcd.begin(16, 2);
  //A continuación, se pone en la pantalla el mensaje Bienvenido en la primera línea
  lcd.print("Bienvenido");
  //En la segunda fila se pone el mensaje Plazas: y el número de plazas que hay disponibles
  //para ello se introduce el contenido de la variable numPlazas
  lcd.setCursor(0, 1);
  lcd.print("Plazas: ");
  lcd.setCursor(8, 1);
  lcd.print(numPlazas);
}



void loop() {
  //En este arduino la función loop no va a hacer nada
}

void receiveEvent(int howMany) {
  //Para comenzar se sitúa el cursor en el lugar donde está el número de plazas libres
  lcd.setCursor(8, 1);
  //En la variable x se guarda el número que ha mandado el otro arduino
  int x = Wire.read(); 
  //A continuación, se escribe el valor en el puerto serie
  Serial.println(x);   
  //Si es un cero, quiere decir que ha quedado una plaza vacía y se suma uno al número de plazas
  if(x==0){
    numPlazas++;
  }
  //Si es un 1, quiere decir que ha quedado una plaza menos, por lo que hay que restar uno a las plazas
  else{
    numPlazas--;
  }
  //Finalmente, se imprime el número de plazas en el pantalla y en el puerto serie
  Serial.println(numPlazas);
  lcd.print(numPlazas);
}

Imagen de Pixabay