Unir codigos para control de acceso

Hola tengo un proyecto de Arduino con control de acceso y la verdad no entiendo mucho códigos de Arduino. El proyecto consiste en tener 3 controles de acceso. Teclado matricial 4x4, Huella Dactilar ESP8266. Y necesitamos que estas 3 logren abrir un pestillo eléctrico, espero que por favor tengan la amabilidad de guiarme en esto ya que es nuevo para mi.
Adjunto los códigos por separado.

#include <Adafruit_Fingerprint.h>

#if (defined(AVR) || defined(ESP8266)) && !defined(AVR_ATmega2560)
// Para UNO y otros sin hardware serial, debemos usar software serial...
// pin #2 está ENTRADA del sensor (cable amarillo)
// pin #3 está FUERA de arduino (cable azul)
// Configure el puerto serie para usar softwareserial..
// Cable rojo (3.3V)
// Cable gris (GND)
SoftwareSerial mySerial(2, 3);

#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is Yellow wire, #1 is white
#define mySerial Serial1

#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()
{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(200);
Serial.println("\n\nAdafruit finger detect test");

// establecer la velocidad de datos para el puerto serie del sensor
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("¡Sensor de huellas dactilares encontrado!");
} else {
Serial.println("No encontré el sensor de huellas dactilares :(");
while (1) {
delay(1);
}
}

Serial.println(F("Lectura de parámetros del sensor"));
finger.getParameters();
Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
Serial.print(F("Security level: ")); Serial.println(finger.security_level);
Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);

finger.getTemplateCount();

if (finger.templateCount == 0) {
Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
}
else {
Serial.println("Esperando un dedo válido...");
Serial.print("El sensor contiene "); Serial.print(finger.templateCount); Serial.println(" templates");
}
}

void loop() // correr una y otra vez
{
getFingerprintID();
delay(500); // no necesito ejecutar esto a toda velocidad

}

uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Imagen tomada");
break;
case FINGERPRINT_NOFINGER:
Serial.println("Ningún dedo detectado");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Error de comunicación");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("error de imagen");
return p;
default:
Serial.println("Error desconocido");
return p;
}

// ¡Está bien, éxito!

p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Imagen convertida");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Imagen demasiado desordenada");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Error de comunicación");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("No se pudieron encontrar las características de la huella digital");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("No se pudieron encontrar las características de la huella digital");
return p;
default:
Serial.println("Error desconocido");
return p;
}

// ¡Bien convertido!
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.println("¡Encontré una coincidencia de impresión!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Error de comunicación");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("No encontré una coincidencia");
digitalWrite(10,HIGH);
return p;
} else {
Serial.println("Error desconocido");
return p;
}

// encontrado una coincidencia!
Serial.print("Identificación encontrada #"); Serial.print(finger.fingerID);
Serial.print(" con confianza de "); Serial.println(finger.confidence);
if (finger.fingerID == 1) {
digitalWrite(13, HIGH);
digitalWrite(10, LOW);
}else{
digitalWrite(13, LOW);
}

if (finger.fingerID == 2) {
digitalWrite(12, HIGH);
digitalWrite(10, LOW);
}else{
digitalWrite(12, LOW);
}
return finger.fingerID;
}

// devuelve -1 si falla, de lo contrario devuelve ID
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;

p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;

p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) return -1;

// encontrado una coincidencia!
Serial.print("Identificación encontrada #"); Serial.print(finger.fingerID);
Serial.print(" con confianza de "); Serial.println(finger.confidence);
return finger.fingerID;
}
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>


 /* Funcion de configuracion de pines del modulo LCD/I2C 
    (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)*/
 LiquidCrystal_I2C lcd(0x20, 16, 2);
const byte Filas = 4;  //Cuatro filas
const byte Cols = 4;   //Cuatro columnas
byte Pins_Filas[] = {13,12,11,10};//Pines Arduino a las filasbyte 
 byte Pins_Cols[] = {9,8,7,6}; // Pines Arduino a las columnas.
//no utilizar los pines 1 y 0 para no interferir en Rx y Tx
char Teclas [ Filas ][ Cols ] =
 {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
 };
  
char codigoSecreto[4] = {'2','2','5','5'}; // Aqui va el codigo secreto
// Para cambiar el tamaño de la clave, solo hay que cambiar el tamaño del array
int posicion=0;    // necesaria para la clave
int cursor=5;      // posición inicial de la clave en el LCD
int clave=0;       // para el LCD
int luz=0;         // para el LCD
int tiempo=0;      // para el LCD
int ledVerde=13;   // pin para el LED verde
int ledRojo=3;    // pin para el LED rojo
int buzzer=4;     // pin altavoz
Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);
void setup()
   {
   lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0); 
      Serial.begin(9600) ;
      lcd.begin(16,2);       // inicializamos el LCD.
      lcd.noBacklight();     // apagamos LCD
      pinMode (ledVerde,OUTPUT);
      pinMode (ledRojo, OUTPUT);
      pinMode (buzzer, OUTPUT);
      digitalWrite(ledRojo,LOW); // encendemos el LED rojo
      digitalWrite(ledVerde, LOW); // apagamos el verde
    delay (2);
   
  lcd.setCursor(0,0);     // situamos el cursor el la posición 2 de la linea 0.
      lcd.print("Introduzca clave"); // escribimos en LCD
      lcd.setCursor(cursor,1); // cursor en la posición de la variable, linea 1
    }

void loop()
   {char pulsacion = Teclado1.getKey() ; // leemos pulsacion
      if (pulsacion != 0) //Si el valor es 0 es que no se ha pulsado ninguna tecla
        { // descartamos almohadilla y asterisco
          if (pulsacion != '#' && pulsacion != '*' && clave==0)
           {    lcd.print("*"); // imprimimos pulsación
             cursor++;             // incrementamos el cursor
             tone(buzzer,350);     // tono de pulsación
             delay(200);
             noTone(buzzer);
      //--- Condicionales para comprobar la clave introducida -----------
      // comparamos entrada con cada uno de los dígitos, uno a uno
      if (pulsacion == codigoSecreto[posicion])
          posicion ++; // aumentamos posicion si es correcto el digito

      if (posicion == 4)
       { // comprobamos que se han introducido los 4 correctamente
         digitalWrite (3,LOW);  // encendemos LED
         lcd.setCursor(0,0);      // situamos el cursor el la pos 0 de la línea 0.
         lcd.print(" Clave correcta ");         // escribimos en LCD
         delay(200);                           // tono de clave correcta
         tone(buzzer,500);
         delay(100);
         noTone(buzzer);
         tone(buzzer,600);
         delay(100);
         noTone(buzzer);
         tone(buzzer,800);
         delay(100);
         noTone(buzzer);
              lcd.clear () ;
         lcd.setCursor(5,1); // cursor en la posición 5, línea 1
         clave=1; // indicamos que se ha introducido la clave
         digitalWrite(ledRojo,LOW); // apagamos el LED rojo
         digitalWrite(ledVerde, HIGH); // encendemos el verde
    delay (2000);
               digitalWrite(ledVerde, LOW); // encendemos el verde
    delay (2000);
      }
     //--- En el caso de que esté incompleta o no hayamos acertado ----------
     if(cursor>8)        // comprobamos que no pase de la cuarta posicion
       {   cursor=5;     // lo volvemos a colocar al inicio
           posicion=0;           // borramos clave introducida
           lcd.setCursor(5,1);
           lcd.print(" ");       // borramos la clave de la pantalla
           lcd.setCursor(5,1);
           if(clave==0)         // comprobamos que no hemos acertado
              { tone(buzzer,70,500); // para generar
                delay(250); // tono de error
                noTone(buzzer);   
                 digitalWrite(ledRojo,HIGH);
               delay (2000);
               digitalWrite(ledRojo, LOW);
                lcd.clear () ;
              
              }
        }
     }
   } 

 //--- Condicionales para encender o apagar el LCD --------------
 if (pulsacion == '#' && luz==0)
     { // comprobamos tecla y encendemos si está apagado
       lcd.backlight(); // encendemos
       luz=1; // indicamos que está encendida
       pulsacion =0; // borramos el valor para poder leer el siguiente condicional
     }

 if (pulsacion == '#' && luz==1)
     { // comprobamos tecla y estado
       lcd.noBacklight(); // apagamos
       luz=0; // indicamos que está apagada
     }

 //--- Condicionales para resetear clave introducida -------------
 if (pulsacion == '*')
     { // asterisco para resetear el contador
       posicion = 0;
       cursor = 5;
       clave=0;
       posicion=0;
       lcd.setCursor(0,0); // situamos el cursor el la posición 2 de la linea 0.
       lcd.print("Introduzca clave"); // escribimos en LCD
       lcd.setCursor(5,1);
       lcd.print(" "); // borramos de la pantalla los números
       lcd.setCursor(5,1);
       digitalWrite(ledRojo,LOW); // encendemos el LED rojo
       digitalWrite(ledVerde, LOW); // apagamos el verde
     
    }
 }

y el código de el RFID todavía esta en proceso por que notamos falencias así que estamos tratando de tener uno correcto.

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español .

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en (<CODE/>)




Este mensaje lo envío porque tu hilo fue movido del foro en inglés y por eso tenemos una respuesta anterior en ese idioma.

Hola, Disculpa es mi primera vez en este foro y desconocía de como publicar correctamente, quería saber si es posible ver la respuesta que comentas aun que este en el otro idioma.

Hola, si esta es la primera vez que te pones con Arduino yo diria que es una tarea un poco elevada. De todos modos con ánimo de ayudar sería bueno establecer donde estas parado.
Lo primero es conseguir dos códigos funcionales al 100% nada de 70 o 80%. Debe funcionar y me refiero al RFID.
Debes poder reaccionar a los ID que corresponden, tenes la formad e cargar nuevos IDs o eliminarlos, etc.

Cuando tengas ambos codigos unirlos es relativamente fácil.
Compartes librerias, constantes y variables globales primero.
Luego setup y loop sin repetir y sin delays() especialmente en el loop o nada funcionará como lo hace individualmente.
Un apartado especial es la acción sobre el elemento a abrir (puerta) veo que en tu código del teclado será un led verde y en el fingerprint no esta aun determinado pero se realiza cuando tengas coincidencia.
Te aconsejo que actuas sobre una variable del tipo booleana algo que esta en HIGH o LOW (1 o 0) y luego de un tiempo lo vuelves a poner a 0.
Entonces usas teclado matriciail, pones la clave, coincide y habilitas la puerta via su cerradura pero a los 20 segundos la vuelves a cerrar.
Lo mismo con el RFID, hay coincidencia suena un buzzer, parpadea un led, lo que quieras pero a los 20 segundos se cierra. no es para dejarla abierta, si quieres mas segundos lo decides tu.

No entendí, pero ahora tenemos todos los códigos funcionando por separado, osea cada uno cumple la función.

Vaya, como que no entendiste?
Tienes dos códigos, o sea dos de todo. Dos definiciones de librerías, de constantes, de variables globales.
Luego tienes 2 setups y dos loops
Todo tiene que entrar en 1 solo, uno de todo.
Entonces sigue los pasos que ya te indiqué.
Todo sin repetir y todo sin delay o no funcionará.
Como reemplazas delay() pues haciendo nuevos códigos que no los usen, usa millis().
Como se usa Millis()? Pues ve a Documentación y lee los tutoriales.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.