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.