ARDUINO+Bluetooh+rfid per apriporta

buongiorno a tutti,
per motivi di lavoro avevo dovuto abbandonare il mi progetto di APRIPORTA con il bluetooth del cellulare e in alternativa carta/bottone RFID!
ho fatto il programma ma per mia ignoranza mi sono reso conto che il sistema funziona solo con uno dei 2 metodi... o il bluetooth o RFID .. uno esclude l'altro...
prima di entrare nello specifico volevo soltanto chiedere se è possibile usare nello stesso programma il bluetooth + rfid e se si come devo procedere ???
grazie mille

massibal

Certo che è possibile. Se non funzionano è sicuramente un problema di come hai scritto lo sketch, per cui pubblicalo e vediamo.

ok
eccolo… però non vorrei che i puristi si scandalizzassero!!

#include <SPI.h>
#include <SoftwareSerial.h>

SoftwareSerial portOne(10, 11);
SoftwareSerial portTwo(8, 9);
//int rxPin = 4;
//int txPin = 5;

//SoftwareSerial RFID (2, 3); // RX and TX
//SoftwareSerial bluetooth(4,5);

int rele = 7;
byte val = 0;

String IdTest ;
String IDOK [2] = {"xxxxxxxxxxx", "xxxxxxxxxx"};

char data [14];

String message;
long lastTagReading = 0;

void setup ()
{
  Serial.begin(9600);
  portOne.begin(9600);
  portTwo.begin(9600);
  //bluetooth.begin(9600);
  //RFID.begin (9600);
  SPI.begin();
  pinMode (rele, OUTPUT);
  digitalWrite (rele , LOW);
  Serial.println("Ingresso ");
  Serial.println("RFID registrati n --> " + String(sizeof(IDOK) / sizeof(String)));
  Serial.println("In attesa di lettura scheda/bluetooth");
}
void loop ()
{
  portOne.listen();
  Serial.println("BLUETOOTH CANTINA");
  while (portOne.available()) {
    message += char(portOne.read());
  }
  if (!portOne.available())
  { if (message != "") //if data is available
    {
      if (message == "1") {
        digitalWrite(rele, LOW);
        Serial.println("Accesso Bluetooth attivato");
        delay(20);
        Serial.println("rele ON"); //show the data
        delay(20);
        message = ""; //clear the data
      }
      if (message == "0") {
        digitalWrite(rele, HIGH);
        Serial.println("rele OFF"); //show the data
        delay(20);
        message = ""; //clear the data

      }
      if (message == "3") {
        digitalWrite(rele, LOW);
        Serial.println("Relè ON");
        delay(1000);
        digitalWrite(rele, HIGH);
        Serial.println("Relè OFF");
        delay(20);
        message = ""; //cear the data
      }
      portTwo.listen();
      delay(200);
      String IdTest = "";
      if (portTwo.available () > 0)
      {
        for (int u = 0; u < 14; u ++)

        {

          data [u] = portTwo.read ();
          //Serial.println(u);

        }
        for (int i = 1; i < 11; i ++)
        {
          char d = data [i];
          IdTest += d;
          Serial.println(IdTest);
        }
        if (((lastTagReading + 5000) < millis()))
        {
          lastTagReading = millis();
          Serial.print("RFID tag rivelato --> ");
          Serial.println(IdTest);
          Serial.println("");

          if (control() == 1)
          {
            opendoor();
          }
          else Chiudi();
        }
      }
    }
  }
}

int control()
{
  int i;

  for (i = 0; i < sizeof(IDOK); ++i) {
    if (IDOK [i] = IdTest )
    {
      return 1;
    }
  }
  return 0;
}


void opendoor ()
{
  digitalWrite (rele, HIGH);
  tone (8, 1700, 300);
  delay (300);
  tone (8, 1900, 400);
  Serial.println("Rele ON");
  delay (1000);
  digitalWrite (rele, LOW);
  Serial.println("Rele OFF");
}

void Chiudi()
{
  tone(8, 1200, 150);
  delay(300);
  tone(8, 1200, 150);
  delay(300);
  tone(8, 1200, 150);
}

Se portOne è il BT e portTwo l'RFID, dando una rapida occhiata al codice mi sembra che il check sull'RFID lo fai dopo aver ricevuto dati dal BT 8ossia dentro l'unica if esterna del loop), quindi non funziona "con il bluetooth del cellulare e in alternativa carta/bottone RFID". Se non mandi niente via BT, non legge la RFID.
Almeno così mi sembra...

ciao,
collegando l'hardware in realtà non funzionano ne bluetooth ne rfid.. anzi il BT ha dei seri problemi perchè lampeggia poi non si connette con il cellulare e poi si spegne!! ;(

qualche utile modifica da consigliarmi ??
grazie

massibal

Vista così allora pare più un problema di alimentazione.
Come sono connesse le varie board e con quale/i alimentazione/i?

no secondo me non è un problema di alimentazione , ma di programmazione… ieri ho ricontrollato
passo per passo ma mi sa che c’è qualcosa di sbagliato perchè ogni ciclo mi accende il relè come se avessi eccitato i RFID !!!;(

help help help

graz<ie

 (i = 0; i < sizeof(IDOK); ++i) {
    if (IDOK [i] = IdTest )

Qua intanto ci vuole un ==.

Aggiornamento...ho provato la parte relativa al BT e funziona ..ho teststo anche la parte dell RFID..e funziona...adesso mi serve solo che qualcuno mi aiuti a mettere insieme le due parti....grazie
Notte
Massibal

qualcuno sa dirmi come si utilizza la Softwareserial con 2 port? portOne e portTwo ???

grazie mille

massibal :o

massibal:
qualcuno sa dirmi come si utilizza la Softwareserial con 2 port? portOne e portTwo ????

Credo tu possa iniziare leggendo QUI ma scusa, il tuo codice è molto simile a quello mostrato come esempio in quella pagina (comresi i nomi esatti delle variabili), non hai usato quello?

Comunque leggi anche quello che dicono in QUESTO thread...

Oppure usa un MEGA :wink: che ha più seriali hardware

ciao si la base è quella... il fatto è che non funziona... non capisco se la funzione LISTEN deve essere chiusa per poter fare iniziare la seconda... così come è non funziona..

non posso usare il mega perchè devo fare una scatoletta piccolissima da mettere dentro uno scasso della porta!!

però mi hai dato un'idea... provo il programma con il MEGA .. così sono sicuro che non ci siano problemi altrove..

grazie

massibal

buongiorno,
ho ricontrollato tutto e sembra tutto ok …sia la parte RFID che la parte BT
qualcuno mi può spiegare come si usano le 2 porte con la software serial!!!

grazie mille
massibal

allego

#include <SPI.h>
#include <SoftwareSerial.h>

SoftwareSerial portBT(2, 3);
SoftwareSerial portRF(4, 5);

int rele = 6;
byte val = 0;

String IdTest ;
String IDOK [2] = {"XXXXXXXXXX", "XXXXXXXXXX"};

char data [14];

String message;
long lastTagReading = 0;

void setup ()
{
  Serial.begin(9600);
  portBT.begin(9600);
  portRF.begin(9600);
  SPI.begin();
  pinMode (rele, OUTPUT);
  digitalWrite (rele , LOW);
  Serial.println("Ingresso CANTINA");
  Serial.println("RFID registrati n --> " + String(sizeof(IDOK) / sizeof(String)));
  Serial.println("In attesa di lettura scheda RFID/bluetooth.......");
}

void loop ()
{
  portBT.listen();
  while (portBT.available()) {
    message += char(portBT.read());
  }
  if (!portBT.available())
  { if (message != "") //if data is available
    {
      if (message == "1") {
        digitalWrite(rele, LOW);
        Serial.println("Accesso Bluetooth attivato");
        delay(20);
        Serial.println("rele ON"); //show the data
        delay(20);
        message = ""; //clear the data
      }
      if (message == "0") {
        digitalWrite(rele, HIGH);
        Serial.println("rele OFF"); //show the data
        delay(20);
        message = ""; //clear the data
      }
      if (message == "3") {
        digitalWrite(rele, LOW);
        Serial.println("Relè ON");
        delay(500);
        digitalWrite(rele, HIGH);
        Serial.println("Relè OFF");
        delay(20);
        message = "";
      }
    }
  }

  delay(200);
  portRF.listen();
  delay(100);
  String IdTest = "";
  if (portRF.available ())
  {
    delay(100);
    for (int u = 0; u < 14; u ++)
    {
      data [u] = portRF.read ();
      Serial.println(u);

    }
    for (int i = 1; i < 11; i ++)
    {
      char d = data [i];
      IdTest += d;
      Serial.println(IdTest);
    }
    if (((lastTagReading + 5000) < millis()))
    {
      lastTagReading = millis();
      Serial.print("RFID tag rivelato --> ");
      Serial.println(IdTest);
      Serial.println("");

      if (control() == 1)
      {
        opendoor();
      }
      else Chiudi();
    }
  }
  
}

int control()
{
  int i;

  for (i = 0; i < sizeof(IDOK); ++i) {
    if (IDOK [i] == IdTest )
    {
      return 1;
    }
  }
  return 0;
}

void opendoor ()
{
  digitalWrite (rele, HIGH);
  tone (8, 1800, 200);
  delay (300);
  tone (8, 2000, 300);
  Serial.println("Rele ON");
  delay (1000);
  digitalWrite (rele, LOW);
  Serial.println("Rele OFF");
}

void Chiudi()
{
  tone(8, 1200, 150);
  delay(300);
  tone(8, 1200, 150);
  delay(300);
  tone(8, 1200, 150);
}

Va benissimo come le stai usando. Invece quel test è ancora sbagliato. Hai corretto l'==, ma stai confrontando un carattere con una stringa intera, se interpreto bene.

ciao si si corretto!

ma il problema che non funziona , perchè mi vede solo il RFID , mentre il BT si connette al telefono ma non riceve i dati!!!;(((

non so proprio cosa fare!!!

help me!

thanks

massibal

........ NESSUNO SA DIRMI DOVE SBAGLIO???

grazie
massibal

buongiorno,

una domanda il mio problema potrebbe essere legato alla scelta dei PIN (2,3,4,5 ) ai quali ho assegnato le seriali

SoftwareSerial portBT(2, 3);
SoftwareSerial portRF(4, 5);

grazie !!!

attendo
:slight_smile:

No, dovrebbero andare bene se usi una Uno:

https://www.arduino.cc/en/Reference/SoftwareSerial

ok! quindi dovrebbe andare bene anche con il nANO visto che montano entrambi il ATmega328 , giusto ??

Giusto.