/***
Descripción del problema
Se tiene una garita la cual cuenta con dos accesos, un para el lado de los vecinos y el otra lado de las visitas.
1. Ingreso de Vecinos:
Este proceso es de forma automatica, con el acceso por medio de una tarjeta, debe de levantar la talanquera al
validar el acceso. Y mostrar un mensaje en pantalla de acceso permitido.
Si por alguna razón se deniega el acceso, se debe de indicar en pantalla que el acceso no se permitio.
2. Ingreso de Visitas:
El proceso de ingreso de visitas es de forma manual, es decir se tiene que presionar un boton, para poder levantar
la talanquera, al realizarse este proceso se debe de mostrar un mensaje en pantalla de acceso permitido.
Talanquera:
Para este proyecto como no vamos a utilizar un sensor para poder determinar que el vehiculo ya paso, se va a dar
un tiempo definido por el estudiante. Despues del cual la talanquera debe de bajar.
Se va a utilizar un led RGB, si la talanquera esta abajo tiene color rojo, si va subiendo o bajando debe de estar color
anaranjado y si esta arriba debe de estar de color verde. Para indicar al piloto del vehiculo una referencia visual de
que esta realizando la talanquera.
Elementos
• protoboard.
• resistencias.
• servo Motor.
• Led RGB.
• Pantalla LCD.
• Modulo RFID RC522.
• Arduino ONE.
• Cualquier otro equipo que crea conveniente.
*/
#include <Servo.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <MFRC522.h>
#define TALANQUERA_VECINO 5
#define TALANQUERA_VISITA 6
#define TALANQUERA_CERRADO 180
#define TALANQUERA_ABIERTO 90
#define TALANQUERA_ABIERTO_TIEMPO 2000 //ms
#define VECINO_INPUT 3
#define VISITA_INPUT 4
// RFID https://wokwi.com/projects/389180983211282433
#define SS_PIN 10
#define RST_PIN 9
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
Servo talanqueraVecino;
Servo talanqueraVisita;
// RFID
MFRC522 mfrc522(SS_PIN, RST_PIN);
const int listaLedVisita[3] = {A0, A1, A2}; // R G B
const int listaLedVecino[3] = {A3, A4, A5}; // R G B
const int listaRojo[3] = {255, 0, 0};
const int listaVerde[3] = {0, 255, 0};
const int listaNaranja[3] = {255, 165, 0};
// Variables para estados
int talanqueraVecinoEstado = TALANQUERA_CERRADO;
int talanqueraVisitaEstado = TALANQUERA_CERRADO;
int estadoBoton = LOW;
int manejarTalanquera(Servo servo, int listaLed[], int estadoInicial, boolean abrir) {
int estado = 0;
ingresarColor(listaLed, listaNaranja);
if (abrir) {
for (estado = estadoInicial; estado >= TALANQUERA_ABIERTO; estado--) {
servo.write(estado);
delay(15);
}
ingresarColor(listaLed, listaVerde);
} else {
for (estado = estadoInicial; estado <= TALANQUERA_CERRADO; estado++) {
servo.write(estado);
delay(15);
}
ingresarColor(listaLed, listaRojo);
}
return estado;
}
void manejarProcesoTalanqueraVecino() {
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "BD 31 15 2B") // RFID CODE
{
Serial.println("Acceso permitido");
Serial.println();
lcd.begin(16, 2);
lcd.print("Vecino:");
lcd.setCursor(0, 1);
lcd.print("Acceso permitido");
talanqueraVecinoEstado = manejarTalanquera(talanqueraVecino, listaLedVecino, talanqueraVecinoEstado, true);
delay(TALANQUERA_ABIERTO_TIEMPO);
lcd.begin(16, 2);
talanqueraVecinoEstado = manejarTalanquera(talanqueraVecino, listaLedVecino, talanqueraVecinoEstado, false);
}
else {
Serial.println("Acceso no permitido");
lcd.begin(16, 2);
lcd.print("Acceso no permitido");
talanqueraVecinoEstado = manejarTalanquera(talanqueraVecino, listaLedVecino, talanqueraVecinoEstado, false);
lcd.begin(16, 2);
}
}
void manejarProcesoTalanqueraVisita() {
int estadoBotonActual = digitalRead(VISITA_INPUT);
if(estadoBotonActual != estadoBoton) {
if(estadoBotonActual == HIGH) {
// Validar botón
lcd.begin(16, 2);
lcd.print("Visita:");
lcd.setCursor(0, 1);
lcd.print("Acceso permitido");
talanqueraVisitaEstado = manejarTalanquera(talanqueraVisita, listaLedVisita, talanqueraVisitaEstado, true);
delay(TALANQUERA_ABIERTO_TIEMPO);
lcd.begin(16, 2);
talanqueraVisitaEstado = manejarTalanquera(talanqueraVisita, listaLedVisita, talanqueraVisitaEstado, false);
lcd.begin(16, 2);
}
estadoBoton = estadoBotonActual;
}
}
void ingresarColor(int listaLed[], int listaColor[]) {
for (int i = 0; i < 3; i++) {
analogWrite(listaLed[i], listaColor[i]);
}
}
void setup() {
Serial.begin(9600);
// Inicializar talanqueras (servos)
talanqueraVecino.attach(TALANQUERA_VECINO);
talanqueraVisita.attach(TALANQUERA_VISITA);
// Inicializar LEDS
for (int i = 0; i < sizeof(listaLedVecino); i++) {
pinMode(listaLedVecino[i], OUTPUT);
}
for (int i = 0; i < sizeof(listaLedVisita); i++) {
pinMode(listaLedVisita[i], OUTPUT);
}
// Inicializar estados
talanqueraVecinoEstado = manejarTalanquera(talanqueraVecino, listaLedVecino, talanqueraVecinoEstado, false);
ingresarColor(listaLedVecino, listaRojo);
talanqueraVisitaEstado = manejarTalanquera(talanqueraVisita, listaLedVecino, talanqueraVisitaEstado, false);
ingresarColor(listaLedVisita, listaRojo);
// Botón Visita
pinMode(VISITA_INPUT, INPUT);
// RFID
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
Serial.println("Aproxima la tarjeta sobre la lectora...");
Serial.println();
}
void loop() {
manejarProcesoTalanqueraVecino();
delay(10);
manejarProcesoTalanqueraVisita();
}