Está en la página 1de 33

GESTION DE PROYECTOS DE SOFTWARE

Sistema de Reconocimiento Facial

Alumno: Sanchez, Orlando Hugo

ITES – Delegacion Toay

16/11/2017
INTRODUCCION

En la actualidad podemos observar en diversos ámbitos, como en la administración


pública, establecimientos educativos, entidades financieras, organismos de seguridad,
etc., el control y seguimiento de las personas que ingresan, egresan y circulas por el
interior de las distintas dependencias de dichas instituciones. Dicha tarea es
actualmente realizada por personal propio o por agencias de seguridad contratadas, a
tales fines. Esto conlleva a un gasto significativo de recursos, un registro de control
ineficiente, con una estructura organizativa rígida y difícilmente adaptable a nuevos
requerimientos.

Por ello se hace recomendable y necesario, la utilización de la tecnología de


reconocimiento de imágenes aplicada en esta problemática para solventar las
deficiencias actuales y lograr una automatización en el control de acceso, registro de
visitas, notificaciones de eventualidades, etc.; con vistas a reducir costos operativos y
mejorar los márgenes de seguridad de los sistemas existentes.

DESCRIPCION DEL PROYECTO

El presente proyecto trata sobre la implementación de un sistema de reconocimiento


facial y de control de acceso automatizado por software. El sistema de reconocimiento
facial es una aplicación de software ejecutada en un ordenador que identifica
automáticamente a una persona mediante una imagen digital obtenida por una cámara
de video. Esto es posible mediante un análisis de las características faciales del sujeto
extraídas de la imagen o de un fotograma clave y comparándolas con una base de
datos. Si las características identificatorias del rostro de la persona se correlacionan
con algunos de los rostros almacenados previamente en la Base de Datos, se procede
a la apertura de la puerta de acceso para el ingreso/salida de la persona identificada.
OBJETIVO

El objetivo de un sistema de reconocimiento facial es, generalmente, el siguiente: dada


una imagen de una cara "desconocida", o imagen de test, encontrar una imagen de la
misma cara en un conjunto de imágenes "conocidas", o imágenes de entrenamiento. La
gran dificultad añadida es la de conseguir que este proceso se pueda realizar en
tiempo real. El sistema identificará las caras presentes en imágenes o videos
automáticamente. Puede operar en dos modos:

 Verificación o autentificación de caras: compara una imagen de la cara con otra


imagen con la cara de la que queremos saber la identidad. El sistema confirmará
o rechazará la identidad de la cara.
 Identificación o reconocimiento de caras: compara la imagen de una cara
desconocida con todas las imágenes de caras conocidas que se encuentran en
la base de datos para determinar su identidad.

Por su naturaleza amigable, este tipo de sistemas siguen siendo atractivos a pesar de
la existencia de otros métodos muy fiables de identificación personal biométricos, como
el análisis de huellas dactilares y el reconocimiento del iris.
En este contexto, una de las tantas aplicaciones que podemos desarrollar con esta
tecnología, es la de control de acceso a sectores de mediana y alta seguridad por la
autenticación de personas mediante el reconocimiento de rostros.

Con este punto de vista, se planifico la implementación el presente sistema con el fin
de servir para controlar el acceso o circulación de personas por despachos, oficinas o
lugares sensibles de la administración pública o empresas privadas. Por ejemplo en las
alcaidías, los visitantes que ingresan a los sectores de alojamiento de los detenidos,
son identificados mediante la impresión de sus huellas dactilares y cotejándolas
individualmente en una hoja de papel por un dactiloscopo, que debe confrontar ambas
huellas, buscar los patrones característicos de las mismas y verificar que sean
idénticos. Este sistema manual sobrecarga al operador humano que debe realizar dicha
operación entre 200 a 400 veces diarias, dependiendo la cantidad de visitantes que
asistan al establecimiento, lo cual produce largas demoras en el ingreso de personas,
inconvenientes en la seguridad por la conglomeración de individuos en un mismo
sector, la posibilidad del error humano ante el cansancio inevitable de la realización de
una tarea repetitiva por un lapso de tiempo tan prolongado, etc.

Por ello, con la implementación de un sistema automático de reconocimiento facial se


disminuiría la posibilidad de errores a causa del factor humano, se disminuirían
drásticamente los tiempos de espera, asegurándose una mayor seguridad, mejor
atención al visitante, etc.
REQUERIMIENTOS

 El sistema deberá autenticar al usuario mediante una pantalla de login, deberá


restringir el acceso al usuario a las funciones dispuestas en un menú principal
según su nivel de seguridad asignado previamente.

 El sistema permitirá adicionar un nuevo usuario asignándole un nivel de


seguridad, también permitirá la eliminación de un usuario existente o la
modificación de los datos o nivel de seguridad del mismo.

 El sistema permitirá adicionar un nuevo visitante almacenando los datos


filiatorios y el perfil histografico de su rostro. También deberá implementar los
procedimientos para la eliminación de un visitante existente o la modificación de
los datos filiatorios del mismo.

 El sistema deberá vigilar y detectar el rostro de cualquier visitante que quiera


ingresar o egresar por la puerta de acceso a controlar, identificando si el rostro
del visitante se encuentra almacenado en el sistema.

 El sistema en el caso que haya identificado positivamente al visitante deberá


enviar una señal de apertura al mecanismo de control de la puerta de acceso y
esperara sin procesar nuevos rostros por el lapso de tiempo de espera fijado la
señal del mecanismo de apertura de la puerta de acceso indicando que el
visitante ha terminado de traspasar la misma, recibida la señal volverá a
identificar rostros.

 En caso que el visitante no sea identificado deberá mostrar un mensaje de alerta


en la pantalla del usuario informando dicho evento.

 El sistema en caso que haya finalizado el lapso de tiempo de espera y no haya


recibido la señal del mecanismo de apertura de la puerta de acceso indicando
que el visitante ha terminado de traspasar la misma, deberá mostrar un mensaje
de alerta en la pantalla del usuario avisando dicho evento.
DICCIONARIO DE DATOS:

Usuario: Es la persona que utiliza el sistema, existen tres tipos diferentes, codificados
de la siguiente manera

Código Perfil Nivel de seguridad


00 Administrador Alto
01 Supervisor Medio
02 Operador Bajo

Nivel de Seguridad: Establece las restricciones de acceso de los usuarios a las


funciones del sistema, existen tres niveles de acuerdo al siguiente esquema

Alto: El usuario tiene control total del sistema, acceso irrestricto a todas las
funcionalidades del mismo.

Medio: El usuario puede gestionar el alta, baja y eliminación de visitantes, también


puede acceder a la pantalla de identificación de visitantes y control de la puerta de
acceso

Bajo: El usuario solamente está autorizado a acceder a la pantalla de identificación de


visitantes y control de la puerta de acceso

Visitante: Es la persona ha identificar por el sistema y autorizar su ingreso u egreso.

Mecanismo de apertura de la puerta de acceso: La apertura y cierre de la puerta de


acceso a controlar esta automatizada con un controlador basado en arduino

Tiempo de espera: Está definido en milisegundos y su valor es 5000

Perfil histografico: Son las características identificadoras del rostro del visitante
codificadas en una matriz de valores de punto flotante
ESQUEMA DE LA ARQUITECTURA DEL SISTEMA
PLANIFICACION

La implementación del proyecto estará dividido en dos etapas. La primera consiste en


codificar los módulos necesarios para adquirir la imagen de las personas a reconocer,
mediante el reconocimiento facial utilizando funciones y algoritmos de la biblioteca
OPENCV, para ello utilizamos como IDE de programación el QT CREATOR 4.0 que
viene incluido con el framework C/C++ QT 5.6; luego del procesamiento de la misma y
obteniendo un histograma que nos servirá para comparar mas adelante con la imagen
a verificar, este histograma junto con los datos filiatorios de la persona a registrar se
almacena en un gestor de base de datos relacional, en nuestro caso MySQL.
En esta etapa también se codifica los módulos correspondientes para dar de alta,
modificar o borrar una persona en el sistema.
En la segunda etapa se codificara el modulo de control de personas, que
automáticamente detectara el rostro de una persona que desea pasar por un acceso
restringido, procesara la imagen y comparara su histograma con los histogramas
almacenados en la base de datos del sistema. Si encuentra un matching (coincidencia),
el sistema enviara una señal a un microcontrolador arduino, el cual maneja el
accionamiento de apertura y cierre de la puerta de acceso, dejando pasar a la persona
o en caso negativo realizando un aviso al operador del sistema, que la persona que
intenta pasar no esta autorizada o registrada en el sistema. También se codificara el
módulo de gestión de usuarios del sistema y el módulo de login o control de ingreso al
sistema.

DIAGRAMA DE FLUJO DEL SISTEMA DE IDENTIFICACION


DESCRIPCION DE PROCEDIMIENTOS A IMPLEMENTAR EN LA 1ra. ETAPA:

Adquisición de imágenes: Se utilizan funciones que trae OpenCV para manejar las
imágenes captadas por una cámara digital.

Detección Facial: OpenCV trae implementado el algoritmo de detección de patrones


Viola-Jones. Conseguimos tiempos de detección de apenas 20ms

Tratamiento de la Imagen: Una vez sabemos que hay una cara la recortaremos para
quedarnos con la información que verdaderamente nos interesa, obviando la
información que no nos interesa (el fondo).

Pre procesado de las Imágenes: Trataremos de normalizar el tamaño tanto de las


imágenes. Además ecualizaremos el contraste (igualación de histograma), para obtener
un histograma más uniforme, logrando resaltar detalles que antes no se veían.

Procesamiento de las imágenes: Se utiliza clases y objetos de OpenCV para generar


un histograma de los rostros analizados

Persistencia de las imágenes: Se almacenan los histogramas de cada rostro en una


base de datos MySQL relacionada con los datos filiatorios de la persona.

Captura de pantallas de la 1ra. Etapa del sistema


DESCRIPCION DE PROCEDIMIENTOS A IMPLEMENTAR EN LA 2da. ETAPA:

Control de acceso al sistema por parte el usuario (login): Se chequea el nombre y


contraseña que ingresa del usuario contra las almacenadas en la base de datos y se le
asigna un perfil de acuerdo al nivel de seguridad asignado

Gestión de usuarios del sistema: Se realiza el almacenamiento en la base de datos


de nuevos usuarios cada uno con su correspondiente nombre, contraseña y nivel de
seguridad.

Gestión de perfiles de usuarios: Se habilita o deshabilita funciones del menú


principal de acuerdo al nivel de seguridad que posea cada usuario.

Identificación y control acceso de personas: Se utiliza clases y objetos de OpenCV


para generar un histograma de los rostros a identificar y se los compara con los
histogramas almacenados en la base de datos, si el matching es positivo se activa el
módulo de comunicación con el mecanismo de apertura de la puerta de acceso para la
apertura de la misma.

Comunicación con el mecanismo de apertura de la puerta de acceso: Mediante el


puerto serial se envía datos al arduino que controla la apertura y cierre de la puerta de
acceso para su control
DICCIONARIO DE DATOS – ENTIDADES BASE DE DATOS

TABLA USUARIO:

DNI: INTEGER – CLAVE PRIMARIA – NO NULO

PASSWORD: STRING

COD_PERFIL: INTEGER

TABLA CONFIG:

COD_PERFIL: INTEGER

TABLA PERFIL:

COD_PERFIL: INTEGER – CLAVE PRIMARIA – NO NULO

DESCRIPCION: STRING

TABLA VISITA:

LEGAJO: INTEGER – CLAVE PRIMARIA – NO NULO

APELLIDO: STRING

NOMBRE: STRING

TELEFONO: STRING

DNI: INTEGER

DOMICILIO: STRING

FOTO: ARRAY DE BYTES

SEXO: BOOLEAN

NACIMIENTO: DATE
LISTADO DE CLASES Y METODOS:

Calse: MAINWINDOWS

Atributos

Tipo Nombre

DialogBaja* m_DialogBaja;
DialogModifica* m_DialogModifica;
DialogAltaUsuario* m_DialogAltaUsuario;
DialogModUsuario* m_DialogModUsuario;
DialogBajaUsuario* m_DialogBajaUsuario;
Vigilante* m_Vigilante;
QLabel* LblNotificacion;
QString strName;
QString strDriver;
QString strHost;
QString strUserName;
QString strPassword;
QSqlDatabase maestraDB;
int perfil;

Métodos

Valor retorno Nombre

void getPerfil();
void HabilitarMenu();
void showEvent(QShowEvent* event);
void on_actionSalir_triggered();
void on_actionAcerca_de_triggered();
void on_actionAlta_Visitas_triggered();
void on_actionBaja_Visita_triggered();
void on_actionModificar_Visita_triggered();
void on_actionMostrarCamara_triggered();
void on_actionAgregar_Usuario_triggered();
void on_actionModificar_Usuario_triggered();
void on_actionEliminar_Usuario_triggered();
void on_actionMostrar_Camara_triggered();
Clase: DIALOGALTA

Atributos

Tipo Nombre

QTimer* Reloj;
cv::VideoCapture cv_Camara;
cv::Mat cv_Frame;
QImage ImgOriginal,
QImage ImgFoto;
cv::CascadeClassifier faceDetector;
std::vector<cv::Rect> rect;
int Bandera
int Error
int Foto;
int contador;
std::vector<cv::Mat> ListImagenes;
std::vector<int> ListEtiquetas;
cv::Mat imgProcesar,
cv::Mat imgGuardar;

Métodos

Valor retorno Nombre

void setFocus ();


void configObjetos();
void iniciarCamara();
void iniciarControles();
void limpiarControles();
bool isDatosIngresados();
bool editLineVacio(QString Edit);
void insertarMascaras();
QString mostrarTexto(int numero);
void mat2Image(const cv::Mat& mat, QImage& destino);
void on_BtnCapturaFoto_clicked();
void on_btnExit_clicked();
void procesarFrame();
void on_BtnBorrarFoto_clicked();
void on_BtnAgregar_clicked();
void on_BtnRetirar_clicked();
void on_BtnAlta_clicked();
Clase: DIALOGMODIFICA

Atributos

Tipo Nombre

QString varHistograma;
short int numLegajo;
bool isBusqueda;

Métodos

Valor retorno Nombre

void insertarMascara();
void limpiarPantalla();
void limpiarControles();
void iniciarControles();
void setFocus();
void on_BtnSalir_clicked();
void on_BtnLegajo_clicked();
void on_BtnDNI_clicked();
void on_BtnAceptar_clicked();
void on_BtnBorrar_clicked();
void on_BtnBusqueda_clicked();

Clase: DIALOGLOGIN

Atributos

Tipo Nombre

int cantIntentos;

Métodos

Valor retorno Nombre

Void on_btnCancel_clicked();
void on_btnAceptar_clicked();
void LimpiarControles();
bool isCamposCompletados();
Clase: DIALOGBAJA

Atributos

Tipo Nombre

Int numLegajo;
bool isBusqueda;

Métodos

Valor retorno Nombre

void limpiarControles();
void setFocus();
void on_BtnSalir_clicked();
void on_BtnLegajo_clicked();
void on_BtnDNI_clicked();
void on_BtnBorrar_clicked();
void on_BtnBusqueda_clicked();
void on_BtnAceptar_clicked();

Clase: DIALOALTAUSUARIO

Métodos

Valor retorno Nombre

void insertarMascaras();
bool isCamposCompletados();
void limpiarPantalla();
void on_BtnSalir_clicked();
void on_BtnBorrar_clicked();
void on_BtnGrabar_clicked();
Clase: DIALOGMODUSUARIO

Métodos

Valor retorno Nombre

void LLenarUsuarios();
void LLenarPerfiles();
void CargarDatos(int _codUsuario);
int BuscarIndicePerfil(int codPerfil);
bool isDatosCompletos();
int getCodPerfil(int indice);

Clase: DIALOGBAJAUSUARIO

Métodos

Valor retorno Nombre

void llenarCombo();
QString getPerfil(int codPerfil);
void on_BtnExit_clicked();
void on_BtnBorrar_clicked();

Clase: DIALOGACERCADE

Métodos

Valor retorno Nombre

void on_BtnSalir_clicked();
Clase: VIGILANTE

Atributos

Tipo Nombre

QTimer* Reloj;
QTimer* RelojIdentificarRostro;
QTimer* RelojSerial;
cv::VideoCapture cv_Camara;
cv::Mat cv_Frame;
int Bandera _Error;
QImage ImgFoto;
int Bandera_Foto;
cv::CascadeClassifier faceDetector;
cv::Mat imgProcesar;
bool isRostroDetectado;
QVector<TipoVisita*> ListVisitantes;
QImage ImgOriginal;
std::vector<cv::Rect> rect;

Métodos

Valor retorno Nombre

void procesarFrame();
void identificarRostro();
void ChequearPuerta();
void on_BtnSalir_clicked();
void on_btnAbrirPuerta_clicked();
void iniciarCamara();
void configObjetos();
void cargarBaseDatos();
void mat2Image(const cv::Mat& mat, QImage& destino);
void mostrarRostro(int _legajo);
bool abrirPuerta();
void LimpiarPantalla();
Clase: FORMALTA

Atributos

Tipo Nombre

QTimer* Reloj;
cv::VideoCapture cv_Camara;
cv::Mat cv_Frame;
QImage ImgOriginal;
QMessageBox* Mensaje;
QCVImage* Convertir;

Métodos

Valor retorno Nombre

void configObjetos();
void iniciarCamara();
void procesarFrame();
void on_BtnCapturaFoto_clicked();
void on_BtnBorrarFoto_clicked();
void on_btnExit_clicked();

Clase: TIPOCONEXION

Atributos

Tipo Nombre

QString strName;
QString strDriver;
QString strHost;
QString strUserName;
QString strPassword;
QSqlDatabase maestraDB;
bool isNotOpen;

Métodos

Valor retorno Nombre

bool errorConectar();
void Abrir();
QSqlDatabase getBaseDatos();
void Cerrar();
QString lastError();
DIAGRAMAS DE CASO DE USO

El Actor usuario del sistema puede ser un operador, un supervisor de este o el


administrador del sistema.
El Actor usuario si tiene permisos de administrador puede procesar el alta de un nuevo
usuario, modificar los datos o procesar la baja de uno existente.

El Actor usuario puede ingresar al sistema logeandose con su password.


El Actor usuario (supervisor o administrador) puede realizar el alta de un nuevo
visitante o procesar la modificación de los datos o eliminación de uno existente.
El proceso de reconocimiento e identificación de visitas puede reconocer y clasificar el
rostro de un visitante como de una persona y almacenar sus características únicas e
individuales en un histograma. También puede buscar el histograma del rostro del
visitante reconocido en la base de datos del sistema.
El proceso compara el grado de similitud de los histogramas almacenados en el
sistema con el histograma del rostro reconocido ponderando un porcentaje de
probabilidad de acierto. Cuando se produce una identificación positiva procede a
buscar la información del visitante en la base de datos.

El Actor visitante cuando se para adelante de la puerta de acceso frente a la cámara


digital espera del sistema la apertura de la puerta. El Actor arduino abre y cierra la
puerta conforme los comandos que le transmite el sistema.
DIAGRAMAS DE SECUENCIA – CLASE VIGILANTE

La clase Vigilante, se encarga de monitorear continuamente la cámara dispuesta en la


entrada de la puerta de acceso, cuando capta una imagen y reconoce que es el rostro
de una persona, crea un modelo o histograma de las características faciales del
visitante, las compara con los histogramas almacenados en el sistema y si detecta que
la correspondencia es superior a un porcentaje x de probabilidad que sean iguales,
envía los comandos pertinentes por el puerto serie al mecanismo de apertura de la
puerta que esta controlado por un microprocesador arduino, cuando la persona ha
cruzado la puerta, se recibe la señal desde el arduino y se envía el comando de cierre
de la misma.
FLUJO PROGRAMA ALTA VISITANTE
DIAGRAMA CONEXIÓN DISPOSITIVO ARDUINO

CODIGO FUENTE SOFTWARE CONTROLADOR ARDUINO

#define FOSC 16000000 // Clock Speed


#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
#define POS_SALIDA2 3
#define POS_LED 2 //el led de testeo esta en el pin 2 del puerto
#define POS_SALIDA 1 //la salida esta en el pin 1 del puerto
#define POS_ENTRADA 0 //la entrada esta en el pin 0 del puerto
#define LED_ENCENDIDO (PORTB & (1<<POS_LED)
#define ACTIVAR_LED (PORTB |= (1<<POS_LED)) //Activa el led
#define DESACTIVAR_LED (PORTB &= ~(1<<POS_LED)) //Desactiva el led
#define SALIDA1 (PORTB & (1<<POS_SALIDA1))
#define SALIDA2 (PORTB & (1<<POS_SALIDA2))
#define ABRIR_PUERTA PORTB |= (1<<POS_SALIDA1)
#define PARAR_PUERTA (PORTB &= ~(1<<POS_SALIDA1) | ~(1<<POS_SALIDA2))
#define CERRAR_PUERTA PORTB |= (1<<POS_SALIDA2)
#define ENTRADA1 (PINB & (1<<POS_ENTRADA
#define TIEMPO_ENCENDIDO 80000 //tiempo led testeo esta encendido
#define TIEMPO_APAGADO 500000 //tiempo led testeo esta apagado

void LedTest(){
static unsigned long contador = TIEMPO_ENCENDIDO;
if(contador > 0)
{
contador --;
return;
}
else
{
if(LED_ENCENDIDO)
{
DESACTIVAR_LED;
contador = TIEMPO_APAGADO;
}
else
{
ACTIVAR_LED;
contador = TIEMPO_ENCENDIDO;
}
}
}

void USART_Init( unsigned int ubrr) //inicializa los registro puerto serie
{
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (0<<USBS0)|(3<<UCSZ00);
}
//----------------------------------------
unsigned char SERIAL_Recibir( void ) //recibe datos del puerto serie
{
if(UCSR0A & (1<<RXC0)) return UDR0;
}
//-------------------------------------------

void SERIAL_Enviar( unsigned char data )


{
if(UCSR0A & (1<<UDRE0)) UDR0 = data;
}

//---------------------------------------------
char SensorActivado(void)
{
static int contador_auxiliar = 50;
char actual, resultado;
char static anterior;
if(contador_auxiliar > 0){contador_auxiliar--; return 2;}
actual = ENTRADA1;
if (actual > anterior)
resultado = 1;
else
{
if ( actual < anterior) // si Portb pasa de prendido a apagado
resultado = 0;
else
resultado = 2;
}
anterior = actual; // ya que i ha tomado el ultimo valor de portb
contador_auxiliar = 50;
return(resultado);
}
//--------------------------------------------------------------
void pasolapuerta(void)
{
if(SensorActivado() == 1)
{
if(SALIDA1 || SALIDA2){
PARAR_PUERTA;
SERIAL_Enviar('1');
}
}

unsigned char letra;


//----------------------------------------------
void setup() {

DDRB = 0b00000110; //2y1 pin de salida


DDRB &= ~_BV(PINB0); // esta linea y la siguiente
PORTB |= _BV(PINB0);// para poner pin 0 como entrada PULL UP
USART_Init(MYUBRR);
}

void loop() {

LedTest();
pasolapuerta();
letra = SERIAL_Recibir();
if(letra == '1') ABRIR_PUERTA;
if(letra == '0') CERRAR_PUERTA;

}
CRONOGRAMA DEL PROYECTO

Fecha de Duración
Nombre de la tarea inicio Fecha final (dias)
Finalizar diseño menu de la pantalla principal 29/4/2017 30/4/2017 1
Diseñar pantalla tarea de control de acceso 29/4/2017 1/5/2017 2
Definir clases a utilizar en la tarea de control de acceso 2/5/2017 4/5/2017 2
Diseñar pantalla de login 5/5/2017 7/5/2017 2
Definir clases a utilizar en la tarea de login 8/5/2017 10/5/2017 2
Diseñar pantalla de alta de usuario 11/5/2017 13/5/2017 2
Definir clases a utilizar en la tarea de alta usuario 14/5/2017 16/5/2017 2
Diseñar pantalla de baja de usuario 17/5/2017 19/5/2017 2
Definir clases a utilizar en la tarea de baja usuario 20/5/2017 22/5/2017 2
Diseñar pantalla de modificacion usuario 23/5/2017 25/5/2017 2
Definir clases a utilizar en la tarea de modificar usuario 26/5/2017 28/5/2017 2
Definir componentes a utilizar protoboard arduino apertura puerta 29/5/2017 31/5/2017 2
Definir clases a utilizar para comunicación con arduino 1/6/2017 3/6/2017 2
Codificar menu de la pantalla principal 4/6/2017 6/6/2017 2
Codificar logica de la tarea de login 7/6/2017 10/6/2017 3
Codificar logica de la tarea control de acceso 11/6/2017 18/6/2017 7
Codificar logica de la tarea alta de usuario 19/6/2017 22/6/2017 3
Codificar logica de la tarea baja de usuario 23/6/2017 26/6/2017 3
Realizar la codificacion de la tarea modificar usuario 27/6/2017 30/6/2017 3
Codificar logica del programa de apertura de la puerta en el pic
3
arduino 1/7/2017 4/7/2017
Codificacion de la logica de comunicación entre el pic Arduino -
5/7/2017 8/7/2017 3
Sistema y viceversa
Agregar a la Base Datos tabla con perfiles de usuario y configuracion
4
de permisos de acceso 9/7/2017 13/7/2017
Realizar testing conexión a la base de datos desde el sistema 14/7/2017 17/7/2017 3
Realizar testing de la tarea de login con DB 18/7/2017 22/7/2017 4
Realizar testing de la tarea control de acceso 23/7/2017 27/7/2017 4
Realizar testing de la tarea de alta de usuario 28/7/2017 1/8/2017 4
Realizar testing de la tarea de baja de usuario 2/8/2017 6/8/2017 4
Realizar testing de la tarea de modificar usuario 7/8/2017 11/8/2017 4
Armar protoboard arduino de apertura puerta 12/8/2017 15/8/2017 3
Realizar testing programa arduino 16/8/2017 20/8/2017 4
Realizar testing comunicación con arduino 21/8/2017 25/8/2017 4

También podría gustarte