Created
December 5, 2020 19:31
-
-
Save esmarr58/1e9959bdc1cbd0a5e5848378106ff912 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Autor: Dr. Ruben Estrada Marmolejo | |
* hetpro-store.com/Tutoriales | |
* Version: 1 | |
* Fecha: 5 de Diciembre del 2020 | |
* Fecha actualizacion: 5 de Diciembre del 2020 | |
* Sensor: FPC1020A | |
* Tarjetas probadas: | |
* Arduino MEGA R3 - Puerto Serial 2 | |
Raspberry PI 3 - C++ | |
* | |
*/ | |
#define comandoInicio 0xF5 | |
#define comandoFin 0xF5 | |
#define exitoComando 0x00 | |
#define falloComando 0x03 | |
#define tiempoEsperaErrorComando 0x08 | |
uint8_t FPC1020A_GND = 15; | |
uint8_t FPC1020A_VCC = 18; | |
uint8_t BufferTransmision[9]; | |
uint8_t BufferRecepcion[9]; | |
uint8_t usuariosRegistrados = 0; | |
void enviarComando(uint16_t tiempoEspera){ | |
uint8_t verificadorDatos = 0; | |
uint8_t i = 0; | |
BufferTransmision[5] = 0; | |
Serial2.write(comandoInicio); | |
for (i = 1; i < 6; i++){ | |
Serial2.write(BufferTransmision[i]); | |
verificadorDatos ^= BufferTransmision[i]; | |
} | |
Serial2.write(verificadorDatos); //6 Check | |
Serial2.write(comandoFin); | |
while(tiempoEspera > 0){ | |
delay(1); | |
tiempoEspera--; | |
} | |
} | |
uint8_t esperarRespuesta(){ | |
uint8_t i = 0; | |
uint8_t verificadorDatos = 0; | |
uint8_t datoRecibido; | |
uint8_t cuantosDatosRecibi = 0; | |
for(i=0;i<8;i++){ | |
if(Serial2.available()){ | |
datoRecibido = Serial2.read(); | |
//Serial.print('-'); | |
//Serial.print(datoRecibido, HEX); | |
cuantosDatosRecibi++; | |
BufferRecepcion[i] = datoRecibido; | |
} | |
} | |
Serial.println(); | |
if(cuantosDatosRecibi != 8){ | |
return 5; | |
} | |
if(BufferRecepcion[0] != comandoInicio) return falloComando; | |
if(BufferRecepcion[7] != comandoFin) return falloComando; | |
if(BufferRecepcion[1] != (BufferTransmision[1])) return falloComando; | |
verificadorDatos = 0; | |
for(i = 1; i < 6; i++){ | |
verificadorDatos ^= BufferRecepcion[i]; | |
} | |
if(verificadorDatos != BufferRecepcion[6]){ | |
return falloComando; | |
} | |
return exitoComando; | |
} | |
uint16_t obtenerUsuariosRegistrados(void){ | |
uint8_t respuesta; | |
memset(BufferTransmision, NULL, sizeof(BufferTransmision)); | |
BufferTransmision[1] = 0x09; | |
BufferTransmision[2] = 0; | |
BufferTransmision[3] = 0; | |
BufferTransmision[4] = 0; | |
enviarComando(200); | |
respuesta = esperarRespuesta(); | |
if(respuesta == 0){ | |
usuariosRegistrados = BufferRecepcion[3]; | |
return usuariosRegistrados; | |
} | |
} | |
uint8_t agregarUsuario(uint8_t usuarioIDNumero, uint8_t usuarioPermiso){ | |
uint8_t respuesta = 100; | |
memset(BufferTransmision, NULL, sizeof(BufferTransmision)); | |
BufferTransmision[1] = 1; | |
BufferTransmision[2] = 0; | |
BufferTransmision[3] = usuarioIDNumero; | |
BufferTransmision[4] = usuarioPermiso; | |
enviarComando(3000); | |
respuesta = esperarRespuesta(); | |
if((respuesta == 0) && (BufferRecepcion[4] == 0 )){ | |
Serial.println('.'); | |
BufferTransmision[1] = 2; | |
enviarComando(3000); | |
respuesta = esperarRespuesta(); | |
if((respuesta == 0) && (BufferRecepcion[4] == 0 )){ | |
Serial.println('.'); | |
BufferTransmision[1] = 3; | |
enviarComando(3000); | |
respuesta = esperarRespuesta(); | |
if(respuesta == 0){ | |
Serial.println('.'); | |
return 0; | |
} | |
} | |
} | |
else{ | |
return 1; | |
} | |
} | |
uint8_t buscarHuella(void){ | |
uint8_t respuesta = 100; | |
memset(BufferTransmision, NULL, sizeof(BufferTransmision)); | |
BufferTransmision[1] = 0x0C; | |
BufferTransmision[2] = 0; | |
BufferTransmision[3] = 0; | |
BufferTransmision[4] = 0; | |
enviarComando(3000); | |
respuesta = esperarRespuesta(); | |
if(respuesta == 0){ | |
return BufferRecepcion[4]; | |
} | |
else{ | |
return respuesta; | |
} | |
} | |
uint8_t borrarTodosLosUsuarios(){ | |
uint8_t respuesta = 100; | |
memset(BufferTransmision, NULL, sizeof(BufferTransmision)); | |
BufferTransmision[1] = 0x05; | |
BufferTransmision[2] = 0; | |
BufferTransmision[3] = 0; | |
BufferTransmision[4] = 0; | |
enviarComando(200); | |
respuesta = esperarRespuesta(); | |
if(respuesta == 0){ | |
return 0; | |
} | |
else{ | |
return 1; | |
} | |
} | |
void mensajeComandos(){ | |
Serial.println(" "); | |
Serial.println(" "); | |
Serial.println("Ingrese alguno de los siguientes comandos con la opcion \"No line ending\": "); | |
Serial.println(" 1: Indica cuantas huellas tiene almacenadas el sensor"); | |
Serial.println(" 2: Guarda una huella, el proceso toma 9 segundos"); | |
Serial.println(" 3: Elimina a todos los usuarios"); | |
Serial.println(" 4: Compara la huella con las huellas guardadas"); | |
Serial.println(" "); | |
Serial.println(" "); | |
} | |
void setup() { | |
// put your setup code here, to run once: | |
Serial.begin(115200); | |
Serial2.begin(19200); | |
pinMode(FPC1020A_GND, OUTPUT); | |
pinMode(FPC1020A_VCC, OUTPUT); | |
digitalWrite(FPC1020A_GND, LOW); | |
digitalWrite(FPC1020A_VCC, HIGH); | |
mensajeComandos(); | |
} | |
void loop(){ | |
} | |
void serialEvent(){ | |
uint8_t datoRecibido = 0; | |
while(Serial.available() > 0){ | |
datoRecibido = Serial.read(); | |
if(datoRecibido == '1'){ | |
obtenerUsuariosRegistrados(); | |
Serial.print("Se encuentran: "); | |
Serial.print(usuariosRegistrados); | |
Serial.println(" usuarios registrados en el sensor"); | |
mensajeComandos(); | |
} | |
else if(datoRecibido == '2'){ | |
Serial.println('.'); | |
uint8_t usuarios = obtenerUsuariosRegistrados(); | |
//Agrega usuarios adicionales a los que ya hay | |
uint8_t respuesta = agregarUsuario(usuarios, 1); | |
if(respuesta == 0){ | |
Serial.print("El usuario: "); | |
Serial.print(usuarios); | |
Serial.println(" ,se agrego correctamente"); | |
Serial.print("Respuesta del comando: "); | |
Serial.println(BufferRecepcion[4]); | |
} | |
else{ | |
Serial.println("Error, intente de nuevo"); | |
} | |
mensajeComandos(); | |
} | |
else if(datoRecibido == '3'){ | |
uint8_t respuesta3 = borrarTodosLosUsuarios(); | |
Serial.println("Los usuarios han sido borrados"); | |
obtenerUsuariosRegistrados(); | |
Serial.print("Se encuentran: "); | |
Serial.print(usuariosRegistrados); | |
Serial.println(" usuarios registrados en el sensor"); | |
mensajeComandos(); | |
} | |
else if(datoRecibido == '4'){ | |
uint8_t respuesta2 = buscarHuella(); | |
if(BufferRecepcion[4] == 1){ | |
Serial.print("La huella corresponde a este usuario: "); | |
Serial.println(BufferRecepcion[3], DEC); | |
} | |
else if(BufferRecepcion[4] == 5){ | |
Serial.print("No se encontro la huella"); | |
} | |
else{ | |
Serial.println("Error de comunicacion"); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment