Acabo de realizar un proyecto en el que tengo unos 20 arduinos nano, cada uno de ellos con un RFID rc522, conectados mediante RS485 a una raspberry pi, la cual tiene una base de datos SQL.
Los arduinos leen el UID de la tarjeta, la mandan al la raspberry, que consulta si existe ese UID en la base de datos y luego mandan el OK o el KO al terminal de nuevo.
Cuando hay pocas personas pasando las tarjetas no hay problemas ya que desde que se pasa la tarjeta hasta que da el OK o KO pasan unos pocos milisegundos
Pero en las "horas punta" en las que muchísimas personas pasan sus tarjetas en cada arduino ese tiempo puede demorar casi 1 segundo, o incluso no obtener respuesta.
He comprobado que la velocidad de cada consulta es de milisegundos, y que la raspberry devuelve al serial el comando de Ok o KO al instante, así que ese no es el cuello de botella.
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 //Pin 9 para el reset del RC522
#define SS_PIN 10 //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); //Creamos el objeto para el RC522
const int mydireccion = 101;
const int EnTxPin = 2; // HIGH:TX y LOW:RX
const int Buzzer = 8;
const int LEDR = 5;
const int LEDG = 6;
const int LEDB = 7;
int TPING = 5000; //tiempo entre ping y ping
int TLED1 = 30; // tiempo que esta el LED Azul
int TLED2 = 500; // tiempo led verde
int TLED3 = 500; //Tiempo led rojo
int INICIO = 3000; //Tiempo led azul inicio
unsigned long tiempoAnterior = 0; //guarda tiempo de referencia para comparar
void setup() {
SPI.begin(); //Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos el MFRC522
Serial.begin(115200);
pinMode(Buzzer , OUTPUT);
pinMode(LEDR , OUTPUT);
pinMode(LEDG , OUTPUT);
pinMode(LEDB , OUTPUT);
pinMode(EnTxPin, OUTPUT);
digitalWrite(EnTxPin, LOW); //RS485 como receptor
digitalWrite(Buzzer , LOW);
digitalWrite(LEDR , HIGH);
digitalWrite(LEDG , HIGH);
digitalWrite(LEDB , LOW);
delay(1000);
digitalWrite(LEDB , HIGH);
digitalWrite(LEDG , LOW);
delay(1000);
digitalWrite(LEDG , HIGH);
digitalWrite(LEDR , LOW);
delay(1000);
digitalWrite(LEDR , HIGH);
}
void(* resetFunc) (void) = 0; //declare reset function @ address 0
void loop() {
// Revisamos si hay nuevas tarjetas presentes
if(millis()-tiempoAnterior>=TPING){
digitalWrite(EnTxPin, HIGH);
tiempoAnterior=millis();
Serial.print("I");
Serial.print(",");
Serial.print(mydireccion);
Serial.print(",");
Serial.print("P");
Serial.print(",");
Serial.print("F"); //fin de trama
Serial.println();
Serial.flush(); //Esperamos hasta que se envíen los datos
digitalWrite(EnTxPin, LOW); //RS485 como receptor
}
if ( mfrc522.PICC_IsNewCardPresent())
{
//Seleccionamos una tarjeta
if ( mfrc522.PICC_ReadCardSerial())
{
// Enviamos serialemente su UID
digitalWrite(EnTxPin, HIGH);
Serial.print("I");
Serial.print(",");
Serial.print(mydireccion);
Serial.print(",");
Serial.print("C");
Serial.print(",");
Serial.print(mfrc522.uid.uidByte[0], HEX);
Serial.print(mfrc522.uid.uidByte[1], HEX);
Serial.print(mfrc522.uid.uidByte[2], HEX);
Serial.print(mfrc522.uid.uidByte[3], HEX);
Serial.print(",");
Serial.print("F"); //fin de trama
Serial.println();
Serial.flush(); //Esperamos hasta que se envíen los datos
digitalWrite(EnTxPin, LOW); //RS485 como receptor
}
}
// Terminamos la lectura de la tarjeta actual
mfrc522.PICC_HaltA();
if(Serial.available()>0)
{
char valor = Serial.read();
switch (valor){
case 'R':
resetFunc();
break;
case 'I':
int direccion=Serial.parseInt(); //recibimos la direccion
if(direccion==mydireccion) //Si direccion es la nuestra
{
char comando=Serial.read();
switch (comando){
case 'P':
digitalWrite(LEDB , LOW);
delay(1);
digitalWrite(LEDB , HIGH);
break;
case 'V':
digitalWrite(LEDG , LOW);
digitalWrite(Buzzer , HIGH);
delay(100);
digitalWrite(LEDG , HIGH);
digitalWrite(Buzzer , LOW);
break;
case 'X':
digitalWrite(LEDR , LOW);
digitalWrite(Buzzer , HIGH);
delay(500);
digitalWrite(LEDR , HIGH);
digitalWrite(Buzzer , LOW);
break;
case 'R':
resetFunc();
break;
}
}
break;
}
}
}
Es como si los arduinos tardaran en asimilar las respuestas cuando hay muchos datos seguidos en la malla
¿Alguna ayuda?