Skip to content

Instantly share code, notes, and snippets.

@esmarr58
Created December 5, 2020 19:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save esmarr58/1e9959bdc1cbd0a5e5848378106ff912 to your computer and use it in GitHub Desktop.
Save esmarr58/1e9959bdc1cbd0a5e5848378106ff912 to your computer and use it in GitHub Desktop.
/*
* 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