No matching function for call to 'LiquidCrystal_I2C::begin()

AllarmDuino1.0_i2c.ino (14.6 KB)

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define SS_PIN 10
#define RST_PIN 9

// ***IMPORTANTE*** sostituire gli asterischi con il codice della Carta master
#define masnum0 ** 
#define masnum1 **
#define masnum2 ***
#define masnum3 ***
#define masnum4 ***

#define sensorePir1 2 // Ingresso sensore 1
#define sensorePir2 3 // Ingresso sensore 2
#define releSirena 31 // Contatto pulito a cui collegare una sirena esterna autoalimentata
#define ledRosso 33 // E' il led che indica lo stato della centrale
#define ledGiallo 34 // E' il led che indica lo stato del sensore 1
#define resetKey 32 // pulsante di reset e visualizzazione memoria di allarme

MFRC522 rfid(SS_PIN, RST_PIN); 
LiquidCrystal_I2C lcd(0x27,16,2);

boolean statoAntifurto = 0; // Variabile antifurto attivo
boolean statoAllarme = 0; // Variabile centrale in allarme
boolean statoSirena = 0; // Variabile di stato del relè sirena
boolean statoPir1 = 0; // Variabile di stato del sensore 1 
boolean statoPir2 = 0; // Variabile di stato del sensore 1 
boolean cardMaster = 0; // Variabile modalità chiave master
boolean memoriaAllarme = 0; // Variabile per gestire la memoria di allarme
boolean tastoPremuto = 0; // Variabile che controlla la pressione prolungata del tasto reset
int slave; // Contatore di chiavi salvate
int zona = 0; // Variabile che memorizza la zona che ha innescato l'allarme
int timerIngUsc = 0; // Variabile utilizzata per scandire i secondi trascorsi durante i tempi di ingresso o uscita
int faseIngUsc = 0; // Variabile che memorizza se si è nella fase di ingresso (1) o uscita (2)
unsigned long previousMillisSirena = 0; // Variabile utilizzata per gestire i millisecondi del tempo di suono della sirena.
unsigned long currentMillisSirena;
unsigned long previousMillisTempi = 0; // Variabile utilizzata per gestire i millisecondi del tempo di ingresso/uscita.
unsigned long currentMillisTempi;

int sernum0;
int sernum1;
int sernum2;
int sernum3;
int sernum4;

void setup()
{ 
  lcd.begin();
  SPI.begin(); 
  rfid.init();
  pinMode(ledRosso, OUTPUT);
  pinMode(releSirena, OUTPUT);
  pinMode(ledGiallo, OUTPUT);
  pinMode(sensorePir1,INPUT);
  pinMode(sensorePir2,INPUT);
  pinMode(resetKey, INPUT);
  digitalWrite(ledRosso, LOW);
  digitalWrite(ledGiallo, LOW);
  digitalWrite(releSirena, HIGH);
  standby();
}

void loop() {
  
  // Inizio blocco per la gestione locale della centrale
  // Rileva un tag...
if (rfid.isCard()) {
      // Legge il seriale...
      if (rfid.readCardSerial()) {
        sernum0 = rfid.serNum[0];
        sernum1 = rfid.serNum[1];
        sernum2 = rfid.serNum[2];
        sernum3 = rfid.serNum[3];
        sernum4 = rfid.serNum[4];
        slave = EEPROM.read(0);
                // Se il seriale letto corrisponde con il seriale Master
                // attiva o disattiva la modalita Memorizzazione chiavi
                // e in più visualizza il numero di chiavi salvate... 
                if (sernum0 == masnum0
                && sernum1 == masnum1
                && sernum2 == masnum2
                && sernum3 == masnum3
                && sernum4 == masnum4) {
                  if (statoAntifurto == 0) {
                         lcd.backlight();
                         if (cardMaster==0) {
                                  lcd.clear();
                                  lcd.print("CARD MASTER");
                                  delay(2000);
                                  lcd.clear();
                                  lcd.print("GESTIONE CHIAVI");
                                  cardMaster = 1;
                                  lcd.setCursor(0, 1);
                                  lcd.print("Chiavi slave: ");
                                  lcd.setCursor(15, 1);
                                  lcd.print(slave);
                                  delay(3000);
                         }  
                        else { 
                           cardMaster = 0;
                           lcd.setCursor(0, 1);
                           lcd.print("Annullata       ");
                           delay(3000);
                           standby();
                        }
                  }
                } 
                // Se invece il seriale letto corrisponde con uno dei tre gruppi 
                // di chiavi memorizzate allora attiva o disattiva l'antifurto.
                else if ((sernum0 == EEPROM.read(1) && sernum1 == EEPROM.read(2) && sernum2 == EEPROM.read(3) && sernum3 == EEPROM.read(4) && sernum4 == EEPROM.read(5))
                        || (sernum0 == EEPROM.read(6) && sernum1 == EEPROM.read(7) && sernum2 == EEPROM.read(8) && sernum3 == EEPROM.read(9) && sernum4 == EEPROM.read(10))
                        || (sernum0 == EEPROM.read(11) && sernum1 == EEPROM.read(12) && sernum2 == EEPROM.read(13) && sernum3 == EEPROM.read(14) && sernum4 == EEPROM.read(15))) {
                        lcd.backlight();
                        if (cardMaster==0) {
                             // Se l'antifurto non è inserito, lo attiva ed aggiorna a 2 la variabile "faseIngUsc",
                             // indicando che si è nella fase di uscita.  
                             if (statoAntifurto == 0) {  
                                      statoAntifurto = 1;
                                      faseIngUsc = 2;
                                      lcd.clear();
                                      lcd.print("CHIAVE VALIDA");
                                      delay(2000);
                                      lcd.clear();
                                      lcd.print("     TEMPO      ");
                                      lcd.setCursor(0, 1);
                                      lcd.print("     USCITA     ");
                             } 
                             else {
                                   if (faseIngUsc != 0) {
                                      timerIngUsc = 0;
                                      faseIngUsc = 0; 
                                   }
                                   lcd.clear();
                                   lcd.print("CHIAVE VALIDA");  
                                   delay(2000);
                                   disattiva();
                            } 
                        }
                } 
                // Se il seriale letto è diverso dal master e nemmeno presente in memoria,
                // e se è attiva la modalita Memorizzazione chiavi, salva il seriale in memoria
                // come slave1, slave2 o slave3.
                else if (cardMaster == 1 && slave == 0) {
                              lcd.clear();
                              lcd.print("Chiave rilevata!");
                              EEPROM.write(0, 1);
                              EEPROM.write(1, sernum0);
                              EEPROM.write(2, sernum1);
                              EEPROM.write(3, sernum2);
                              EEPROM.write(4, sernum3);
                              EEPROM.write(5, sernum4);
                              cardMaster = 0;
                              delay(1000);
                              lcd.setCursor(0, 1);
                              lcd.print("Slave 1 salvata!");
                              delay(3000);
                              standby();
                }
                else if (cardMaster == 1 && slave == 1) {
                              lcd.clear();
                              lcd.print("Chiave rilevata!");
                              EEPROM.write(0, 2);
                              EEPROM.write(6, sernum0);
                              EEPROM.write(7, sernum1);
                              EEPROM.write(8, sernum2);
                              EEPROM.write(9, sernum3);
                              EEPROM.write(10, sernum4);
                              cardMaster = 0;
                              delay(1000);
                              lcd.setCursor(0, 1);
                              lcd.print("Slave 2 salvata!");
                              delay(3000);
                              standby();
                 }
                 else if (cardMaster == 1 && slave == 2) {
                              lcd.clear();
                              lcd.print("Chiave rilevata!");
                              EEPROM.write(0, 3);
                              EEPROM.write(11, sernum0);
                              EEPROM.write(12, sernum1);
                              EEPROM.write(13, sernum2);
                              EEPROM.write(14, sernum3);
                              EEPROM.write(15, sernum4);
                              cardMaster = 0;
                              lcd.setCursor(0, 1);
                              lcd.print("Slave 3 salvata!");
                              delay(3000);
                              standby();
                 }
        }
}
rfid.halt();

 // Questa istruzione serve a far capire alla funzione "tempoIngressoUscita" in quale fase ci troviamo.
if ((faseIngUsc == 1) || (faseIngUsc == 2)) {
    tempoIngressoUscita(faseIngUsc);
}
         
  // Quando la centrale va in allarme si attiverà il relè della sirena per X secondi, 60 di default. 
if (statoSirena == 1) {
          attivaSirena();
} 
 // Se l'infrarosso rileva un movimento accende il led giallo
if (digitalRead(sensorePir1) == HIGH) {
          digitalWrite(ledGiallo, HIGH);
          statoPir1=1;

if (digitalRead(sensorePir2) == HIGH) {
          digitalWrite(ledGiallo, HIGH);
          statoPir2=1;
}
else {
           digitalWrite(ledGiallo, LOW);
           statoPir1=0;
else {
           digitalWrite(ledGiallo, LOW);
           statoPir2=0;
     }
          
  // Se l'infrarosso rileva un movimento e l'antifurto e attivo 
  // e quindi non in allarme, attiva l'allarme, memorizza la zona corrispondente ed aggiorna a 1 la variabile "faseIngUsc",
  // indicando che si è nella fase di ingresso.   
if (digitalRead(sensorePir1) == HIGH && statoAntifurto == 1 && statoAllarme == 0 && faseIngUsc == 0){
          faseIngUsc = 1;
          lcd.clear();
          lcd.print("     TEMPO      ");
          lcd.setCursor(0, 1);
          lcd.print("    INGRESSO    ");
          zona = 1;  
}
     
 // Se è stata attivata con la card Master la modalità "Memorizzazione chiavi",
 // premendo il pulsante di reset si azzera il database 
 // delle chiavi salvate fino a quel momento. 
if (digitalRead(resetKey) == HIGH && cardMaster == 1) {
         delay(100);
         cardMaster = 0;
         for (int i=0; i<16; i++){
           EEPROM.write(i, 0);
         } 
         lcd.backlight();
         lcd.clear();
         lcd.print("Reset chiavi...");
         delay(3000);
         standby();
}
 // Se si preme il tasto reset mentre la centrale e in standby si potrà visualizzare l'ultima memoria di allarme
 // se si mantiene premuto invece si effettua un reset
if (digitalRead(resetKey) == HIGH && statoAntifurto == 0) {
         tastoPremuto=1;  
         delay(1000);
         if (digitalRead(resetKey) == HIGH && statoAntifurto == 0 && tastoPremuto == 1) {
                  tastoPremuto=0;
                  EEPROM.write(16, 0);
                  lcd.backlight(); 
                  lcd.clear();  
                  lcd.print("Memoria Allarme:");
                  lcd.setCursor(0, 1);
                  lcd.print("Reset");
                  delay(3000);
                  standby();
         }
         else {
              tastoPremuto=0;
              lcd.backlight();
              lcd.clear();  
              lcd.print("Memoria Allarme:");
              lcd.setCursor(0, 1);
              if (EEPROM.read(16) > 0) {
                  lcd.print("Zona ");
                  lcd.setCursor(5, 1);
                  lcd.print(EEPROM.read(16));
              }
              else { 
                  lcd.print("Nessuna Memoria"); 
              }   
              delay(3000);
              standby(); 
         }        
}
}

void standby() {
  lcd.clear();
  lcd.print("AllarmDuino 1.0");
  delay(1000);
  lcd.noBacklight(); 
}
void allarme() {
  statoAllarme = 1;
  statoSirena = 1;
  if (memoriaAllarme == 0) {
      memoriaAllarme = 1;
      EEPROM.write(16, zona);
  } 
  lcd.backlight(); 
  lcd.clear();
  lcd.print("    ALLARME!    ");
  delay(1000);
  lcd.noBacklight();
}
void attiva() {
  statoAntifurto = 1;
  digitalWrite(ledRosso, HIGH);
  lcd.backlight();
  lcd.clear();
  lcd.print("   ANTIFURTO    ");
  lcd.setCursor(0, 1);
  lcd.print("    ATTIVO      ");
  delay(1000);
  lcd.noBacklight(); 
}

void disattiva() {
  statoAntifurto = 0;
  statoAllarme = 0;
  memoriaAllarme = 0;
  statoSirena = 0;
  zona = 0;
  digitalWrite(releSirena, HIGH);
  digitalWrite(ledRosso, LOW);
  lcd.backlight();
  lcd.clear();
  lcd.print("   ANTIFURTO    ");
  lcd.setCursor(0, 1);
  lcd.print("   DISATTIVO    ");
  delay(2000);
  standby();
}

void attivaSirena() {
  currentMillisSirena = millis();
  if(currentMillisSirena - previousMillisSirena >= 60000) { // Di default la sirena suonerà per 60 secondi (60 x 1000). Modifica con il numero di secondi che desideri.
       previousMillisSirena = currentMillisSirena;   
       if (digitalRead(releSirena) == HIGH){
            digitalWrite(releSirena, LOW);
       }
       else {
            digitalWrite(releSirena, HIGH);
            statoSirena = 0;
       }
  }   
}

void tempoIngressoUscita(int fase) {
  if (timerIngUsc < 10) {  // Di default i tempi di ingresso/uscita sono impostati a 10 secondi. Modifica con il numero di secondi che desideri.
      currentMillisTempi = millis();
      if(currentMillisTempi - previousMillisTempi >= 500) {
           previousMillisTempi = currentMillisTempi;
           if (digitalRead(ledRosso) == HIGH){
                digitalWrite(ledRosso, LOW);
           }
           else {
                timerIngUsc++;
                // Se desideri avere un beep sonoro che scandisse i secondi, collega al pin 2 un buzzer
                // e de-commenta la riga seguente.
                // tone(2, 1047, 500);
                digitalWrite(ledRosso, HIGH); 
           }
       }
  }
  else {
    // Una volta trascorsi i secondi impostati, se si è nella fase di ingresso fa scattare l'allarme,
    // mentre se si è nella fase di uscita attiva l'antifurto.
       faseIngUsc = 0;
       timerIngUsc = 0;
       if (fase == 1) {
         allarme();
       }
       else if (fase == 2) {
         attiva();
       }
         
  }
}

There are several libraries with the name LiquidCrystal_I2C. The are not all the same and code from 1 may not run in another. Those LiquidCrystal_I2C libraries are old and most are not maintained. The newest and best library for I2C LCD with the hd44780 controller (1602, 2004) is the hd44780 library by Bill Perry. The library is available via the IDE library manager.

To install the hd44780 library. The hd44780 library is the best available for I2C LCDs. The library is available in the Library Manager. Go to Library Manager (in the IDE menus, Sketch, Include Libraries, Manage Libraries) and in the Topics dropdown choose Display and in the Filter your search box enter hd44780. Select and install the hd44780 library by Bill Perry.

The class that you want to use is the hd44780_I2Cexp class. There are examples to show how to use the library. The nice thing about the hd44780 library is that it will autodetect the I2C address and the I2C backpack to LCD pin mapping.

In the examples, there is a diagnostic sketch that will help us to help you if you still have trouble with the display. Run the diagnostic sketch and post the results.

ok, quindi cosa dovrei rimuovere dal codice dato che trova da solo la mappatura e l'indirizzo I2C ? Grazie mille

Hi @Matt_07

Welcome to the forum!

You should add / delete LCD code lines based off of the library @groundFungus mentioned. Any lines not found in the examples should be deleted, while any that you don't have from the examples, should be added.

ok, quindi cosa dovrei rimuovere dal codice dato che trova da solo la mappatura e l'indirizzo I2C ? Grazie mille
ok, so what should I remove from the code since it finds the I2C mapping and address by itself? Thanks so much

Here is your code changed from the LiquidCrystal_I2C library to the hd44780 library. The part concerning the LCD now compiles, but there are problems with the MFRC522 library. I can't fix them because I have no idea what library you are using or where you got it. It looks to me like you are using code from one RFID library but have a different RFID library installed. Look at the examples in the library that you have installed to see what functions are available and the syntax for their use. Or find the library that fits the code.

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include <hd44780.h>       //  *********** main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // ******* i2c expander i/o class header

#define SS_PIN 10
#define RST_PIN 9

// ***IMPORTANTE*** sostituire gli asterischi con il codice della Carta master
#define masnum0 **
#define masnum1 **
#define masnum2 ***
#define masnum3 ***
#define masnum4 ***

#define sensorePir1 2 // Ingresso sensore 1
#define sensorePir2 3 // Ingresso sensore 2
#define releSirena 31 // Contatto pulito a cui collegare una sirena esterna autoalimentata
#define ledRosso 33 // E' il led che indica lo stato della centrale
#define ledGiallo 34 // E' il led che indica lo stato del sensore 1
#define resetKey 32 // pulsante di reset e visualizzazione memoria di allarme

MFRC522 rfid(SS_PIN, RST_PIN);
//LiquidCrystal_I2C lcd(0x27, 16, 2);
// ************* create lcd instance ***************
hd44780_I2Cexp lcd; // declare lcd object: auto locate & auto config expander chip

boolean statoAntifurto = 0; // Variabile antifurto attivo
boolean statoAllarme = 0; // Variabile centrale in allarme
boolean statoSirena = 0; // Variabile di stato del relè sirena
boolean statoPir1 = 0; // Variabile di stato del sensore 1
boolean statoPir2 = 0; // Variabile di stato del sensore 1
boolean cardMaster = 0; // Variabile modalità chiave master
boolean memoriaAllarme = 0; // Variabile per gestire la memoria di allarme
boolean tastoPremuto = 0; // Variabile che controlla la pressione prolungata del tasto reset
int slave; // Contatore di chiavi salvate
int zona = 0; // Variabile che memorizza la zona che ha innescato l'allarme
int timerIngUsc = 0; // Variabile utilizzata per scandire i secondi trascorsi durante i tempi di ingresso o uscita
int faseIngUsc = 0; // Variabile che memorizza se si è nella fase di ingresso (1) o uscita (2)
unsigned long previousMillisSirena = 0; // Variabile utilizzata per gestire i millisecondi del tempo di suono della sirena.
unsigned long currentMillisSirena;
unsigned long previousMillisTempi = 0; // Variabile utilizzata per gestire i millisecondi del tempo di ingresso/uscita.
unsigned long currentMillisTempi;

int sernum0;
int sernum1;
int sernum2;
int sernum3;
int sernum4;

// *************** LCD geometry ***************
const int LCD_COLS = 16;
const int LCD_ROWS = 2;

void setup()
{
   //lcd.begin();
   lcd.begin(LCD_COLS, LCD_ROWS); // ******* added *******
   SPI.begin();
   rfid.PCD_Init();  // *********** added PCD_
   pinMode(ledRosso, OUTPUT);
   pinMode(releSirena, OUTPUT);
   pinMode(ledGiallo, OUTPUT);
   pinMode(sensorePir1, INPUT);
   pinMode(sensorePir2, INPUT);
   pinMode(resetKey, INPUT);
   digitalWrite(ledRosso, LOW);
   digitalWrite(ledGiallo, LOW);
   digitalWrite(releSirena, HIGH);
   standby();
}

void loop()
{

   // Inizio blocco per la gestione locale della centrale
   // Rileva un tag...
   if (rfid.isCard())
   {
      // Legge il seriale...
      if (rfid.readCardSerial())
      {
         sernum0 = rfid.serNum[0];
         sernum1 = rfid.serNum[1];
         sernum2 = rfid.serNum[2];
         sernum3 = rfid.serNum[3];
         sernum4 = rfid.serNum[4];
         slave = EEPROM.read(0);
         // Se il seriale letto corrisponde con il seriale Master
         // attiva o disattiva la modalita Memorizzazione chiavi
         // e in più visualizza il numero di chiavi salvate...
         if (sernum0 == masnum0
               && sernum1 == masnum1
               && sernum2 == masnum2
               && sernum3 == masnum3
               && sernum4 == masnum4)
         {
            if (statoAntifurto == 0)
            {
               lcd.backlight();
               if (cardMaster == 0)
               {
                  lcd.clear();
                  lcd.print("CARD MASTER");
                  delay(2000);
                  lcd.clear();
                  lcd.print("GESTIONE CHIAVI");
                  cardMaster = 1;
                  lcd.setCursor(0, 1);
                  lcd.print("Chiavi slave: ");
                  lcd.setCursor(15, 1);
                  lcd.print(slave);
                  delay(3000);
               }
               else
               {
                  cardMaster = 0;
                  lcd.setCursor(0, 1);
                  lcd.print("Annullata       ");
                  delay(3000);
                  standby();
               }
            }
         }
         // Se invece il seriale letto corrisponde con uno dei tre gruppi
         // di chiavi memorizzate allora attiva o disattiva l'antifurto.
         else if ((sernum0 == EEPROM.read(1) && sernum1 == EEPROM.read(2) && sernum2 == EEPROM.read(3) && sernum3 == EEPROM.read(4) && sernum4 == EEPROM.read(5))
                  || (sernum0 == EEPROM.read(6) && sernum1 == EEPROM.read(7) && sernum2 == EEPROM.read(8) && sernum3 == EEPROM.read(9) && sernum4 == EEPROM.read(10))
                  || (sernum0 == EEPROM.read(11) && sernum1 == EEPROM.read(12) && sernum2 == EEPROM.read(13) && sernum3 == EEPROM.read(14) && sernum4 == EEPROM.read(15)))
         {
            lcd.backlight();
            if (cardMaster == 0)
            {
               // Se l'antifurto non è inserito, lo attiva ed aggiorna a 2 la variabile "faseIngUsc",
               // indicando che si è nella fase di uscita.
               if (statoAntifurto == 0)
               {
                  statoAntifurto = 1;
                  faseIngUsc = 2;
                  lcd.clear();
                  lcd.print("CHIAVE VALIDA");
                  delay(2000);
                  lcd.clear();
                  lcd.print("     TEMPO      ");
                  lcd.setCursor(0, 1);
                  lcd.print("     USCITA     ");
               }
               else
               {
                  if (faseIngUsc != 0)
                  {
                     timerIngUsc = 0;
                     faseIngUsc = 0;
                  }
                  lcd.clear();
                  lcd.print("CHIAVE VALIDA");
                  delay(2000);
                  disattiva();
               }
            }
         }
         // Se il seriale letto è diverso dal master e nemmeno presente in memoria,
         // e se è attiva la modalita Memorizzazione chiavi, salva il seriale in memoria
         // come slave1, slave2 o slave3.
         else if (cardMaster == 1 && slave == 0)
         {
            lcd.clear();
            lcd.print("Chiave rilevata!");
            EEPROM.write(0, 1);
            EEPROM.write(1, sernum0);
            EEPROM.write(2, sernum1);
            EEPROM.write(3, sernum2);
            EEPROM.write(4, sernum3);
            EEPROM.write(5, sernum4);
            cardMaster = 0;
            delay(1000);
            lcd.setCursor(0, 1);
            lcd.print("Slave 1 salvata!");
            delay(3000);
            standby();
         }
         else if (cardMaster == 1 && slave == 1)
         {
            lcd.clear();
            lcd.print("Chiave rilevata!");
            EEPROM.write(0, 2);
            EEPROM.write(6, sernum0);
            EEPROM.write(7, sernum1);
            EEPROM.write(8, sernum2);
            EEPROM.write(9, sernum3);
            EEPROM.write(10, sernum4);
            cardMaster = 0;
            delay(1000);
            lcd.setCursor(0, 1);
            lcd.print("Slave 2 salvata!");
            delay(3000);
            standby();
         }
         else if (cardMaster == 1 && slave == 2)
         {
            lcd.clear();
            lcd.print("Chiave rilevata!");
            EEPROM.write(0, 3);
            EEPROM.write(11, sernum0);
            EEPROM.write(12, sernum1);
            EEPROM.write(13, sernum2);
            EEPROM.write(14, sernum3);
            EEPROM.write(15, sernum4);
            cardMaster = 0;
            lcd.setCursor(0, 1);
            lcd.print("Slave 3 salvata!");
            delay(3000);
            standby();
         }
      }
   }
   rfid.halt();

   // Questa istruzione serve a far capire alla funzione "tempoIngressoUscita" in quale fase ci troviamo.
   if ((faseIngUsc == 1) || (faseIngUsc == 2))
   {
      tempoIngressoUscita(faseIngUsc);
   }

   // Quando la centrale va in allarme si attiverà il relè della sirena per X secondi, 60 di default.
   if (statoSirena == 1)
   {
      attivaSirena();
   }
   // Se l'infrarosso rileva un movimento accende il led giallo
   if (digitalRead(sensorePir1) == HIGH)
   {
      digitalWrite(ledGiallo, HIGH);
      statoPir1 = 1;

      if (digitalRead(sensorePir2) == HIGH)
      {
         digitalWrite(ledGiallo, HIGH);
         statoPir2 = 1;
      }
      else
      {
         digitalWrite(ledGiallo, LOW);
         statoPir1 = 0;
         else
         {
            digitalWrite(ledGiallo, LOW);
            statoPir2 = 0;
         }

         // Se l'infrarosso rileva un movimento e l'antifurto e attivo
         // e quindi non in allarme, attiva l'allarme, memorizza la zona corrispondente ed aggiorna a 1 la variabile "faseIngUsc",
         // indicando che si è nella fase di ingresso.
         if (digitalRead(sensorePir1) == HIGH && statoAntifurto == 1 && statoAllarme == 0 && faseIngUsc == 0)
         {
            faseIngUsc = 1;
            lcd.clear();
            lcd.print("     TEMPO      ");
            lcd.setCursor(0, 1);
            lcd.print("    INGRESSO    ");
            zona = 1;
         }

         // Se è stata attivata con la card Master la modalità "Memorizzazione chiavi",
         // premendo il pulsante di reset si azzera il database
         // delle chiavi salvate fino a quel momento.
         if (digitalRead(resetKey) == HIGH && cardMaster == 1)
         {
            delay(100);
            cardMaster = 0;
            for (int i = 0; i < 16; i++)
            {
               EEPROM.write(i, 0);
            }
            lcd.backlight();
            lcd.clear();
            lcd.print("Reset chiavi...");
            delay(3000);
            standby();
         }
         // Se si preme il tasto reset mentre la centrale e in standby si potrà visualizzare l'ultima memoria di allarme
         // se si mantiene premuto invece si effettua un reset
         if (digitalRead(resetKey) == HIGH && statoAntifurto == 0)
         {
            tastoPremuto = 1;
            delay(1000);
            if (digitalRead(resetKey) == HIGH && statoAntifurto == 0 && tastoPremuto == 1)
            {
               tastoPremuto = 0;
               EEPROM.write(16, 0);
               lcd.backlight();
               lcd.clear();
               lcd.print("Memoria Allarme:");
               lcd.setCursor(0, 1);
               lcd.print("Reset");
               delay(3000);
               standby();
            }
            else
            {
               tastoPremuto = 0;
               lcd.backlight();
               lcd.clear();
               lcd.print("Memoria Allarme:");
               lcd.setCursor(0, 1);
               if (EEPROM.read(16) > 0)
               {
                  lcd.print("Zona ");
                  lcd.setCursor(5, 1);
                  lcd.print(EEPROM.read(16));
               }
               else
               {
                  lcd.print("Nessuna Memoria");
               }
               delay(3000);
               standby();
            }
         }
      }
   } //  ************ added
}  //  ************ added

void standby()
{
   lcd.clear();
   lcd.print("AllarmDuino 1.0");
   delay(1000);
   lcd.noBacklight();
}
void allarme()
{
   statoAllarme = 1;
   statoSirena = 1;
   if (memoriaAllarme == 0)
   {
      memoriaAllarme = 1;
      EEPROM.write(16, zona);
   }
   lcd.backlight();
   lcd.clear();
   lcd.print("    ALLARME!    ");
   delay(1000);
   lcd.noBacklight();
}
void attiva()
{
   statoAntifurto = 1;
   digitalWrite(ledRosso, HIGH);
   lcd.backlight();
   lcd.clear();
   lcd.print("   ANTIFURTO    ");
   lcd.setCursor(0, 1);
   lcd.print("    ATTIVO      ");
   delay(1000);
   lcd.noBacklight();
}

void disattiva()
{
   statoAntifurto = 0;
   statoAllarme = 0;
   memoriaAllarme = 0;
   statoSirena = 0;
   zona = 0;
   digitalWrite(releSirena, HIGH);
   digitalWrite(ledRosso, LOW);
   lcd.backlight();
   lcd.clear();
   lcd.print("   ANTIFURTO    ");
   lcd.setCursor(0, 1);
   lcd.print("   DISATTIVO    ");
   delay(2000);
   standby();
}

void attivaSirena()
{
   currentMillisSirena = millis();
   if (currentMillisSirena - previousMillisSirena >= 60000)  // Di default la sirena suonerà per 60 secondi (60 x 1000). Modifica con il numero di secondi che desideri.
   {
      previousMillisSirena = currentMillisSirena;
      if (digitalRead(releSirena) == HIGH)
      {
         digitalWrite(releSirena, LOW);
      }
      else
      {
         digitalWrite(releSirena, HIGH);
         statoSirena = 0;
      }
   }
}

void tempoIngressoUscita(int fase)
{
   if (timerIngUsc < 10)    // Di default i tempi di ingresso/uscita sono impostati a 10 secondi. Modifica con il numero di secondi che desideri.
   {
      currentMillisTempi = millis();
      if (currentMillisTempi - previousMillisTempi >= 500)
      {
         previousMillisTempi = currentMillisTempi;
         if (digitalRead(ledRosso) == HIGH)
         {
            digitalWrite(ledRosso, LOW);
         }
         else
         {
            timerIngUsc++;
            // Se desideri avere un beep sonoro che scandisse i secondi, collega al pin 2 un buzzer
            // e de-commenta la riga seguente.
            // tone(2, 1047, 500);
            digitalWrite(ledRosso, HIGH);
         }
      }
   }
   else
   {
      // Una volta trascorsi i secondi impostati, se si è nella fase di ingresso fa scattare l'allarme,
      // mentre se si è nella fase di uscita attiva l'antifurto.
      faseIngUsc = 0;
      timerIngUsc = 0;
      if (fase == 1)
      {
         allarme();
      }
      else if (fase == 2)
      {
         attiva();
      }
   }
}

Grazie mille :grin:

Ho trovato la libreria corretta RFID.h
RFIDRC522.zip (14.1 KB)
il codice adesso è
AllarmDuino1.0_i2c.ino (13.9 KB)

Però adesso mi da l'errore:
Arduino:1.8.16 (Windows 10), Scheda:"Arduino Uno"

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: In function 'void loop()':

AllarmDuino1.0_i2c:94:19: error: 'void*' is not a pointer-to-object type

            && sernum1 == masnum1

               ^~~~~~~

AllarmDuino1.0_i2c:95:19: error: 'void*' is not a pointer-to-object type

            && sernum2 == masnum2

               ^~~~~~~

AllarmDuino1.0_i2c:96:19: error: 'void*' is not a pointer-to-object type

            && sernum3 == masnum3

               ^~~~~~~

AllarmDuino1.0_i2c:97:19: error: 'void*' is not a pointer-to-object type

            && sernum4 == masnum4)

               ^~~~~~~

AllarmDuino1.0_i2c:97:37: error: expected primary-expression before ')' token

            && sernum4 == masnum4)

                                 ^

AllarmDuino1.0_i2c:246:10: error: expected '}' before 'else'

      else

      ^~~~

AllarmDuino1.0_i2c:246:10: error: expected '}' before 'else'

AllarmDuino1.0_i2c:94:19: error: label 'sernum1' used but not defined

            && sernum1 == masnum1

               ^~~~~~~

AllarmDuino1.0_i2c:95:19: error: label 'sernum2' used but not defined

            && sernum2 == masnum2

               ^~~~~~~

AllarmDuino1.0_i2c:96:19: error: label 'sernum3' used but not defined

            && sernum3 == masnum3

               ^~~~~~~

AllarmDuino1.0_i2c:97:19: error: label 'sernum4' used but not defined

            && sernum4 == masnum4)

               ^~~~~~~

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: At global scope:

AllarmDuino1.0_i2c:322:4: error: expected declaration before '}' token

} //  ************ added

^

exit status 1

'void*' is not a pointer-to-object type

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Cosa posso fare ?

All of the "masnum"s are not defined at the top of your code. You have " #define masnum0 " without defining it as something. Type your actual RFID code digits into these definitions;
for example ' #define masnum0 7 ' with 7 being the first digit of your RFID code.

Buongiorno,

prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta il tuo thread (con le risposte già date) è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... essendo il tuo primo thread nella sezione Italiana del forum, nel rispetto del regolamento della suddetta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di farla al più presto. :wink:

@Matt_07 : ti avevo messo apposta il link di dove dovevi presentarti ... perché hai aperto un nuovo thread? :open_mouth:

Ho spostato e riunito nel thread delle presentazioni. Cortesemente, presta più attenzione a quanto ti si scrive. Grazie. :slight_smile:

Guglielmo

Scusa ho sbagliato :sweat_smile:
Grazie mille per la correzione

AllarmDuino1.0_i2c.ino (13.5 KB)

ho un altro problema, ho sostituito gli asterischi con i numeri seriali. Ma mi da questo messaggio di errore:

Arduino:1.8.16 (Windows 10), Scheda:"Arduino Uno"

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: In function 'void loop()':

AllarmDuino1.0_i2c:11:17: error: 'F5' was not declared in this scope

#define masnum0 F5

             ^

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:89:25: note: in expansion of macro 'masnum0'

      if (sernum0 == masnum0

                     ^~~~~~~

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:11:17: note: suggested alternative: 'A5'

#define masnum0 F5

             ^

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:89:25: note: in expansion of macro 'masnum0'

      if (sernum0 == masnum0

                     ^~~~~~~

AllarmDuino1.0_i2c:13:17: error: 'CB' was not declared in this scope

#define masnum2 CB

             ^

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:91:30: note: in expansion of macro 'masnum2'

            && sernum2 == masnum2

                          ^~~~~~~

AllarmDuino1.0_i2c:93:10: error: expected ')' before '{' token

      {

      ^

AllarmDuino1.0_i2c:208:7: error: expected primary-expression before '}' token

   }

   ^

AllarmDuino1.0_i2c:238:10: error: expected '}' before 'else'

      else

      ^~~~

AllarmDuino1.0_i2c:238:10: error: expected '}' before 'else'

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: At global scope:

AllarmDuino1.0_i2c:314:4: error: expected declaration before '}' token

} //  ************ added

^

exit status 1

'F5' was not declared in this scope

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"
[/quote]

I numeri esadecimali vanno indicati con 0x davanti.
Tipo 0xF5 e 0xCB

Qui il reference

#include <SPI.h>
#include <RFID.h>
#include <EEPROM.h>
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>

#define SS_PIN 10
#define RST_PIN 9

#define masnum0 0xF5
#define masnum1 0x88
#define masnum2 0xCB
#define masnum3 0x03

#define sensorePir1 2 // Ingresso sensore 1
#define sensorePir2 3 // Ingresso sensore 2
#define releSirena 31 // Contatto pulito a cui collegare una sirena esterna autoalimentata
#define ledRosso 33 // E' il led che indica lo stato della centrale
#define ledGiallo 34 // E' il led che indica lo stato del sensore 1
#define resetKey 32 // pulsante di reset e visualizzazione memoria di allarme

RFID rfid(SS_PIN, RST_PIN);
//LiquidCrystal_I2C lcd(0x27, 16, 2);
// ************* create lcd instance ***************
hd44780_I2Cexp lcd; // declare lcd object: auto locate & auto config expander chip

boolean statoAntifurto = 0; // Variabile antifurto attivo
boolean statoAllarme = 0; // Variabile centrale in allarme
boolean statoSirena = 0; // Variabile di stato del relè sirena
boolean statoPir1 = 0; // Variabile di stato del sensore 1
boolean statoPir2 = 0; // Variabile di stato del sensore 1
boolean cardMaster = 0; // Variabile modalità chiave master
boolean memoriaAllarme = 0; // Variabile per gestire la memoria di allarme
boolean tastoPremuto = 0; // Variabile che controlla la pressione prolungata del tasto reset
int slave; // Contatore di chiavi salvate
int zona = 0; // Variabile che memorizza la zona che ha innescato l'allarme
int timerIngUsc = 0; // Variabile utilizzata per scandire i secondi trascorsi durante i tempi di ingresso o uscita
int faseIngUsc = 0; // Variabile che memorizza se si è nella fase di ingresso (1) o uscita (2)
unsigned long previousMillisSirena = 0; // Variabile utilizzata per gestire i millisecondi del tempo di suono della sirena.
unsigned long currentMillisSirena;
unsigned long previousMillisTempi = 0; // Variabile utilizzata per gestire i millisecondi del tempo di ingresso/uscita.
unsigned long currentMillisTempi;

int sernum0;
int sernum1;
int sernum2;
int sernum3;

// *************** LCD geometry ***************
const int LCD_COLS = 16;
const int LCD_ROWS = 2;

void setup()
{
   //lcd.begin();
   lcd.begin(LCD_COLS, LCD_ROWS); // ******* added *******
   SPI.begin();
   pinMode(ledRosso, OUTPUT);
   pinMode(releSirena, OUTPUT);
   pinMode(ledGiallo, OUTPUT);
   pinMode(sensorePir1, INPUT);
   pinMode(sensorePir2, INPUT);
   pinMode(resetKey, INPUT);
   digitalWrite(ledRosso, LOW);
   digitalWrite(ledGiallo, LOW);
   digitalWrite(releSirena, HIGH);
   standby();
}

void loop()
{

   // Inizio blocco per la gestione locale della centrale
   // Rileva un tag...
   if (rfid.isCard())
   {
      // Legge il seriale...
      if (rfid.readCardSerial())
      {
         sernum0 = rfid.serNum[0];
         sernum1 = rfid.serNum[1];
         sernum2 = rfid.serNum[2];
         sernum3 = rfid.serNum[3];
         slave = EEPROM.read(0);
         // Se il seriale letto corrisponde con il seriale Master
         // attiva o disattiva la modalita Memorizzazione chiavi
         // e in più visualizza il numero di chiavi salvate...
         if (sernum0 == masnum0
               && sernum1 == masnum1
               && sernum2 == masnum2
               && sernum3 == masnum3
         
            if (statoAntifurto == 0)
            {
               lcd.backlight();
               if (cardMaster == 0)
               {
                  lcd.clear();
                  lcd.print("CARD MASTER");
                  delay(2000);
                  lcd.clear();
                  lcd.print("GESTIONE CHIAVI");
                  cardMaster = 1;
                  lcd.setCursor(0, 1);
                  lcd.print("Chiavi slave: ");
                  lcd.setCursor(15, 1);
                  lcd.print(slave);
                  delay(3000);
               }
               else
               {
                  cardMaster = 0;
                  lcd.setCursor(0, 1);
                  lcd.print("Annullata       ");
                  delay(3000);
                  standby();
               }
            }
         }
         // Se invece il seriale letto corrisponde con uno dei tre gruppi
         // di chiavi memorizzate allora attiva o disattiva l'antifurto.
         else if ((sernum0 == EEPROM.read(1) && sernum1 == EEPROM.read(2) && sernum2 == EEPROM.read(3) && sernum3 == EEPROM.read(4))
                  || (sernum0 == EEPROM.read(6) && sernum1 == EEPROM.read(7) && sernum2 == EEPROM.read(8) && sernum3 == EEPROM.read(9))
                  || (sernum0 == EEPROM.read(11) && sernum1 == EEPROM.read(12) && sernum2 == EEPROM.read(13) && sernum3 == EEPROM.read(14))
         {
            lcd.backlight();
            if (cardMaster == 0)
            {
               // Se l'antifurto non è inserito, lo attiva ed aggiorna a 2 la variabile "faseIngUsc",
               // indicando che si è nella fase di uscita.
               if (statoAntifurto == 0)
               {
                  statoAntifurto = 1;
                  faseIngUsc = 2;
                  lcd.clear();
                  lcd.print("CHIAVE VALIDA");
                  delay(2000);
                  lcd.clear();
                  lcd.print("     TEMPO      ");
                  lcd.setCursor(0, 1);
                  lcd.print("     USCITA     ");
               }
               else
               {
                  if (faseIngUsc != 0)
                  {
                     timerIngUsc = 0;
                     faseIngUsc = 0;
                  }
                  lcd.clear();
                  lcd.print("CHIAVE VALIDA");
                  delay(2000);
                  disattiva();
               }
            }
         }
         // Se il seriale letto è diverso dal master e nemmeno presente in memoria,
         // e se è attiva la modalita Memorizzazione chiavi, salva il seriale in memoria
         // come slave1, slave2 o slave3.
         else if (cardMaster == 1 && slave == 0)
         {
            lcd.clear();
            lcd.print("Chiave rilevata!");
            EEPROM.write(0, 1);
            EEPROM.write(1, sernum0);
            EEPROM.write(2, sernum1);
            EEPROM.write(3, sernum2);
            EEPROM.write(4, sernum3);
            cardMaster = 0;
            delay(1000);
            lcd.setCursor(0, 1);
            lcd.print("Slave 1 salvata!");
            delay(3000);
            standby();
         }
         else if (cardMaster == 1 && slave == 1)
         {
            lcd.clear();
            lcd.print("Chiave rilevata!");
            EEPROM.write(0, 2);
            EEPROM.write(6, sernum0);
            EEPROM.write(7, sernum1);
            EEPROM.write(8, sernum2);
            EEPROM.write(9, sernum3);
            cardMaster = 0;
            delay(1000);
            lcd.setCursor(0, 1);
            lcd.print("Slave 2 salvata!");
            delay(3000);
            standby();
         }
         else if (cardMaster == 1 && slave == 2)
         {
            lcd.clear();
            lcd.print("Chiave rilevata!");
            EEPROM.write(0, 3);
            EEPROM.write(11, sernum0);
            EEPROM.write(12, sernum1);
            EEPROM.write(13, sernum2);
            EEPROM.write(14, sernum3);
            cardMaster = 0;
            lcd.setCursor(0, 1);
            lcd.print("Slave 3 salvata!");
            delay(3000);
            standby();
         }
      }
   }
   rfid.halt();

   // Questa istruzione serve a far capire alla funzione "tempoIngressoUscita" in quale fase ci troviamo.
   if ((faseIngUsc == 1) || (faseIngUsc == 2))
   {
      tempoIngressoUscita(faseIngUsc);
   }

   // Quando la centrale va in allarme si attiverà il relè della sirena per X secondi, 60 di default.
   if (statoSirena == 1)
   {
      attivaSirena();
   }
   // Se l'infrarosso rileva un movimento accende il led giallo
   if (digitalRead(sensorePir1) == HIGH)
   {
      digitalWrite(ledGiallo, HIGH);
      statoPir1 = 1;

      if (digitalRead(sensorePir2) == HIGH)
      {
         digitalWrite(ledGiallo, HIGH);
         statoPir2 = 1;
      }
      else
      {
         digitalWrite(ledGiallo, LOW);
         statoPir1 = 0;
         else
         {
            digitalWrite(ledGiallo, LOW);
            statoPir2 = 0;
         }

         // Se l'infrarosso rileva un movimento e l'antifurto e attivo
         // e quindi non in allarme, attiva l'allarme, memorizza la zona corrispondente ed aggiorna a 1 la variabile "faseIngUsc",
         // indicando che si è nella fase di ingresso.
         if (digitalRead(sensorePir1) == HIGH && statoAntifurto == 1 && statoAllarme == 0 && faseIngUsc == 0)
         {
            faseIngUsc = 1;
            lcd.clear();
            lcd.print("     TEMPO      ");
            lcd.setCursor(0, 1);
            lcd.print("    INGRESSO    ");
            zona = 1;
         }

         // Se è stata attivata con la card Master la modalità "Memorizzazione chiavi",
         // premendo il pulsante di reset si azzera il database
         // delle chiavi salvate fino a quel momento.
         if (digitalRead(resetKey) == HIGH && cardMaster == 1)
         {
            delay(100);
            cardMaster = 0;
            for (int i = 0; i < 16; i++)
            {
               EEPROM.write(i, 0);
            }
            lcd.backlight();
            lcd.clear();
            lcd.print("Reset chiavi...");
            delay(3000);
            standby();
         }
         // Se si preme il tasto reset mentre la centrale e in standby si potrà visualizzare l'ultima memoria di allarme
         // se si mantiene premuto invece si effettua un reset
         if (digitalRead(resetKey) == HIGH && statoAntifurto == 0)
         {
            tastoPremuto = 1;
            delay(1000);
            if (digitalRead(resetKey) == HIGH && statoAntifurto == 0 && tastoPremuto == 1)
            {
               tastoPremuto = 0;
               EEPROM.write(16, 0);
               lcd.backlight();
               lcd.clear();
               lcd.print("Memoria Allarme:");
               lcd.setCursor(0, 1);
               lcd.print("Reset");
               delay(3000);
               standby();
            }
            else
            {
               tastoPremuto = 0;
               lcd.backlight();
               lcd.clear();
               lcd.print("Memoria Allarme:");
               lcd.setCursor(0, 1);
               if (EEPROM.read(16) > 0)
               {
                  lcd.print("Zona ");
                  lcd.setCursor(5, 1);
                  lcd.print(EEPROM.read(16));
               }
               else
               {
                  lcd.print("Nessuna Memoria");
               }
               delay(3000);
               standby();
            }
         }
      }
   } //  ************ added
}  //  ************ added

void standby()
{
   lcd.clear();
   lcd.print("AllarmDuino 1.0");
   delay(1000);
   lcd.noBacklight();
}
void allarme()
{
   statoAllarme = 1;
   statoSirena = 1;
   if (memoriaAllarme == 0)
   {
      memoriaAllarme = 1;
      EEPROM.write(16, zona);
   }
   lcd.backlight();
   lcd.clear();
   lcd.print("    ALLARME!    ");
   delay(1000);
   lcd.noBacklight();
}
void attiva()
{
   statoAntifurto = 1;
   digitalWrite(ledRosso, HIGH);
   lcd.backlight();
   lcd.clear();
   lcd.print("   ANTIFURTO    ");
   lcd.setCursor(0, 1);
   lcd.print("    ATTIVO      ");
   delay(1000);
   lcd.noBacklight();
}

void disattiva()
{
   statoAntifurto = 0;
   statoAllarme = 0;
   memoriaAllarme = 0;
   statoSirena = 0;
   zona = 0;
   digitalWrite(releSirena, HIGH);
   digitalWrite(ledRosso, LOW);
   lcd.backlight();
   lcd.clear();
   lcd.print("   ANTIFURTO    ");
   lcd.setCursor(0, 1);
   lcd.print("   DISATTIVO    ");
   delay(2000);
   standby();
}

void attivaSirena()
{
   currentMillisSirena = millis();
   if (currentMillisSirena - previousMillisSirena >= 60000)  // Di default la sirena suonerà per 60 secondi (60 x 1000). Modifica con il numero di secondi che desideri.
   {
      previousMillisSirena = currentMillisSirena;
      if (digitalRead(releSirena) == HIGH)
      {
         digitalWrite(releSirena, LOW);
      }
      else
      {
         digitalWrite(releSirena, HIGH);
         statoSirena = 0;
      }
   }
}

void tempoIngressoUscita(int fase)
{
   if (timerIngUsc < 10)    // Di default i tempi di ingresso/uscita sono impostati a 10 secondi. Modifica con il numero di secondi che desideri.
   {
      currentMillisTempi = millis();
      if (currentMillisTempi - previousMillisTempi >= 500)
      {
         previousMillisTempi = currentMillisTempi;
         if (digitalRead(ledRosso) == HIGH)
         {
            digitalWrite(ledRosso, LOW);
         }
         else
         {
            timerIngUsc++;
            // Se desideri avere un beep sonoro che scandisse i secondi, collega al pin 2 un buzzer
            // e de-commenta la riga seguente.
            // tone(2, 1047, 500);
            digitalWrite(ledRosso, HIGH);
         }
      }
   }
   else
   {
      // Una volta trascorsi i secondi impostati, se si è nella fase di ingresso fa scattare l'allarme,
      // mentre se si è nella fase di uscita attiva l'antifurto.
      faseIngUsc = 0;
      timerIngUsc = 0;
      if (fase == 1)
      {
         allarme();
      }
      else if (fase == 2)
      {
         attiva();
      }
   }
}

Ho sistemato il codice della carta master, ma adesso ho un altro problema.
Codice errore:

Arduino:1.8.16 (Windows 10), Scheda:"Arduino Uno"

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: In function 'void setup()':

AllarmDuino1.0_i2c:68:4: error: 'standby' was not declared in this scope

standby();

^~~~~~~

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:68:4: note: suggested alternative: 'srandom'

standby();

^~~~~~~

srandom

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: In function 'void loop()':

AllarmDuino1.0_i2c:94:13: error: expected ')' before 'if'

         if (statoAntifurto == 0)

         ^~

AllarmDuino1.0_i2c:120:10: error: expected primary-expression before '}' token

      }

      ^

AllarmDuino1.0_i2c:126:10: error: expected ')' before '{' token

      {

      ^

AllarmDuino1.0_i2c:208:7: error: expected primary-expression before '}' token

   }

   ^

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: At global scope:

AllarmDuino1.0_i2c:210:4: error: 'rfid' does not name a type

rfid.halt();

^~~~

AllarmDuino1.0_i2c:213:4: error: expected unqualified-id before 'if'

if ((faseIngUsc == 1) || (faseIngUsc == 2))

^~

AllarmDuino1.0_i2c:219:4: error: expected unqualified-id before 'if'

if (statoSirena == 1)

^~

AllarmDuino1.0_i2c:224:4: error: expected unqualified-id before 'if'

if (digitalRead(sensorePir1) == HIGH)

^~

AllarmDuino1.0_i2c:315:1: error: expected declaration before '}' token

} // ************ added

^

exit status 1

'standby' was not declared in this scope

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Manca una parentesi ')' alla fine.
Sarebbe opportuno trovare un modo per evitare queste
lunghissime espressioni.

Consiglio:
hai molte if annidate per capire a cosa corrisponde la } io
scrivo } // end if (cardMaster == 0)

Ciao.

AllarmDuino1.0_i2c.ino (13.5 KB)

Ho sistemato quello, ma ottengo sempre lo stesso errore:

Arduino:1.8.16 (Windows 10), Scheda:"Arduino Uno"

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: In function 'void setup()':

AllarmDuino1.0_i2c:68:4: error: 'standby' was not declared in this scope

standby();

^~~~~~~

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:68:4: note: suggested alternative: 'srandom'

standby();

^~~~~~~

srandom

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: In function 'void loop()':

AllarmDuino1.0_i2c:94:13: error: expected ')' before 'if'

         if (statoAntifurto == 0)

         ^~

AllarmDuino1.0_i2c:120:10: error: expected primary-expression before '}' token

      }

      ^

AllarmDuino1.0_i2c:154:19: error: 'disattiva' was not declared in this scope

               disattiva();

               ^~~~~~~~~

AllarmDuino1.0_i2c:175:13: error: 'standby' was not declared in this scope

         standby();

         ^~~~~~~

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:175:13: note: suggested alternative: 'srandom'

         standby();

         ^~~~~~~

         srandom

AllarmDuino1.0_i2c:191:13: error: 'standby' was not declared in this scope

         standby();

         ^~~~~~~

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:191:13: note: suggested alternative: 'srandom'

         standby();

         ^~~~~~~

         srandom

AllarmDuino1.0_i2c:206:13: error: 'standby' was not declared in this scope

         standby();

         ^~~~~~~

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino:206:13: note: suggested alternative: 'srandom'

         standby();

         ^~~~~~~

         srandom

C:\Users\matti\Desktop\AllarmDuino1.0_i2c\AllarmDuino1.0_i2c.ino: At global scope:

AllarmDuino1.0_i2c:210:4: error: 'rfid' does not name a type

rfid.halt();

^~~~

AllarmDuino1.0_i2c:213:4: error: expected unqualified-id before 'if'

if ((faseIngUsc == 1) || (faseIngUsc == 2))

^~

AllarmDuino1.0_i2c:219:4: error: expected unqualified-id before 'if'

if (statoSirena == 1)

^~

AllarmDuino1.0_i2c:224:4: error: expected unqualified-id before 'if'

if (digitalRead(sensorePir1) == HIGH)

^~

AllarmDuino1.0_i2c:315:1: error: expected declaration before '}' token

} // ************ added

^

exit status 1

'standby' was not declared in this scope

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Se è lo stesso, non serve riportare di nuovo tutto!
C'è un errore nelle parentesi da qualche parte: una in più, una in meno...
Vedi se è alla riga 93 o precedenti.

Ok, Scusa. Come posso inserire il numero della riga di programmazione al lato ?

La riga te la indica l'IDE.

Mi sembra che alla fine di questa riga si debba chiudere la parentesi tonda:
&& sernum3 == masnum3 )