#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MFRC522.h>
#include <SPI.h>
#include <DHT.h>
#include <Keypad.h>
// Definizione PIN per Arduino Uno/Nano
#define SS_PIN 10 // Lettore RFID (SPI SS)
#define RST_PIN 9 // Lettore RFID Reset
#define RELAY_PIN 8 // Relè
#define DHT_PIN 7 // Sensore DHT11
#define DHT_TYPE DHT11
// Inizializzazione dispositivi
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C: A4 (SDA), A5 (SCL)
MFRC522 mfrc522(SS_PIN, RST_PIN); // SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK)
DHT dht(DHT_PIN, DHT_TYPE);
// Definizione Tastierino 4x4
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Pin modificati per Arduino Uno
byte rowPins[ROWS] = {6, 5, 4, 3}; // Pin digitali per le righe
byte colPins[COLS] = {A3, A2, A1, A0}; // Pin analogici usati come digitali per le colonne
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// UID autorizzati (Modifica con gli UID reali delle tue card)
String validCards[] = {"F487DB9", "5FB05948"};
// PIN di sicurezza
String correctPIN = "1234";
String enteredPIN = "";
unsigned long lastDisplayUpdate = 0;
int displayState = 0; // Stato del display per alternare le informazioni
void setup() {
Serial.begin(9600); // Baudrate standard per Arduino
SPI.begin();
mfrc522.PCD_Init();
// Inizializza LCD
lcd.init();
lcd.backlight();
// Inizializza DHT11
dht.begin();
// Configura relè
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Relè spento inizialmente
Serial.println("Sistema Arduino pronto!");
// Mostra messaggio iniziale
showStandbyMessage();
}
void showStandbyMessage() {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("ALBA RELAIS");
lcd.setCursor(1, 1);
lcd.print("Carta o PIN:");
}
// Legge l'UID della carta
String readCard() {
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
return "";
}
String uid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
uid += String(mfrc522.uid.uidByte[i], HEX);
}
uid.toUpperCase();
mfrc522.PICC_HaltA(); // Ferma la lettura della carta
return uid;
}
// Controlla se l'UID è valido
bool isValidCard(String uid) {
for (int i = 0; i < sizeof(validCards)/sizeof(validCards[0]); i++) {
if (uid == validCards[i]) return true;
}
return false;
}
// Mostra temperatura e umidità in modo alternato sul display
void updateDisplay() {
if (millis() - lastDisplayUpdate > 3000) { // Cambia ogni 3 secondi
lastDisplayUpdate = millis();
if (displayState == 1) {
float temperature = dht.readTemperature();
if (!isnan(temperature)) { // Verifica lettura valida
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print("C");
lcd.setCursor(1, 1);
lcd.print("Carta o PIN:");
}
}
else if (displayState == 2) {
float humidity = dht.readHumidity();
if (!isnan(humidity)) { // Verifica lettura valida
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Umid: ");
lcd.print(humidity, 1);
lcd.print("%");
lcd.setCursor(1, 1);
lcd.print("Carta o PIN:");
}
}
else {
showStandbyMessage();
}
displayState = (displayState + 1) % 3; // Alterna le schermate
}
}
// Chiede il PIN all'utente
bool askForPIN() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Inserisci PIN:");
enteredPIN = "";
unsigned long startTime = millis();
while (enteredPIN.length() < 4) {
// Timeout dopo 10 secondi
if (millis() - startTime > 10000) {
return false;
}
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') { // Solo numeri
lcd.setCursor(enteredPIN.length(), 1);
lcd.print("*"); // Mostra asterisco per ogni cifra digitata
enteredPIN += key;
}
}
}
delay(500);
return (enteredPIN == correctPIN);
}
// Attiva il relè
void openDoor() {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Porta aperta");
lcd.setCursor(4, 1);
lcd.print("Benvenuto!");
digitalWrite(RELAY_PIN, HIGH);
delay(5000); // Relè attivo per 5 secondi
digitalWrite(RELAY_PIN, LOW);
showStandbyMessage();
}
void loop() {
updateDisplay(); // Aggiorna LCD con temperatura/umidità
// Controlla carta RFID
String cardID = readCard();
if (cardID != "" && isValidCard(cardID)) {
Serial.println("Carta valida rilevata: " + cardID);
openDoor(); // Se la carta è valida, apre direttamente il relè
delay(1000); // Evita letture multiple
return;
}
// Controlla PIN da tastierino
char key = keypad.getKey();
if (key == '#') { // Se preme #, avvia la verifica PIN
Serial.println("Richiesta PIN da tastierino");
if (askForPIN()) {
Serial.println("PIN corretto");
openDoor(); // Se il PIN è corretto, apre il relè
} else {
Serial.println("PIN errato o timeout");
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Accesso negato");
delay(2000);
showStandbyMessage();
}
}
}