Apriporta arduino nano, RFID, relè

Salve, ho un problema su questo progetto: premetto che sto lavorando su 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 (alimentatore esterno da 5v 2Ah su pin 5v - gnd) . 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 posto il codice:

#include <SPI.h> 

#include <MFRC522.h>

#include <Wire.h> 

#include <LiquidCrystal_I2C.h>



#define SS_PIN 10 

#define RST_PIN 9 


#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");

   
   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);



            }

            

            
  
            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)

           {

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

              Serial.println("\Accesso Valido");

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

                  

           }else{

                            
              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");   

    
 }

Per prima cosa, bisognerebbe mettere un po' d'ordine negli spazi e nelle graffe...
In elettronica e in informatica bisogna essere ordinati!

Ciao...quindi la soluzione è mettere in ordine il codice?

no ...ma hai presente il "dai la cera togli la cera"!?

ad ogni modo...io vedo delle cose non proprio "chiare"...almeno per me:

      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++;
        }
      }

poi...in due punti diversi:

Serial.println("\Accesso Valido");

Serial.println("\Carta Errata");

variabili locali con stessi nomi, e non descrittivi, ed il singolo simbolo

'\'

fa interpretare il carattere dopo in modo particolare...se vuoi stampare una parola come:

"\Carta errata"

nel codice devi scrivere:

"\\Carta Errata"

Purtroppo non è la soluzione, ma è sull'unica strada per arrivarci, sei costretto a passarci per forza

Se non chiarisci il programma nemmeno il pensiero lo sarà...

... come ti hanno già detto, non è la soluzione, ma è l'unica strada per renderlo "leggibile" e quindi potersi accorgere di eventuali errori di logica che, il compilatore NON segnala, ma che, se ci sono, inficiano il funzionameto del programma.

Guglielmo

Grazie a tutti per i consigli...sono riuscito comunque a trovare la soluzione dopo svariate prove...il problema stava nell'alimentazione dell'arduino. Avevo dimenticato di eliminare devi cavi che alimentavano display, relè che non utilizzavo più e che erano rimasti dietro la scatoletta che contiene l'arduino...il codice di questo progetto l'avevo reperito in rete e gli avevo aggiunto la possibilità di avere altre schede e il messaggio di benvenuto, tutto il resto fa parte dell'autore originale.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.