Este proyecto tiene la finalidad de demostrar a los alumnos la utilidad de los pequeños autómatas programables para el cuidado de las personas, cuando estos autómatas se integran con la telemática. También sirve para demostrar a los alumnos que no hay que sobrecargar los autómatas con mucha lógica, sino dejarlas para lo que están hechas, que es, por una parte, recoger información con sensores y enviarla a otros sistemas con más capacidad de cálculo para la toma de decisiones; y por otra parte, recibir instrucciones de otros sistemas y aplicarlo a los actuadores.
Los objetivos de desarrollo sostenible relacionados con este trabajo son los siguientes:
El proyecto tiene dos partes diferenciadas, cuyos componentes se detallan en el apartado "Componentes":
Este proyecto está dirigido a alumnos de Grado Superior de Formación Profesional; en especial a los del ciclo de Sistema Electrotécnicos y Automatizados.
Este
proyecto abarca conocimientos transversales de electrónica, domótica, electricidad y programación. Se puede impartir en asignaturas como Técnicas y procesos en instalaciones domóticas y automáticas, así como Configuración de instalaciones domóticas y automáticas.
#include <ArduinoJson.h> //Librería para manipulacione de cadenas en formato JSON
// Variables globales para el sensor de ultrasonido
const int pinTrigger = 2; //Pin digital 2 para el Trigger del sensor
const int pinEcho = 3; //Pin digital 3 para el Echo del sensor
// Variables globales para el inclinometro
int tiltPin = 7;
int lectura;
int previo = LOW;
long time = 0; // Para guardar la hora de la inversion de valor
long debounce = 50; // Tiempo de rebote
// Variables arranque motor: botón
const int pinArranqueMotor = 8; // pin digital 8, para el botón de arranque del motor
//Variables globales del vehículo
String persona_contacto = "Pastor Nso Mangue";
String telefono_contacto = "682xxxxxx";
String email_contacto = "idu004695@usal.es";
String posicion_vehiculo = "Derecho"; //Puede ser "Derecho" o "Volteado"
String estado_vehiculo = "Normal"; //Puede ser "Normal" o "Chocado"
//String estado_motor = "OFF";
int velocidad_vehiculo = 0; // En kilometros/hora
int proximidad_choque = 0;
String longitud_coordenadas = "GSP inactivo"; // Para futuras aplicaciones
String latitud_coordenadas = "GPS inactivo"; // Para futuras aplicaciones
String vehiculo_accidentado = "NO"; // Estado general del vehículo
// Habilitar el documento JSON
JsonDocument payload;
/*Formato JSON de las variables globales del vehículo; una cadena de caracteres con formato interpretable
{"persona_contacto":"Pastor Nso Mangue",
"telefono_contacto":"682711196",
"email_contacto":"idu004695@usal.es",
"vehiculo_accidentado":"NO",
"posicion_vehiculo":"Derecho"
,"estado_vehiculo":"Chocado",
"velocidad_vehiculo":264,
"proximidad_choque":4,
"longitud_coordenadas":"GSP inactivo",
"latitud_coordenadas":"GPS inactivo"}
*/
// led de Arranque y Parada color amarillo, motor en funcionamiento
const int ledArranqueParada = 12;
// led indicador de accidente
const int ledAccidente = 13;
void setup() {
//Inicialización sensor ultrasonido
pinMode(pinTrigger, OUTPUT); //pin como salida
pinMode(pinEcho, INPUT); //pin como entrada
digitalWrite(pinTrigger, LOW);//Inicializamos el pin con 0
//Inicialización inclinometro
pinMode(tiltPin, INPUT_PULLUP);
//Botón de arranque
pinMode(pinArranqueMotor, INPUT_PULLUP);
//Definir los I/O de Arduino
pinMode(ledArranqueParada , OUTPUT); //definir pin como salida
pinMode(ledAccidente , OUTPUT); //definir pin como salida
//Inicializar Puerto Serie
Serial.begin(9600);
//while (!Serial)
// continue;
}
void loop() {
// Lectura sensor de ultrasonido
long t; //timepo que demora en llegar el eco
long d; //distancia en centimetros
digitalWrite(pinTrigger, HIGH);
delayMicroseconds(10); //Enviamos un pulso de 10us
digitalWrite(pinTrigger, LOW);
t = pulseIn(pinEcho, HIGH); //obtenemos el ancho del pulso
d = t/59; //escalamos el tiempo a una distancia en cm
proximidad_choque = d; //distancia del vehiculo al objeto con el que choca
if (proximidad_choque < 10) {
estado_vehiculo = "Chocado"; //Si hay contacto con el objeto, simular accidente y estado_vehículo = "Chocado"
digitalWrite (ledAccidente, HIGH);
vehiculo_accidentado = "SI";
digitalWrite(ledArranqueParada,LOW); // Apagar el motor
//estado_motor = "OFF";
} else {
estado_vehiculo = "Normal";
digitalWrite (ledAccidente, LOW);
vehiculo_accidentado = "NO";
}
// Lectura sensor de vuelco
lectura = digitalRead(tiltPin);
if (lectura != previo) time = millis(); // Si hay cambio en la lectura
if ((millis() - time) > debounce) {
if (lectura == HIGH) {
posicion_vehiculo = "Volcado"; // registrar qu el coche ha volcado
vehiculo_accidentado = "SI";
digitalWrite(ledArranqueParada,LOW); //Apagar el motor
digitalWrite (ledAccidente, HIGH);
//estado_motor = "OFF";
} else {
posicion_vehiculo = "Derecho"; // registrar que el coche sigue derecho
digitalWrite (ledAccidente, LOW);
vehiculo_accidentado = "NO";
}
}
previo = lectura ;
// Lectura del potenciómetro de velocidad
// leemos del pin A0 valor
int velocidad = analogRead(A0);
velocidad_vehiculo = map(velocidad, 0, 1023, 0, 240);velocidad; //registrar la velocidad del vehículo
//velocidad_vehiculo = velocidad;
// Indicar si el motor del vehículo está en funcionamiento o parado
int estadoMotor = digitalRead (pinArranqueMotor);
if (estadoMotor == HIGH) {
digitalWrite(ledArranqueParada,HIGH);
}
//Comunicar el estado de las variables al panel de monitorización
payload["persona_contacto"] = persona_contacto;
payload["telefono_contacto"] = telefono_contacto;
payload["email_contacto"] = email_contacto;
payload["vehiculo_accidentado"] = vehiculo_accidentado;
payload["posicion_vehiculo"] = posicion_vehiculo;
payload["estado_vehiculo"] = estado_vehiculo;
//payload["estado_motor"] = estado_motor;
payload["velocidad_vehiculo"] = velocidad_vehiculo;
payload["proximidad_choque"] = proximidad_choque;
payload["longitud_coordenadas"] = longitud_coordenadas;
payload["latitud_coordenadas"] = latitud_coordenadas;
// Generar el documento JSON con todas las variables juntas y enviarlo al puerto serie de Arduino
serializeJson(payload, Serial);
Serial.println(); //acuse de envío de mensaje desde arduino por puerto serie
delay(5000); // Dormir 5 segundos y volver a escanear el estado del vehículo
}
Node-Red (flujos)
Posibles mejoras
Este proyecto se puede mejorar incorporando una aplicación móvil (Android o iOS), que le permita al usuario conectarse mediante Bluetooth a Arduino. Dicha aplicación se programará en pseudocódigo de Mit App Inventor 2.
A través de esta aplicación el usuario podrá configurar los parámetros de la persona de contacto, en caso de percance.
La aplicación móvil también se encargará de alertar mediante voz o zumbido si el usuario excede de velocidad; así como notificar mediante SMS a un teléfono de contacto o incluso establecer una llamada al contacto en tiempo real.
Otras utilidad que se le puede dar a esta aplicación móvil es presentar al usuario su ubicación en el mapa y también incorporar la ubicación (latitud y longitud) en la notificaciones.
Si se incorpora una tarjeta de memoria SD al proyecto, éste podría servir también como una especie de "caja negra" del vehículo, donde quedan registrados los parámetros como velocidad, posición, localización, estado del motor, etc.
Aclaraciones
En el vídeo, el autor describió la velocidad en kilómetros por segundo. En realidad, debería ser en kilómetros por hora.
Comentarios