deixar rele acionado por rfid

boa tarde pessoal,

ja vi algumas dicas que o leitor rfid aciona por segundos e depois desarma o rele sozinho.
ja vi tambem que por um botão ele acionao rele, e quando aperta o botão ele aciona novamente.
minha duvida era se teria como acionar o rele pelo rfid e so desarmar ele com o rfid ler o cartão novamente.

alguém sabe dizer se esse código faz o que to querendo?

Mostra o que tens actualmente e talvez alguém te ajude.

então, eu tenho uma mistura de dois códigos um o rele inverte o estado dele pra acionado ou desligado por meio de um botão, (https://pastebin.com/raw/tR3x8L69) já o outro ativa pelo rfid mais ai só fica um tempo e depois desliga sozinho (https://pastebin.com/raw/8Vnrz7MS).
sou novo em arduino e esses códigos não são meus.

bubulindo:
Mostra o que tens actualmente e talvez alguém te ajude.

obrigado por se interessar em ajudar.

No ultimo código, tens isto:

  if (conteudo.substring(1) == "F3 DE 90 55") //UID 1 - Cartao
  {
    Serial.println("Ola eduardo!");
    Serial.println();
    digitalWrite(2, HIGH); // ativa rele, abre a trava solenoide
    delay(3000);           // espera 3 segundos
    digitalWrite(2, LOW);  // desativa rele, fecha a trava solenoide
  }

Ele liga um pino e passado 3 segundos, desliga.

Eu proporia fazer algo assim:

//cria a variável na linha em baixo fora da função loop.
unsigned char estadoRele = LOW; 

  if (conteudo.substring(1) == "F3 DE 90 55") //UID 1 - Cartao
  {
    Serial.println("Ola eduardo!");
    Serial.println();
    if (estadoRele == LOW) estadoRele = HIGH; 
    else estadoRele = LOW; 
    digitalWrite(2, estadoRele); // ativa rele, abre a trava solenoide
    
  }

bubulindo:
No ultimo código, tens isto:

  if (conteudo.substring(1) == "F3 DE 90 55") //UID 1 - Cartao

{
    Serial.println("Ola eduardo!");
    Serial.println();
    digitalWrite(2, HIGH); // ativa rele, abre a trava solenoide
    delay(3000);          // espera 3 segundos
    digitalWrite(2, LOW);  // desativa rele, fecha a trava solenoide
  }



Ele liga um pino e passado 3 segundos, desliga. 

Eu proporia fazer algo assim: 



//cria a variável na linha em baixo fora da função loop.
unsigned char estadoRele = LOW;

if (conteudo.substring(1) == "F3 DE 90 55") //UID 1 - Cartao
  {
    Serial.println("Ola eduardo!");
    Serial.println();
    if (estadoRele == LOW) estadoRele = HIGH;
    else estadoRele = LOW;
    digitalWrite(2, estadoRele); // ativa rele, abre a trava solenoide
   
  }

então ele agora vai inverter o estado do rele com o acionamento por rfid?

se for isso solucionou meu problema, vou montar agora a parte de eletrônica e testar.

amigo o código ate deu certo, quando ligo a placa e encosto o cartão o rele abre, mais quando encosto o cartão novamente ele não fecha, eu errei alguma coisa na montagem de eletrônica?

Poderá haver algo mais na programação... eu nunca usei esse sensor, logo não sei se ele retornará mais dados do cartão que confundem o código.

Só por curiosidade, coloca aqui o código que tens agora.

Colocaste isto:

//cria a variável na linha em baixo fora da função loop.
unsigned char estadoRele = LOW;

Fora das funções todas??

todo o código que tenho agora é esse.

//Programa: Sistema de trava eletrica com RFID
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

void setup()
{
Serial.begin(9600); // Inicia a serial
SPI.begin(); // Inicia SPI bus
mfrc522.PCD_Init(); // Inicia MFRC522
Serial.println("Aproxime o seu cartao do leitor...");
Serial.println();
pinMode(2, OUTPUT);
}

void loop()
{
// Procura por cartao RFID
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Seleciona o cartao RFID
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Mostra UID na serial
Serial.print("UID da tag :");
String conteudo= "";
byte letra;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte < 0x10 ? " 0" : " ");
_ Serial.print(mfrc522.uid.uidByte*, HEX);_
_ conteudo.concat(String(mfrc522.uid.uidByte < 0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522.uid.uidByte, HEX));
}
Serial.println();
Serial.print("Mensagem : ");
conteudo.toUpperCase();*_

* //cria a variável na linha em baixo fora da função loop.*
unsigned char estadoRele = LOW;
* if (conteudo.substring(1) == "F3 DE 90 55") //UID 1 - Cartao*
* {*
* Serial.println("Ola eduardo!");*
* Serial.println();*
* if (estadoRele == LOW) estadoRele = HIGH;*
* else estadoRele = LOW;*
* digitalWrite(2, estadoRele); // ativa rele, abre a trava solenoide*

* }*
}

Por acaso leste esta frase que eu escrevi??

//cria a variável na linha em baixo fora da função loop.

Não parece porque colocaste a linha em questão no mesmo sítio onde a tinha deixado.

Faz o que disse, ou seja, apaga essa linha daí e coloca-a FORA de qualquer função e a lógica vai funcionar.

vou tentar acertar, como já disse sou novo em arduino e não conheço de programação, mesmo assim agradeço seu interesse em ajudar.

Experimenta e vê se fnuciona.

Basicamente queres apagar a linha onde está agora e colocá-la aqui.

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
unsigned char estadoRele = LOW;

amigo deu certo sim, agora ele muda muito rápido a leitura. o ideal seria ele ler e somente depois se um segundo ler outra vez o cartão.

mesmo assim fico muito feliz por sua ajuda, muito obrigado.

poderia colocar o cod intero pra ver, no meu da erro!