Salve a tutti! Sono Renato e mi sto cimentando nella realizzazione di un antifurto auto con arduino 1 e lettore rfid. Lavoro in Stellantis ma ho da sempre la passione per l'elettronica avendo conseguito anche il diploma in elettronica e telecomunicazioni. Ho le conoscenze base dell'elettronica avendo realizzato anche impianti elettrici nel mio precedente lavoro e mi cimento tutti i giorni al lavoro con svariati sensori, plc e sistemi di controllo. Attualmente svolgo test a caldo sui motori V6 Alfa Romeo e Maserati prodotti nello stabilimento di Termoli. Ho trovato sul web vari progetti per comandare un relè tramite arduino1 con lettore rfid ma la mia difficoltò sta solamente nel fatto che non conosco il linguaggio di programmazione.... Tutti i progetti che ho visualizzato attivano un relè per un determinato tempo, pochi secondi in genere, mentre io vorrei semplicemente che resti attivo fino a che non desideri di spegnerlo io, magari leggendo di nuovo il tag rfid. Vorrei in pratica che il lettore rfid funga semlicemente da interruttore non temporizzato. Sto cercando consigli e migliorie da applicare al mio progetto che credo sia abbastanza valido e non particolarmente complesso nella realizzazione. Per completezza delle informazioni, preciso che con il relè andrei ad interrompere non l'alimentazione della pompa carburante, essendo che l'auto viene utilizzata da mia moglie e so in partenza che si dimenticherà di attivare il sistema facendo girare la pompa anta pressione senza carburante e mandando in circolo smeriglio, ma vorrei interrompere il segnale con comanda il teleruttore di attivazione del motorino di avviamento in modo che la macchina non vada in moto in nessun modo.
Ringrazio anticipatamente chi vorrà aiutarmi a realizzare questo mio progetto e resto in attesa di consigli e soluzioni per i miei dubbi. Un saluto a tutti.
In pratica, vorrei semplicemente che l’uscita relé resti attiva fino a quando non leggo altro tag RFID autorizzato.
Lo sketch che utilizzo è il seguente:
Con questo sketch è possibile fare accendere un led o commutare un relè
al passaggio di una tessera magnetica sul lettore RFID.
Se la tessera viene riconosciuta si accende un led verde e commuta il relè,
altrimenti un led rosso per indicarci l`inaccessibilità.
Autore Salvatore Fancello
PINOUT:
RC522 MODULO Uno/Nano
SDA D10
SCK D13
MOSI D11
MISO D12
IRQ N/A
GND GND
RST D9
3.3V 3.3V
led verde al Pin 3
Led rosso al Pin 4
Relè al Pin 2
*/
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10 // Pin 53 per Arduino Mega
#define RESET_DIO 9
#define delayRead 1000 // Tempo
#define delayLed 2000
#define ledVerde 3
#define ledRosso 4
#define rele 2
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);
// inserire tutti i codici esadecimali delle schede magnetiche riconosciute
String codiceAutorizzato1 = "FCA2333B56";
String codiceAutorizzato2 = "ESEMPIO479";
String codiceAutorizzato3 = "ESEMPIO480";
void setup()
{
Serial.begin(9600);
/* Abilita SPI*/
SPI.begin();
/* Viene inizilizzato RFID reader */
RC522.init();
Serial.println("Setup");
pinMode(ledVerde,OUTPUT);
pinMode(ledRosso,OUTPUT);
pinMode(rele,OUTPUT);
}
void loop()
{
/* Temporary loop counter */
byte i;
// Se viene letta una tessera
if (RC522.isCard())
{
// Viene letto il suo codice
RC522.readCardSerial();
String codiceLetto ="";
Serial.println("Codice delle tessera letto:");
// Viene caricato il codice della tessera, all'interno di una Stringa
for(i = 0; i <= 4; i++)
{
codiceLetto+= String (RC522.serNum[i],HEX);
codiceLetto.toUpperCase();
}
Serial.println(codiceLetto);
if(verificaCodice(codiceLetto,codiceAutorizzato1)||verificaCodice(codiceLetto,codiceAutorizzato2)
||verificaCodice(codiceLetto,codiceAutorizzato3)){
Serial.println("Tessera autorizzata");
accendiLed(ledVerde);
digitalWrite (rele, HIGH);
delay (1000); // Tempo relè in stato ON
digitalWrite (rele, LOW);
}else{
Serial.println("Tessera non autorizzata");
accendiLed(ledRosso);
}
delay(delayRead);
}
}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto, String codiceAutorizzato){
if(codiceLetto.equals(codiceAutorizzato)){
return true;
}else{
return false;
}
}
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
digitalWrite(ledPin,HIGH);
delay(delayLed);
digitalWrite(ledPin,LOW);
}
Vorrei eliminare il delay ed il tempo di funzionamento del relè in modo da farlo funzionare come un semplice interruttore.
Non avendo ancora dimestichezza con il linguaggio di programmazione vi chiedo una mano per fare questa piccola modifica al progetto.
Grazie a tutti.
Devi cambiare un po' la logica del programma.
Tieni una variabile in cui salvi lo stato che deve avere il relè.
Ogni volta che riconosci una card inverti il valore della variabile.
A questo punto attivi / disattivi il relè in base a questa variabile invece di attivarlo quando leggi la card.
Grazie del consiglio. Sarebbe proprio ciò a cui sto puntando. Sapresti indicarmi in termini di sketch in cosa consiste questa variabile? Come dicevo nella presentazione non conosco ancora bene il linguaggio di programmazione anche se in questi giorni ci sto dando giù parecchio forte ![]()
Grazie ancora.
Sono da cell... Provo a scrivere in pseudo codice, vedi se si capisce
// dichiari la variabile
bool autorizzato = false;
...
//nel loop fai una cosa del genere
// controlli la card come facevi prima
if cartaok
// inverti lo stato della variabile
autorizzato = !autorizzato;
...
// attivi il relè in base alla variabile
if (autorizzato)
Attiva relè
else
Disattiva relè