Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Apriporta RFID con arduino uno

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[21] Re: Apriporta RFID con arduino uno o nano

Messaggioda Foto Utentelupoalberto74it » 9 giu 2023, 18:15

Ciao...rieccomi qui con un altro problema su questo progetto: premetto che sto provando sia un arduino uno che un arduino nano con rfid e relè. Ho notato da qualche tempo che l'arduino si blocca e devo togliere e rimettere l'alimentazione per poterlo utilizzare per un altro tot di tempo. Questo sistema è un po' seccante, perché devo sempre aprire la scatoletta dove ho arduino e staccare e riattaccare il cavo dell'alimentazione. Su internet ho fatto qualche ricerca e ho trovato una funzionalità di controllo: watchdog che a quanto ho capito serve per resettare il codice di arduino in caso di anomalie. Ora la mia domanda è questa: dove piazzo questa funzionalità, per poter resettare il codice di arduino finché non passo la tessera sul sensore rfid e una volta aperto il cancello ricominciare con il reset?...Grazie fin da ora...
Vi riposto il codice:
Codice: Seleziona tutto
#include <SPI.h>

#include <MFRC522.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>



#define SS_PIN 10

#define RST_PIN 9



#define LED_DENIED_PIN 7

#define LED_ACCESS_PIN 6

#define LED_AUTORIZED_PIN 4

#define rele 2

#define MAXSCHEDE 8


LiquidCrystal_I2C lcd(0x27,16,2);

MFRC522 mfrc522(SS_PIN, RST_PIN);


int code[MAXSCHEDE][7] = {{xx,xx,xx,xx},
{xx,xx,xx,xx},
{xx,xx,xx,xx},
{xx,xx,xx,xx},
{xx,xx,xx,xx},
{xx,xx,xx,xx},
{xx,xx,xx,xx},
{xx,xx,xx,xx}};

int codeRead = 0;


void setup() {

   Serial.begin(9600);
   
   SPI.begin();       

   mfrc522.PCD_Init();

   Serial.println("Arduino RFID reading UID");



   pinMode( LED_DENIED_PIN , OUTPUT);

   pinMode( LED_ACCESS_PIN , OUTPUT);

   pinMode( LED_AUTORIZED_PIN , OUTPUT);
   
   digitalWrite (rele, HIGH);
   pinMode(rele, OUTPUT);
         


   lcd.init();

 

  lcd.backlight();

  lcd.setCursor(0,0);

  lcd.print("IT Benvenuto");
  Serial.println("IT Benvenuto");
  lcd.setCursor(0,1);

  lcd.print("ES Bienvenidos");
  Serial.println("ES Bienvenidos");
}

void loop() {

 

if ( mfrc522.PICC_IsNewCardPresent())

    {

        if ( mfrc522.PICC_ReadCardSerial())

        {

           lcd.clear();

           Serial.print("Tag UID:");

           lcd.setCursor(0,0);

           lcd.print("Tag UID:");

           lcd.setCursor(0,1);


           for (byte i = 0; i < mfrc522.uid.size; i++) { 

                  Serial.print(mfrc522.uid.uidByte[i] < 0x27 ? " 0" : " ");

                  Serial.print(mfrc522.uid.uidByte[i], HEX);

                 

                  lcd.print(mfrc522.uid.uidByte[i] < 0x27 ? " 0" : " ");

                  lcd.print(mfrc522.uid.uidByte[i], HEX);

                //  lcd.print(" ");

            }

           

           
 
            int i = 0;

            boolean match = false;
        for(int sch=0;sch<MAXSCHEDE&&!match;sch++)
        {
            int i=0;
            match = true;
            while(i<mfrc522.uid.size)
            {
                if(!(int(mfrc522.uid.uidByte[i]) == int(code[sch][i])))
                  {
                     match = false;
                   }
                  i++;
}
}

            delay(2000);

           lcd.clear();

           lcd.setCursor(0,0);

           

           

           if(match)

           {

              digitalWrite( LED_ACCESS_PIN , HIGH);
             
              lcd.print("Accesso Valido");
              lcd.setCursor(0,1);
              lcd.print("Porta Aperta");

              Serial.println("\Accesso Valido");

              digitalWrite( LED_AUTORIZED_PIN, HIGH);

              digitalWrite (rele, LOW);
              delay (1000);     
              digitalWrite (rele, HIGH);

              digitalWrite( LED_AUTORIZED_PIN, LOW);

             

           

   

           }else{

              digitalWrite( LED_DENIED_PIN , HIGH);
             
              lcd.print("Carta Errata");
              lcd.setCursor(0,1);
              lcd.print("Accesso Negato");

             Serial.println("\Carta Errata");

           }

             

             Serial.println("============================");

           

             mfrc522.PICC_HaltA();
             



             delay(1000);

             reset_state();

       }

  }

}

void reset_state()

{

    lcd.clear();

    lcd.setCursor(0,0);

    lcd.print("IT Benvenuto");
    Serial.println("IT Benvenuto");
    lcd.setCursor(0,1);
    lcd.print("ES Bienvenidos");
    Serial.println("ES Bienvenidos");
   

    digitalWrite( LED_ACCESS_PIN , LOW);

    digitalWrite( LED_DENIED_PIN , LOW);

}
Avatar utente
Foto Utentelupoalberto74it
10 3
 
Messaggi: 42
Iscritto il: 4 ago 2021, 14:39

0
voti

[22] Re: Apriporta RFID con arduino uno o nano

Messaggioda Foto Utentelupoalberto74it » 11 giu 2023, 23:11

Purtroppo non posso più modificare il messaggio precedente quindi scrivo qui per dire che dopo svariate prove sono riuscito a trovare il problema. Erano dei cavi dell'alimentazione che avevo dimenticato di eliminare e che servivano in passato per alimentare relè e display ma che erano ancora collegati all'alimentatore di Arduino. :mrgreen:
Avatar utente
Foto Utentelupoalberto74it
10 3
 
Messaggi: 42
Iscritto il: 4 ago 2021, 14:39

0
voti

[23] Re: Apriporta RFID con arduino uno o nano

Messaggioda Foto Utenteedgar » 11 giu 2023, 23:24

lupoalberto74it ha scritto: sono riuscito a trovare il problema. Erano dei cavi dell'alimentazione...

Considerando gli inconvenienti che potrebbero verificarsi se non funzionasse l'apriporta, potrebbe essere lo stesso una buona idea studiare come realizzare e inserire un watchdog nel codice che hai scritto.
Avatar utente
Foto Utenteedgar
9.800 3 5 8
Master
Master
 
Messaggi: 5115
Iscritto il: 15 set 2012, 22:59

0
voti

[24] Re: Apriporta RFID con arduino uno o nano

Messaggioda Foto Utentelupoalberto74it » 12 giu 2023, 23:06

edgar ha scritto:Considerando gli inconvenienti che potrebbero verificarsi se non funzionasse l'apriporta, potrebbe essere lo stesso una buona idea studiare come realizzare e inserire un watchdog nel codice che hai scritto.


Ho provato a inserirlo in varie parti del codice, a volte mi va in loop infinito e non riesco ad utilizzarlo, puoi aiutarmi o qualcuno che può?
Avatar utente
Foto Utentelupoalberto74it
10 3
 
Messaggi: 42
Iscritto il: 4 ago 2021, 14:39

0
voti

[25] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utenteedgar » 12 giu 2023, 23:53

Non ti saprei aiutare, non uso l'IDE di Arduino e non ho mai avuto la necessità di usarlo ma, se avessi un'applicazione con criticità, farei del mio meglio per capirne l'uso.

Mi correggerà chi ne sa più di me ma da quanto ne so il meccanismo dovrebbe essere del tipo:
Avvio un timer interno che dopo un certo tempo fa il reset del sistema.
Nel contempo il loop principale azzera periodicamente il timer in modo che esso non arrivi mai alla fine del conteggio.
Se il loop principale si blocca, il timer arriva al termine del conteggio e resetta il sistema.
O_/
Avatar utente
Foto Utenteedgar
9.800 3 5 8
Master
Master
 
Messaggi: 5115
Iscritto il: 15 set 2012, 22:59

0
voti

[26] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utentedadduni » 13 giu 2023, 11:01

Il concetto di base e' quello.
Pero' non si fa con un normale Timer o con un contatore, in quasi tutti i processori c'e' un cirucito dedicato che si occupa di questo. Basta configurare qualche registro del WDOG e fa esattamente quello che serve. Questo perche' c'e' bisogno di un reset di alta priorita' che non venga mascherato da altro software o che non passi in secondo piano rispetto ad altre routine, serve proprio un reset hardware piu' che un soft reset dato da un timer.
Il WDOG triggera un reset globale "piu' potente" di quello che genereresti tu con un soft reset scattato da un timer
Avatar utente
Foto Utentedadduni
1.963 2 7 12
Expert EY
Expert EY
 
Messaggi: 1334
Iscritto il: 23 mag 2014, 16:26

0
voti

[27] Re: Apriporta RFID con arduino uno

Messaggioda Foto UtenteMarcoD » 13 giu 2023, 11:31

In mancanza di altri suggerimenti migliori,
sono solo in grado di proporre una brutta soluzione:

Definisci un piedino di uscita per il watchdog

All'inizio di
void loop()
{
// aggiungi:
digitalWrite (relewatchdog, LOW);
delay(500);
digitalWrite (relewatchdog, HIGH);
.....
dovrebbe commutare per 0,1 secondi l'uscita.
Sperando che bloccare il loop per 0,5 secondi non crei inconvenienti al funzionamento.
(puoi verificare il funzionamento mettendo un LED con 470 ohm in serie)
Poi devi studiare un circuito con un diodo e due condensatori, che rileva la mancanza di commutazione della uscita.
Avatar utente
Foto UtenteMarcoD
11,8k 5 9 13
Master EY
Master EY
 
Messaggi: 6445
Iscritto il: 9 lug 2015, 16:58
Località: Torino

1
voti

[28] Re: Apriporta RFID con arduino uno

Messaggioda Foto UtenteGioArca67 » 13 giu 2023, 16:05

Potresti mettere un watchdog

Codice: Seleziona tutto
#include <avr/wdt.h>

void setup() {
  wdt_disable();
  //resto del codice di setup

  wdt_enable(WDTO_2S); //Timeout di 2 secondi, ci sono altre impostazioni
}

void loop(){
  //il mio codice

  // se il mio codice impiegherà più di due secondi
  // per raggiungere la fine del ciclo
  // il watchdog resetterà Arduino

  //resetto il watchdog così sa che non sono incantato
  wdt_reset();
}
Avatar utente
Foto UtenteGioArca67
3.724 4 5 9
Master
Master
 
Messaggi: 3608
Iscritto il: 12 mar 2021, 9:36

0
voti

[29] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utentelupoalberto74it » 14 giu 2023, 20:30

Grazie a tutti per le risposte...ho optato per la soluzione di GioArca67...l'unica cosa è che quando si resetta il dispositivo si spegne e si riaccende. si può risolvere anche questo? o chiedo troppo? :roll:
Avatar utente
Foto Utentelupoalberto74it
10 3
 
Messaggi: 42
Iscritto il: 4 ago 2021, 14:39

0
voti

[30] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utenteedgar » 14 giu 2023, 21:27

lupoalberto74it ha scritto:quando si resetta il dispositivo si spegne e si riaccende

Se il sistema funziona correttamente il watchdog non arriva mai a resettare il sistema, non lo vedo come un problema
Avatar utente
Foto Utenteedgar
9.800 3 5 8
Master
Master
 
Messaggi: 5115
Iscritto il: 15 set 2012, 22:59

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti