πŸšͺ Smart Home Arduino

Guida passo per passo β€” Assolutamente senza stress

βš™οΈ
Prima di toccare niente
3 cose importanti da leggere
❌
Arduino NON deve essere alimentato con USB durante i collegamenti! Se sbagli a collegare i fili e Arduino Γ¨ acceso, bruci la scheda. Scollega sempre USB prima di aggiungere/togliere fili.
πŸ“Œ Cosa ti serve per OGNI STEP:
  • Arduino Uno (la scheda)
  • Cavo USB (per caricare il codice)
  • Computer con Arduino IDE aperto
  • Un foglio dove scrivere cosa funziona e cosa no
ℹ️
Se qualcosa non funziona: non Γ¨ "rotto". Leggi la sezione "Se non vedi nulla" in fondo ad ogni step. Al 99% Γ¨ un filo scollegato o invertito.
1️⃣
Collega l'OLED (il display)
Solo 4 fili β€” il test piΓΉ facile
Di che cosa hai bisogno:
  • Arduino Uno (senza USB)
  • 1 display OLED I2C 128Γ—64
  • 4 cavetti: rosso, nero, blu, giallo (colori non importanti, ma aiutano)

Dove vanno i 4 fili:

OLED pin VCC β†’ Arduino 5V
OLED pin GND β†’ Arduino GND (il pin nero)
OLED pin SDA β†’ Arduino A4
OLED pin SCL β†’ Arduino A5
πŸ’‘
Piccolo trucco: etichetta i fili. Scrivi con una penna su un pezzetto di nastro adesivo: "VCC", "GND", ecc. Dopo pochi step non ricordi piΓΉ quali sono.
βœ“ Checklist prima di collegare il USB:

Carica questo codice:

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { // Inizializza il display if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { while (true); // Se non trova il display, si blocca qui } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 10); display.println("OLED OK"); display.setCursor(0, 30); display.println("Inserire PIN"); display.display(); } void loop() { // Nulla β€” il display rimane statico }

🎯 Se tutto va bene:

βœ…
Vedrai nel display le parole "OLED OK" e "Inserire PIN" β€” questo significa che l'OLED funziona e Arduino riesce a parlarci.

Se non vedi nulla:

πŸ”§ Procedure di debug
Schermo completamente nero
Prova questo ordine:
  1. Scollega USB β†’ aspetta 3 secondi
  2. Controlla i 4 fili: sono davvero nei buchi giusti?
  3. Metti il dito sul connettore dell'OLED e spingi forte in tutte e 4 le direzioni
  4. Riconnetti USB e carica il codice di nuovo
Se ancora niente β†’ il filo A5 (SCL) potrebbe essere invertito con A4 (SDA)
Nel display vedi linee strane, non il testo
L'indirizzo I2C non Γ¨ 0x3C. Carica questo codice per trovare l'indirizzo:
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); } void loop() { // Leggi Serial Monitor β€” vedrai l'indirizzo corretto delay(1000); }
Apri Serial Monitor (Strumenti β†’ Serial Monitor a 9600 baud) e leggi l'indirizzo che compare.
Errore "SSD1306 not found"
Hai dimenticato di installare le librerie. Vai su Sketch β†’ Includi libreria β†’ Gestisci librerie e cerca:
  • "Adafruit GFX Library" β†’ Installa
  • "Adafruit SSD1306" β†’ Installa
  • "Adafruit BusIO" β†’ Installa
πŸ’¬ Nota: Se A4 e A5 sono giΓ  occupati da qualcos'altro, il display non funziona. Su Arduino Uno, I2C DEVE stare su A4/A5 β€” non c'Γ¨ alternativa.
2️⃣
Collega il Keypad (tastiera 4Γ—4)
8 fili β€” ma uno per volta, non Γ¨ difficile
⚠️ Importante: Scollega USB prima di toccare i fili!
Di che cosa hai bisogno:
  • Arduino Uno (senza USB)
  • 1 Keypad 4Γ—4 (la tastiera)
  • 8 cavetti (colori diversi aiutano molto!)

La tastiera ha 8 pin:

Pin 1 (R1) β†’ D9
Pin 2 (R2) β†’ D8
Pin 3 (R3) β†’ D7
Pin 4 (R4) β†’ D6
Pin 5 (C1) β†’ D5
Pin 6 (C2) β†’ D4
Pin 7 (C3) β†’ D3
Pin 8 (C4) β†’ D2
⚠️
Non invertire gli ultimi 4 fili! Se i tasti premuti danno numeri sbagliati, probabilmente hai invertito C1/C2/C3/C4. Controlla l'ordine.
βœ“ Checklist prima di connettere USB:

Carica questo codice:

#include <Keypad.h> 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'} }; byte rowPins[ROWS] = {9, 8, 7, 6}; byte colPins[COLS] = {5, 4, 3, 2}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); void setup() { Serial.begin(9600); Serial.println("Premi un tasto"); } void loop() { char key = keypad.getKey(); if (key) { Serial.print("Hai premuto: "); Serial.println(key); } }

🎯 Se tutto va bene:

βœ…
Apri Serial Monitor (Strumenti β†’ Serial Monitor) β€” quando premi un tasto, vedrai il numero/lettera stampata. Ad esempio: "Hai premuto: 1", "Hai premuto: *", ecc.

Se i tasti danno numeri sbagliati:

πŸ”§ Procedure di debug
Premo "1" ma vedo "4" (o altri numeri sballati)
Hai probabilmente invertito i fili R (righe) o C (colonne).
Controlla in questo ordine:
  1. I 4 fili delle righe (R1, R2, R3, R4) β†’ devono essere D9, D8, D7, D6 in ordine
  2. I 4 fili delle colonne (C1, C2, C3, C4) β†’ devono essere D5, D4, D3, D2 in ordine
Piccolo trucco: se i numeri sono in riga (tipo 1,2,3 danno A,B,C) allora hai invertito le righe. Se sono in colonna, hai invertito le colonne.
Niente compare nel Serial Monitor
Prova questi step:
  1. Serial Monitor Γ¨ aperto e baud rate Γ¨ 9600?
  2. Scollega USB, aspetta 2 secondi, riconnetti
  3. Premi un tasto e guarda il Serial Monitor
Errore "Keypad not found"
Hai dimenticato la libreria. Vai su Sketch β†’ Includi libreria β†’ Gestisci librerie e cerca "Keypad" di Mark Stanley. Installa.
3️⃣
Collega il Servo (la serratura)
3 fili, ma questo Γ¨ critico β€” il servo ha bisogno di alimentazione separate
⚠️ ATTENZIONE MASSIMA: Il servo ha 3 fili. Se li sbagli, danneggi Arduino. I colori sono sempre gli stessi: Rosso (5V), Marrone/Nero (GND), Arancione (Segnale)
Di che cosa hai bisogno:
  • Arduino Uno (senza USB)
  • 1 Servo SG90 (la serratura)
  • 3 cavetti (rosso, nero, arancione di solito)
  • Alimentatore esterno 5V (batteria o alimentatore) β€” opzionale, ma consigliato
🚨
Il servo SG90 PICCOLO puΓ² funzionare da Arduino 5V, ma Γ¨ rischioso:
‒ Se funziona stabile → va bene così
β€’ Se Arduino si resetta o il servo trema β†’ passa ad alimentatore esterno

La soluzione SICURA: usa un alimentatore esterno 5V separato, con il GND del servo collegato sia all'alimentatore che al GND di Arduino (GND in comune).

Dove vanno i 3 fili (prima prova da Arduino):

Servo filo ROSSO (VCC) β†’ Arduino 5V (primo tentativo)
Servo filo NERO/MARRONE (GND) β†’ Arduino GND
Servo filo ARANCIONE (SEGNALE) β†’ Arduino pin D10
πŸ’‘
Se il servo trema o Arduino si resetta: Scollega il filo rosso da 5V di Arduino e collegalo a un alimentatore esterno 5V separato. Mantieni il GND del servo collegato all'Arduino GND (GND in comune per il segnale).

Carica questo codice:

#include <Servo.h> Servo servoPorta; const int pinServo = 10; void setup() { servoPorta.attach(pinServo); } void loop() { servoPorta.write(0); // Porta chiusa delay(1500); servoPorta.write(90); // Porta aperta delay(1500); }

🎯 Se tutto va bene:

βœ…
Il servo si muove regolarmente: da una posizione a un'altra ogni 1.5 secondi. Lo sentirai vibrare un pochino, Γ¨ normale.

Se il servo trema o non si muove:

πŸ”§ Procedure di debug
Servo trema forte o Arduino si resetta
Soluzione: passa ad alimentatore esterno 5V
Scollega il filo rosso del servo da Arduino 5V e collegalo a un alimentatore esterno separato. Mantieni il GND del servo collegato sia all'alimentatore che all'Arduino GND.
Se non hai alimentatore, prova prima da Arduino. Se funziona stabile, va bene così. Se trema → allora ti servirà un alimentatore.
Servo non si muove per niente
Prova questi step:
  1. Il filo arancione Γ¨ davvero su D10?
  2. Il filo rosso Γ¨ collegato a 5V (Arduino o alimentatore esterno)?
  3. Il filo nero Γ¨ collegato al GND?
  4. Scollega USB, aspetta 3 secondi, riconnetti
4️⃣
Collega l'LDR (sensore di luce)
Un partitore di tensione β€” un po' strano, ma semplice
Di che cosa hai bisogno:
  • Arduino Uno (senza USB)
  • 1 LDR (photoresistor) β€” una piccola resistenza che cambia valore con la luce
  • 1 resistenza da 10kΞ© (codice colori: marrone-nero-arancione)
  • 1 LED rosso o verde (per il test)
  • 1 resistenza da 330Ξ© (codice colori: arancione-arancione-marrone)
  • 3 cavetti
πŸ”΄ Resistenze necessarie:
Partitore LDR 10kΞ©
Limitazione LED 330Ξ©

Come funziona l'LDR (il sensore di luce):

L'LDR Γ¨ una resistenza che cambia valore quando c'Γ¨ luce. Non ha polaritΓ  (puoi metterla in entrambi i versi). Creiamo un "partitore" per misurare il valore.
5V ──┬─── LDR (verso GND)
β”‚
A0 ──┬─── Resistenza 10kΞ© ──┬── GND
β”‚ β”‚
(verso Arduino) (verso GND)

Collegamento LDR:

5V dell'Arduino β†’ Un capo dell'LDR
L'altro capo dell'LDR β†’ Arduino pin A0 (e anche a una resistenza 10kΞ©)
Resistenza 10kΞ© (l'altro capo) β†’ Arduino GND
LED rosso (+) β†’ Arduino A1 (con resistenza 330Ξ©)
LED rosso (–) β†’ Arduino GND
⚠️
L'LDR NON ha un verso giusto/sbagliato (non ha "+" e "–"). Ma la resistenza 10kΞ© ha un capo che va a GND e basta. Non invertire quella!

Carica questo codice:

const int pinLDR = A0; const int ledPrincipale = A1; int sogliaBuio = 500; // Regola questo dopo il primo test void setup() { pinMode(ledPrincipale, OUTPUT); Serial.begin(9600); } void loop() { int valore = analogRead(pinLDR); Serial.print("Valore LDR: "); Serial.println(valore); if (valore < sogliaBuio) { digitalWrite(ledPrincipale, HIGH); // Buio β†’ LED acceso } else { digitalWrite(ledPrincipale, LOW); // Luce β†’ LED spento } delay(300); }

🎯 Se tutto va bene:

βœ…
Apri Serial Monitor. Vedrai numeri che cambiano (es. 200, 300, 850). Copri l'LDR con un dito β€” il numero scende. Scoprilo β€” il numero sale. Il LED acceso/spento segue il cambio di luce.

βš™οΈ Regola la soglia:

πŸ’‘
Nel tuo ambiente: nota il numero di giorno (es. 700) e il numero di notte (es. 300). Scegli un valore nel mezzo come soglia (es. 500). Modifica sogliaBuio = 500; nel codice.

Se il LED non si accende/spegne:

πŸ”§ Procedure di debug
Il Serial Monitor mostra valori strani (es. 0 o 1023 sempre)
Probabilmente manca la resistenza 10kΞ© (il partitore). Controlla:
  1. La resistenza 10kΞ© Γ¨ collegata tra A0 e GND?
  2. Non Γ¨ spostata per sbaglio?
Il LED rimane sempre acceso/spento
La soglia Γ¨ probabilmente sbagliata. Guarda i numeri nel Serial Monitor e cambia sogliaBuio. Ad esempio, se i numeri vanno da 200 a 900, prova sogliaBuio = 550.
Il LED Γ¨ inserito al contrario
Il LED rosso ha due gambe: una lunga (+) e una corta (–). Controlla che la lunga sia verso A1 e la corta verso GND.
5️⃣
Collega il PIR (sensore di movimento)
Solo 3 fili, e accende 2 LED in sequenza
⏳ Attenzione: Il PIR ha un "tempo di warm-up" di 30–60 secondi dopo che lo accendi. Aspetta prima di muoverti davanti!
Di che cosa hai bisogno:
  • Arduino Uno (senza USB)
  • 1 sensore PIR (infrarosso passivo) β€” riconosce il calore dei movimenti
  • 2 LED (rossi o gialli)
  • 2 resistenze da 330Ξ©
  • 5 cavetti

Dove vanno i fili del PIR:

PIR pin VCC β†’ Arduino 5V
PIR pin GND β†’ Arduino GND
PIR pin OUT β†’ Arduino D11
LED scala 1 (+) β†’ Arduino A2 (con resistenza 330Ξ©)
LED scala 2 (+) β†’ Arduino A3 (con resistenza 330Ξ©)

Carica questo codice:

const int pinPIR = 11; const int ledScala1 = A2; const int ledScala2 = A3; unsigned long lastMotionTime = 0; const unsigned long timeoutScale = 4000; // 4 secondi bool scaleOn = false; void setup() { pinMode(pinPIR, INPUT); pinMode(ledScala1, OUTPUT); pinMode(ledScala2, OUTPUT); Serial.begin(9600); Serial.println("PIR in warm-up... aspetta 30 secondi"); } void loop() { int statoPIR = digitalRead(pinPIR); if (statoPIR == HIGH) { Serial.println("Movimento rilevato!"); if (!scaleOn) { digitalWrite(ledScala1, HIGH); delay(150); digitalWrite(ledScala2, HIGH); scaleOn = true; } lastMotionTime = millis(); } if (scaleOn && millis() - lastMotionTime > timeoutScale) { digitalWrite(ledScala2, LOW); delay(150); digitalWrite(ledScala1, LOW); scaleOn = false; } }

🎯 Se tutto va bene:

βœ…
Dopo 30 secondi di warm-up: Quando ti muovi davanti al PIR, i due LED si accendono in sequenza (prima scala1, poi scala2). Dopo 4 secondi senza movimento, si spengono in sequenza inversa.

Se il PIR non rileva movimento:

πŸ”§ Procedure di debug
Niente accade quando mi muovo
Prova questi step in ordine:
  1. Sono passati 30–60 secondi dal power-on?
  2. Il filo OUT del PIR Γ¨ davvero su D11?
  3. Il PIR sta guardando verso di me? (il sensorino Γ¨ rivolto nella mia direzione)
  4. Scollega USB, aspetta 5 secondi, riconnetti
I LED non si accendono
Controlla i LED:
  • Il LED ha la gamba lunga verso A2/A3?
  • La resistenza 330Ξ© Γ¨ inserita in serie?
6️⃣
Metti insieme OLED e Keypad
Prova 1: verificare che non si disturbino
πŸ’‘
Se Γ¨ giΓ  tutto collegato dai step precedenti: non aggiungere fili, carica solo un codice nuovo. Tutto rimane al suo posto.

Carica questo codice:

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Keypad.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); const byte ROWS = 4, COLS = 4; char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {9,8,7,6}; byte colPins[COLS] = {5,4,3,2}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); String pinInserito = ""; void mostraDisplay() { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Inserire PIN:"); display.setTextSize(2); display.setCursor(0, 25); display.println(pinInserito); display.display(); } void setup() { if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) while(true); mostraDisplay(); } void loop() { char key = keypad.getKey(); if (key) { if (key == '*' || key == '#') { pinInserito = ""; } else { if (pinInserito.length() < 4) pinInserito += key; } mostraDisplay(); } }

🎯 Se tutto va bene:

βœ…
Quando premi i tasti: il display si aggiorna e mostra i numeri che stai inserendo. * cancella. Non ci sono rallentamenti o blocchi.
7️⃣
Aggiungi il Servo (apri la porta con il PIN)
Il PIN corretto Γ¨: 1234#
A questo punto devi avere:
  • OLED, Keypad, PIR, LDR, LED tutti collegati
  • Il Servo collegato (come nello step 3)
  • L'alimentatore esterno 5V acceso

Carica questo codice:

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Keypad.h> #include <Servo.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); const byte ROWS = 4, COLS = 4; char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {9,8,7,6}; byte colPins[COLS] = {5,4,3,2}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); Servo servoPorta; String pinCorretto = "1234"; String pinInserito = ""; void msg(String a) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println(a); display.display(); } void mostraPin() { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Inserire PIN:"); display.setTextSize(2); display.setCursor(0, 25); display.println(pinInserito); display.display(); } void setup() { servoPorta.attach(10); servoPorta.write(0); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) while(true); mostraPin(); } void loop() { char key = keypad.getKey(); if (!key) return; if (key == '*') { pinInserito = ""; mostraPin(); } else if (key == '#') { if (pinInserito == pinCorretto) { msg("Codice OK"); servoPorta.write(90); // Apri delay(2500); servoPorta.write(0); // Chiudi } else { msg("Codice errato"); delay(1500); } pinInserito = ""; mostraPin(); } else { if (pinInserito.length() < 4) { pinInserito += key; mostraPin(); } } }

🎯 Se tutto va bene:

βœ…
Premi: 1 β†’ 2 β†’ 3 β†’ 4 β†’ #
Il display mostra "Codice OK" e il servo si apre (90Β°), aspetta 2.5 secondi e si richiude. Se sbagli il PIN, mostra "Codice errato".
8️⃣
Collega il KY-037 (sensore di suono) e Buzzer
Ultimo sensore β€” un piccolo suono da regolare
⚠️ Trimmer: Il KY-037 ha un piccolo potenziometro blu sulla scheda. Se scatta troppo spesso, giralo in senso orario con un cacciavite.
Di che cosa hai bisogno:
  • Arduino Uno (senza USB)
  • 1 modulo KY-037 (sensore di suono)
  • 1 Buzzer (piccolo altoparlante)
  • 3 cavetti per KY-037, 2 per il Buzzer

Dove vanno i fili:

KY-037 pin VCC β†’ Arduino 5V
KY-037 pin GND β†’ Arduino GND
KY-037 pin DO (digitale) β†’ Arduino D12
Buzzer pin + (positivo) β†’ Arduino D13
Buzzer pin – (negativo) β†’ Arduino GND
⚠️
Usa sempre il pin DO del KY-037, non l'AO! DO Γ¨ digitale (acceso/spento), AO Γ¨ analogico. Per questa progetto DO Γ¨ piΓΉ facile.

Carica questo codice:

const int pinSuono = 12; const int pinBuzzer = 13; bool lastState = false; unsigned long lastTrigger = 0; const unsigned long debounceTime = 800; void setup() { pinMode(pinSuono, INPUT); pinMode(pinBuzzer, OUTPUT); Serial.begin(9600); } void loop() { bool soundDetected = digitalRead(pinSuono); unsigned long now = millis(); if (soundDetected && !lastState && (now - lastTrigger > debounceTime)) { lastTrigger = now; Serial.println("Suono rilevato!"); tone(pinBuzzer, 1200, 120); delay(150); tone(pinBuzzer, 1600, 150); } lastState = soundDetected; }

🎯 Se tutto va bene:

βœ…
Quando batti le mani o fai un rumore netto: il buzzer emette una piccola melodia (2 bip). Se scatta continuamente dai rumori di fondo, gira il trimmer del KY-037 in senso orario.

Se il KY-037 scatta troppo spesso:

πŸ’‘
Regola il trimmer: sul retro del KY-037 c'Γ¨ un potenziometro blu con una fessura. Con un cacciavite piccolo, giralo lentamente in senso orario finchΓ© non scatta solo con i rumori forti. Prova e aggiusta fino a essere felice.
πŸŽ‰
Tutto insieme β€” Sistema completo
Copia il codice finale dello step 9 dalla guida principale
βœ…
Complimenti! Hai completato 8 step. Ora tutti i componenti sono collegati. Carica il codice "Sketch 9" dalla guida completa e il sistema funziona a pieno.
Cosa farΓ  il sistema:
β€’ PIN corretto 1234# = porta aperta + suono + LED acceso se buio
β€’ PIR di notte = scalinate illuminate in sequenza
β€’ Battito di mani = LED principale alterna acceso/spento
β€’ Di giorno = tutto rimane spento