RFID-RC522 y Servomotor

Hola amigos, espero estén bien, a ver si alguien pudiese ayudarme. Soy nuevo programando arduino, ya me he leído libros y he visto tutoriales de programación por el foro en documentación, pero hay cosas que aun no comprendo bien. Actualmente tengo un Sketch en el cual al acercar al lector la tarjeta definida este activa el giro del servomotor en 180 grados, junto con la iluminación de un Led y un sonoro en un buzzer, y si este es incorrecto enciende un led una señal sonoro junto con un acceso denegado. Hasta aquí todo perfecto, el tema es que necesito que el servo vuelva a 0 grados pero solo cuando vuelvo a acercar la misma tarjeta definida nuevamente. probé poniendo un nuevo if con el giro en 0 grados del servo, pero al leer la tarjeta este va a 180 y luego vuelve de manera inmediata a 0 por lo que no me sirvió y lo que yo necesito es que solo al acercar la tarjeta nuevamente este vuelva a 0 si no que se quede en 180. Si algún entendido de aquí podría ayudarme o guiarme en lo que tengo que agregar se lo agradecería mucho. Comparto el Sketch que tengo actualmente

//Proyecto Servo con RFID FCA

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
 
#define SS_PIN 10
#define RST_PIN 9
#define LED_G 5 //define pin LED Verde
#define LED_R 4 //define pin LED Rojo
#define BUZZER 2 //buzzer pin
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Crear MFRC522 instancia.
Servo myServo; //define Nombre para el Servo
 
void setup() 
{
  Serial.begin(9600);   // Iniciar la serial communication
  SPI.begin();      // Iniciar  SPI bus
  mfrc522.PCD_Init();   // Iniciar MFRC522
  myServo.attach(3); //servo pin
  myServo.write(0); //servo start position
  pinMode(LED_G, OUTPUT);
  pinMode(LED_R, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  noTone(BUZZER);
  Serial.println("Acerca tu tarjeta al lector...");
  Serial.println();

}
void loop() 
{
  // Buscar nuevas tarjetas
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Seleccionar una de las tarjetas
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  //Mostrar UID en Monitor Serie
  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) == "83 AA 7B 20") //ID Tarjeta
  {
    Serial.println("Acceso Autorizado");
    Serial.println();
    delay(500);
    digitalWrite(LED_G, HIGH);
    tone(BUZZER, 500);
    delay(300);
    noTone(BUZZER);
    myServo.write(180);

  }
 

 else   {
    Serial.println(" Acceso Denegado");
    digitalWrite(LED_R, HIGH);
    tone(BUZZER, 300);
    delay(1000);
    digitalWrite(LED_R, LOW);
    noTone(BUZZER);
  }
}

Mo he probado lo que te voy a dejar pero creo que funciona. El truco es crear una variable que te indique si está abierto o cerrado y comprobarla.
una posible forma podría ser así:
Solo toco el if final

bool estado; // declarar antes de setup. 0= cerrado; 1 = abierto. con esta definicon esta 0.

if (content.substring(1) == "83 AA 7B 20") { //ID Tarjeta
  switch (estado) {
    case 0:
      Serial.println("Acceso Autorizado");
      Serial.println();
      delay(500);
      digitalWrite(LED_G, HIGH);
      tone(BUZZER, 500);
      delay(300);
      noTone(BUZZER);
      myServo.write(180);
      Serial.println("Puerta abierta");
      estado = 1;
      // aqui un posible delay para esperar a retirar la tarjeta.
      break;
    case 1:
      Serial.println("Acceso Autorizado");
      Serial.println();
      delay(500);
      tone(BUZZER, 500);
      delay(300);
      noTone(BUZZER);
      digitalWrite(LED_G, LOW);
      myServo.write(0);
      Serial.println("Puerta cerrada");
      estado = 0;
      // aqui un posible delay para esperar a retirar la tarjeta.
      break;
  }
}
else   {
  Serial.println(" Acceso Denegado");
  digitalWrite(LED_R, HIGH);
  tone(BUZZER, 300);
  delay(1000);
  digitalWrite(LED_R, LOW);
  noTone(BUZZER);
}

Mira el led verde y el buzzer que no los he tenido en cuenta.

1 Like

Lo he probado y funciona de maravilla, comprendo que faltaba crear una variable, era justo lo que necesitaba, eres un crack. Muchísimas Gracias!

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