Buenas tardes, es mi primera duda que planteo en el foro, agradecería una pista para poder solucionar la duda que tengo.
Tengo un proyecto entre manos, el cual no consigo que realice todo lo que quiero.
Se trata de un sistema que cuenta con un lector RFDI RC522 que al leer la tarjeta autorizada me activa un solenoide, con la acción (delay) puedo programar que el solenoide se mantenga abierto durante el periodo deseado.
Mi consulta es que no consigo que el solenoide se mantenga abierto mientra me esta leyendo la tarjeta y se cierre en el momento que deje de leerla.
Os agradezco por anticipado la ayuda.
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN); // Crea instancias MFRC522.
String read_rfid;
String ok_rfid_1="bc2fe22b"; //Usuario autorizado
int lock=7; //Pin activado para activar el solenoide
void setup() {
Serial.begin(9600); // Inicializa comunicaciones con PC
while (!Serial); // No hacer nada si no se abre ningún puerto serie
SPI.begin(); // Inicializa biblioteca SPI
mfrc522.PCD_Init(); // Inicializa MFRC522 Tarjeta
pinMode(lock, OUTPUT); // Define pin 7 como salida
}
void dump_byte_array(byte *buffer, byte bufferSize) {
read_rfid="";
for (byte i = 0; i < bufferSize; i++) {
read_rfid=read_rfid + String(buffer[i], HEX);
}
}
void open_lock() {
digitalWrite(lock, HIGH);
// delay(2000);
digitalWrite(lock,LOW);
}
void loop() {
// Busca nuevas tarjetas
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// Seleccione una de las tarjetas
if ( ! mfrc522.PICC_ReadCardSerial())
return;
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println(read_rfid);
if (read_rfid==ok_rfid_1) {
//ok, abre la puerta.
open_lock();
}
}
Por que esto explica porque no puedes mantener el solenoide activo.
Ahi dice, poner activo e inmediatamente desactivar el solenoide.
Si digitalWrite(lock, HIGH); activa el solenoide y digitalWrite(lock, LOW); lo desactiva.
Dime que crees que debes hacer?
Pues antes de leer tu tarjeta RFID lo activas y luego de leerla lo desactivas.
Ahora si no alcanza a respetar los 2000 mseg entonces usa millis() y comprueba al final si se han cumplido y en caso de no cumplir, pues esperas lo que falte y luego apagas el solenoide.
Gracias Surbyte, por responder
Disculpa si no supe explicarme correctamente.
Lo que deseo hacer es lo siguiente, que el solenoide permanezca inactivo hasta que se lea la tarjeta RFDI y en el caso de ser la tarjeta correcta esta active el solenoide y el mismo solenoide cambie a inactivo al deja de leer la tarjeta.
Con este código consigo que el solenoide se active cuando me lee la tarjeta pero espera 2 segundos y pasa a inactivo.
Lo que deseo hacer es que el solenoide este activo mientras permanezca leyendo la tarjeta.
Espero haberme expresado correctamente, recibe un cordial saludo.
Si quieres que este activo o inactivo según cierta secuencia lo mejor es usar un flag.
Que es un flag, una variable que solo puede valer 0 o 1, false o true, NO o Si.
la defines asi
bool estadoLock;
al final del loop pones lo que controla el solenoide que será simplemente esto
if (estadoLock)
digitalWrite(lock, HIGH);
else
digitalWrite(lock, LOW);
entonces solo esto controla que hace el solenoide y mientras debes ser muy cuidadoso en que ciertas partes de tu código cambien el valor de flag.
Entonces.. al iniciar setup en la última línea pones,
estadoLock = false;
esto hace que el solenoide arranque inactivo
Luego cuando alguien coloca una tarjeta y es correcta, pones
estadoLock = true;
y cuando detectes que la retiró de nuevo lo pasas a false.
Espero puedas lograrlo.
Si te equivocas y pones un cambio en una parte de código que se ejecuta varias veces, eso FORZARA a que el solenoide parmanezca solo en un estado.
Asi que no seas apurado y ve haciendolo paso a paso.
Arrancas con solenoide inactivo y luego intenta que responda a una RFID aceptada y finalmente restaura la situación al quitar la RFID.