En esta segunda parte del proyecto se explicaran las mejoras que se hicieron las cuales son:
1.- Saber qué tipo de unidad de rescate (ambulancia o
patrulla) es la que activa el receptor infrarrojo para solicitar el cambio del
estado próximo del semáforo
2.- Haciendo uso de un módulo de bluetooth en arduino enviar
los datos pertenecientes a la unidad de rescate identificada, a una aplicación
móvil
3.- La aplicación móvil de debe desplegar la información
obtenida por el bluetooth, esta información indicara la fecha (dd/mm/yyyy), la
hora (hh:mm:ss), tipo de unidad de rescate (ambulancia o patrulla), la calle y
el número de semáforo por el que paso
4.- Como función extra la aplicación móvil
también es capaz de enviar SMS a algún otro dispositivo móvil con la misma
información que esta aplicación despliega, la razón es muy simple y es que de
este modo podemos enviar los datos a algún otro dispositivo que se encuentre
fuera del rango de alcance del módulo bluetooth el cual es de aproximadamente
10 a 15 metros.
2.- Haciendo uso de un módulo de bluetooth en arduino enviar los datos pertenecientes a la unidad de rescate identificada, a una aplicación móvil
3.- La aplicación móvil de debe desplegar la información obtenida por el bluetooth, esta información indicara la fecha (dd/mm/yyyy), la hora (hh:mm:ss), tipo de unidad de rescate (ambulancia o patrulla), la calle y el número de semáforo por el que paso
4.- Como función extra la aplicación móvil también es capaz de enviar SMS a algún otro dispositivo móvil con la misma información que esta aplicación despliega, la razón es muy simple y es que de este modo podemos enviar los datos a algún otro dispositivo que se encuentre fuera del rango de alcance del módulo bluetooth el cual es de aproximadamente 10 a 15 metros.
PROCEDIMIENTO:
Paso 1: Diferenciar las unidades de emergencia
Para poder identificar qué tipo de unidad de emergencia es la
que requiere el cambio de estado del semáforo se podía hacer de varias formas,
una de ellas era utilizando sensores de color o con sensores de contraste, estos sensores no los encontramos disponibles en las
electrónicas cercanas solo comprado por mercado libre y debido a que no había
tiempo suficiente para que nos llegase él envió decidimos seguir utilizando los
receptores infrarrojos.
Cada unidad de rescate tiene un emisor de luz infrarroja
ubicada a diferentes alturas de modo que cada unidad solo sea capaz de enviar
el haz de luz proveniente de su emisor a un determinado receptor infrarrojo, en
este caso las ambulancias son las que cargan el emisor infrarrojo en la parte
baja y las patrullas en la parte de arriba con una diferencia de 3 cm entre
ambos para evitar que un receptor infrarrojo detecte el equivocado.
- - Ambulancias con el emisor abajo
- - Patrullas con el emisor en la parte de arriba
Paso 2: Configuración del módulo bluetooth
Una vez solucionada la forma en que se identifica la unidad
de rescate, procedimos a conectar el módulo de bluetooth, nosotros utilizamos
el modelo HC-06 (Configuración bluetooth).
La conexión no es complicada, lo único que varía es que el
pin RXD del módulo va conectado al pin TXD de arduino y el pin TXD del módulo
al pin RXD de arduino, esto es debido a que el pin RXD se encarga de recibir
datos y el TXD transmite datos, de esta forma los datos que se transmiten por
del módulo en el pin TXD los recibe arduino en su pin RXD y los que recibe el modulo
en RXD son los que le trasmite arduino en el pin TXD.
Para configurarlo utilizamos arduino y comandos AT, ejecute el siguiente código para configurar el modulo bluetooth.
char NOMBRE[5] = "B06"; //NOMBRE DEL BLUETOOTH
char BPS = '4'; //BAUDIOS 9600, 1 = 1200... 4 = 9600
char PASS[10] = "0000"; //CONTRASEÑA PARA VINCULAR
EL DISPOSITIVO BLUETOOTH
void
setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
delay(10000);
digitalWrite(13,LOW);
Serial.print("AT");
delay(1000);
Serial.print("AT+NAME");
Serial.print(NOMBRE);
delay(1000);
Serial.print("AT+BAUD");
Serial.print(BPS);
delay(1000);
Serial.print("AT+PIN");
Serial.print(PASS);
delay(1000);
}
Una vez configurado el modulo Bluetooth es necesario
vincularlo, para usarlo en la aplicación móvil posteriormente.
Paso 3: Crear la aplicación móvil
Para esto utilizamos una
herramienta muy útil llamada APP INVENTOR (http://appinventor.mit.edu/explore/)
Esta aplicación nos facilita la creación de aplicaciones android,
y es que básicamente para el desarrollo de una aplicación se basa en la
creación de pantallas donde a cada pantalla tiene su vista es decir los
elementos que son visibles para el usuario y el código que contiene las
funciones de lo que realiza cada elemento dentro de la vista de la pantalla, en
la vista se tienen distintos componentes como son botones, label, textbox,
checkbox, etc, los cuales nos facilitan la construcción de la interfaz gráfica
de usuario, el código se crea por medio de bloques de código los cuales no son
más que todas las funciones o métodos que tiene cada elemento que se esté
utilizando en la interfaz gráfica de usuario y también algunos otros elementos
que se integren al proyecto pero que no son visibles para el usuario como son
el bluetooth y el reloj.
Componentes utilizados para crear la aplicación:
Interfaz gráfica:
Explicación del código
Para conectar el dispositivo bluetooth del dispositivo móvil
donde se encuentra ejecutando la aplicación móvil al módulo de bluetooth HC-06,
lo primero que hicimos fue agregar un componente a la vista llamado list picker
este componente posee dos métodos uno llamado BeforePicking este se encarga de
realizar algo antes de que el list picker sea presionado, en este apartado se
pregunta si el bluetooth del dispositivo móvil se encuentra disponible y si es así
entonces obtiene todos los nombres de las direcciones bluetooth que se
encuentran vinculadas al dispositivo móvil y estas a su vez son agregadas como elementos al list picker,
puesto que en el paso 2 ya hemos vinculado el modulo bluetooth este aparecerá
dentro de esta lista.
Bloque de código BeforePicking
Después de agregar la lista de direcciones bluetooth al list
picker, se utiliza el método AfterPicking este método se encarga de hacer algo
después de que un elemento es seleccionado en el list picker, aquí lo que
hacemos es conectar el bluetooth del dispositivo móvil utilizando el método
Connectaddres del componente bluetooth este requiere de una dirección bluetooth
y esta la obtenemos del elemento que se seleccione en el list picker.
Bloque de código AfterPicking
Una vez que logramos establecer una conexión entre ambos
bluetooth, procedemos a configurar nuestro componente textbox, el cual estará
recibiendo todos los mensajes que se reciban de arduino la cual contiene
información perteneciente a la unidad de rescate que activo el receptor
infrarrojo y el semáforo al que se le
solicito el cambio de estado.
Para esto utilizamos la función Timer del reloj, una función
que se está ejecutando cada segundo lo primero que hacemos es verificar si el
bluetooth está conectado y si los bytes que se dispone a recibir son mayores a
0, de cumplirse ambas funciones entonces en una variable global creada con
anterioridad llamada btexto obtendrá los datos de la fecha actual (dd/mm/yyyy)
y hora (hh:mm:ss)
provenientes del componente reloj estos son concatenados con el tipo de vehículo, la calle por la que transita y numero de semáforo al que se le solicito el cambio de estado estos son enviados por arduino a través del módulo HC-06.
provenientes del componente reloj estos son concatenados con el tipo de vehículo, la calle por la que transita y numero de semáforo al que se le solicito el cambio de estado estos son enviados por arduino a través del módulo HC-06.
Una vez obtenida esta información en la variable btexto se
la pasamos al componente textbox, debido a que el método set text de este
componente sobrescribe todo lo que se tenía con anterior decidimos hacer un
join el cual concatena todo lo que se tenía anteriormente en el textbox mas lo
que se obtuvo en la variable global.
Posteriormente redactamos un SMS pesándole como texto, toda
la información de la variable btexto, el número de teléfono el cual
establecimos estático y el método SendMessage, que se encarga de enviar el
mensaje
La razón por la que usamos una variable global es porque una
vez utilizada la función ReceiveText para recibir el texto que envía arduino,
estos datos son borrados de la función por ello tenemos que almacenarlos para
que puedan ser enviados la primera vez al textbox y la segunda vez al texto del
SMS, la variable global no hace falta limpiarla ya que el meto set sobrescribe todo lo que esta tenía anteriormente.
Bloque de código:
Paso 4: Armar el circuito
Para armar el circuito lo que se deben agregar es el modulo bluetooth y los dos receptores infrarrojos mas en cada calle los cuales deben estar un poco mas arriba que los utilizados en la parte anterior del proyecto
Diagrama:
Paso 5: Creación y ejecución del código en arduino
Una vez armado el circuito, debe copiar y ejecutar el siguiente código, el cual es muy similar al utilizado en la parte 1 del proyecto ( Parte 1 );
.
Para armar el circuito lo que se deben agregar es el modulo bluetooth y los dos receptores infrarrojos mas en cada calle los cuales deben estar un poco mas arriba que los utilizados en la parte anterior del proyecto
Diagrama:
Paso 5: Creación y ejecución del código en arduino
Una vez armado el circuito, debe copiar y ejecutar el siguiente código, el cual es muy similar al utilizado en la parte 1 del proyecto ( Parte 1 );
.
int verde1 = 2;
int amarillo1 = 3;
int rojo1 = 4;
int verde2 = 6;
int amarillo2 = 7;
int rojo2 = 8;
int millisActuales;
int millisAnteriores=0;
int receptor1 = A1;
int receptor2 = A2;
int
receptor3 = A3;
int
receptor4 = A4;
int tiempo2
= 0;
void
setup() {
Serial.begin(9600);
pinMode(verde1,OUTPUT);
pinMode(amarillo1,OUTPUT);
pinMode(rojo1,OUTPUT);
pinMode(verde2,OUTPUT);
pinMode(amarillo2,OUTPUT);
pinMode(rojo2,OUTPUT);
pinMode(receptor1,INPUT);
pinMode(receptor2,INPUT);
}
void loop() {
inicio();
}
void inicio(){
millisActuales =
millis();
//Se leen los
valores de los sensores infrarrojos 1 y 2
int valor1 = analogRead(receptor1);
int valor2 =
analogRead(receptor2);
int valor3 =
analogRead(receptor3);
int valor4 =
analogRead(receptor4);
/*
* para calcular el
tiempo exacto entre cada loop restamos los milisegundos del utimo loop
(millisAnteriores) de los milisegundos actuales (millisActuales)
* el primer loop
los millisAnteriores son igual a 0, despues incrementan en 20,000 por loop y
asi sucecivamente, esto se hace debido a que la funcion millis
* no se puede
reiniciar a no ser que se aplique un overflow
*
* Ahora tambien se
agrega un valor mas, que es el tiempo2 cuya funcion es la de acelerar la
trancicion de los semaforos de verde a rojo dependiendo de que semaforo sea
*
*/
int tiempo =
millisActuales - millisAnteriores + tiempo2;
if(tiempo <
7000){
/*
* semaforo 1 en
verde y semaforo 2 en rojo por 7 segundos
*/
digitalWrite(verde1,HIGH);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
digitalWrite(verde2,LOW);
digitalWrite(amarillo2,LOW);
digitalWrite(rojo2,HIGH);
/*
* Tras obtener el
valor del sensor infrarrojo numero 2, es decir el sensor ubicado en el semaforo
2
* se compara si
este valor es mayor a 90, es decir, si detecto una luz infrarroja proveniente
de la unidad
* de rescate, si
la condicion se cumple entonces al tiempo2 se le asigna el valor de los
milisegundos que resten
* para terminar
el estado del semaforo 1 (que esta en verde) y acelerar su transicion a rojo,
haciendo que el
* semaforo 1 pase
rapidamente de verde a amarillo, dando 3 segundo a los vehiculos a pasar o
detenerse
*
*/
if(valor3 > 140
|| valor4 > 140){
tiempo2 = 7000 -
(millisActuales - millisAnteriores);
/*
* Si el valor3
que corresponde al receptor infrarrojo 3 incrementa a más de 90 quiere decir
que
* detecto un
haz de luz infrarrojo proveniente de la unidad de emergencia, la ambulancia es
la unica capaz
* de emitir un
haz de luz al receptor infrarrojo 1 o 3 (valor1 o valor3), por lo tanto los
datos enviados
* al bluetooth
hacen referencia a los de una ambulancia
*/
if(valor3 >
140){
Serial.println();
Serial.println("Ambulancia A019");
Serial.println("Av.
Independencia");
Serial.println("Semaforo: 327");
Serial.println();
}
/*
* De igual
forma que con el if anterior este se hace para saber si fue una patrulla la que
paso por
* el receptor
infrarrojo, enviado de esta forma al bluetooth los datos pertenecientes a una
patrulla
*/
if(valor4 >
140){
Serial.println();
Serial.println("Patrulla P043");
Serial.println("Av. Independencia");
Serial.println("Semaforo: 327");
Serial.println();
}
}
}
if(tiempo > 7000
&& tiempo < 10000){
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,HIGH);
digitalWrite(rojo1,LOW);
digitalWrite(verde2,LOW);
digitalWrite(amarillo2,LOW);
digitalWrite(rojo2,HIGH);
}
if(tiempo > 10000
&& tiempo < 17000){
/*
* semaforo 1 en
rojo y semaforo 2 en verde por 7 segundos
*/
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,HIGH);
digitalWrite(verde2,HIGH);
digitalWrite(amarillo2,LOW);
digitalWrite(rojo2,LOW);
/*
* Esta funcion es
similar a la anterior del semaforo 1, solo que en esta se comprueba si el
* sensor
infrarrojo 1, que se encuentra en el semaforo 1 detecto luz infrarroja para
acelerar
* la transicion
del semaforo 2 a rojo, pasando primero por un cambio a amarillo de 3 segundos
* nuevamente para
que los vehiculos tengan tiempo de pasar o detenerse.
*/
if(valor1 > 140
|| valor2 > 140){
tiempo2 = 17000
- (millisActuales - millisAnteriores);
/*
* Solo la
ambulancia es capaz de incrementar los valores del receptor infrarrojo 1 o 3
(valor1 o valor3)
*/
if(valor1 >
140){
Serial.println();
Serial.println("Ambulancia
A019");
Serial.println("Av. Independencia");
Serial.println("Semaforo: 327");
Serial.println();
}
/*
* Solo la
patrulla es capaz de incrementar los valores del receptor infrarrojo 2 o 4 (valor2
o valor4)
*/
if(valor2 >
140){
Serial.println();
Serial.println("Patrulla P043");
Serial.println("Av. Independencia");
Serial.println("Semaforo: 327");
Serial.println();
}
}
}
if(tiempo > 17000
&& tiempo < 20000){
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,HIGH);
digitalWrite(verde2,LOW);
digitalWrite(amarillo2,HIGH);
digitalWrite(rojo2,LOW);
}
if(tiempo >
20000){
/*
* Una vez
terminados 20 segundos el valor de millisAnteriores pasa a ser el de los
millisActuales para que el
* tiempo nunca
supere los 20 segundos, y siempre sea un ciclo entre 0 y 20 segundos.
*/
millisAnteriores =
millisActuales;
/*
* La variable
tiempo2 la tenemos definida global y su valor se mantiene tras realizarce cada
loop por ello
* que se resete
su valor a 0
*/
tiempo2 = 0;
}
}
Paso 6: Pruebas
Nota: Puede descargar la aplicación móvil(.apk) o descargar el archivo del desarrollo de la aplicación (.aia) y realizar las modificaciones que desee en app inventor .
FIN :)
Paso 6: Pruebas
Nota: Puede descargar la aplicación móvil(.apk) o descargar el archivo del desarrollo de la aplicación (.aia) y realizar las modificaciones que desee en app inventor .
FIN :)
-------------------------------------------------------------------------------







