📞 Arduino • GSM Shield 2 • PIR

GSM Shield 2 e sensore PIR con Arduino: chiamata al rilevamento

Realizziamo un rilevatore di movimento che usa un sensore PIR e una GSM Shield 2 per effettuare automaticamente una chiamata quando Arduino rileva un evento.

DifficoltàIntermedia
Sensore PIRD4 • attivo LOW
NotificaChiamata GSM
In poche parole: il PIR porta la sua uscita di allarme a livello LOW quando rileva movimento. Arduino legge il pin D4 e, tramite la GSM Shield 2, avvia una chiamata verso il numero impostato nello sketch.

Cosa imparerai

  • come leggere un sensore PIR con uscita digitale;
  • come gestire una logica di allarme attiva LOW;
  • come inizializzare la GSM Shield 2 con la libreria GSM.h;
  • come effettuare una chiamata tramite GSMVoiceCall;
  • come inserire il numero telefonico nello sketch;
  • come evitare chiamate ripetute troppo ravvicinate.

Come funziona il progetto

Arduino Uno R3, GSM Shield 2 e sensore PIR vengono combinati per creare un semplice sistema di rilevazione movimento. Quando il sensore rileva un evento, Arduino effettua una chiamata al numero configurato.

Arduino GSM Shield 2

Arduino GSM Shield 2 utilizzata nel progetto.

Sensore PIR per Arduino

Sensore PIR utilizzato per il rilevamento del movimento.

Come funziona il sensore PIR usato nel progetto

Il PIR utilizzato viene alimentato tra 7 V e 12 V. Dopo l’accensione impiega circa due secondi per stabilizzarsi sull’ambiente circostante e può rilevare movimento fino a circa 7 metri.

Un dettaglio fondamentale è la logica dell’uscita: quando rileva movimento, il piedino di allarme passa a livello logico LOW.

Non tutti i PIR sono identici: alimentazione, piedinatura e polarità dell’uscita dipendono dal modello. Le indicazioni 7–12 V e “allarme LOW” valgono per il sensore usato in questo progetto: controlla sempre il tuo modulo prima di collegarlo.

Materiale necessario

🔌 Arduino Uno
📶 Arduino GSM Shield 2
👁️ Sensore PIR
🧩 Breadboard
🔗 Cavetti jumper

🧰 Kit Arduino consigliato

Molti progetti del sito utilizzano sensori, breadboard, cavetti e componenti elettronici di base. Un kit completo può essere comodo per iniziare.

👉 Guarda il kit Arduino consigliato

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

📘 Vuoi imparare Arduino passo dopo passo?

Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.

👉 Scopri i miei libri su Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema del circuito

Arduino GSM Shield 2 con sensore PIR

Schema di collegamento della GSM Shield 2 con sensore PIR.

Collegamento principale

ElementoCollegamentoFunzione
Uscita allarme PIRD4Rilevazione movimento
GSM Shield 2Montata/collegata ad ArduinoGestione rete GSM e chiamata
Numero telefonicoDefinito nello sketchDestinatario della chiamata

Inserire il numero telefonico

Prima di caricare lo sketch devi sostituire il testo:

Numero da chiamare
String remoteNumber = "insert-here-your-phone-number";

con il numero che vuoi chiamare. È buona pratica inserire il prefisso internazionale quando richiesto dalla SIM o dalla rete utilizzata.

Privacy: non pubblicare sul sito il tuo numero reale dentro lo sketch. Mantieni sempre un segnaposto nella pagina e inserisci il numero solo nella copia locale del codice che carichi su Arduino.

Codice Arduino commentato

GSM Shield 2 + PIR + chiamata automatica
#include <GSM.h>

// ==========================================================
// GSM SHIELD 2 + SENSORE PIR
// Effettua una chiamata quando viene rilevato movimento
// ==========================================================

// Oggetto che gestisce la connessione alla rete GSM
GSM gsmAccess;

// Oggetto dedicato alle chiamate vocali
GSMVoiceCall vcs;

// Numero telefonico da chiamare.
// Sostituisci il segnaposto nella tua copia locale.
String remoteNumber = "insert-here-your-phone-number";

// Buffer di caratteri richiesto dalla funzione voiceCall()
char charBuffer[20];

// Uscita digitale del PIR collegata al pin D4
const int pirPin = 4;

// Variabile che contiene lo stato letto dal sensore.
// Con questo sensore:
// HIGH = nessun movimento
// LOW = movimento rilevato
int statoPir = HIGH;

void setup() {

 // Configura l'uscita del PIR come ingresso
 pinMode(pirPin, INPUT);

 // Converte la String del numero telefonico
 // in un array di char utilizzabile dalla libreria GSM.
 remoteNumber.toCharArray(charBuffer, 20);

 // Monitor Seriale per il debug
 Serial.begin(9600);

 Serial.println();
 Serial.println("- Avvio configurazione GSM -");

 // Finché la shield non è collegata alla rete,
 // continua a tentare l'inizializzazione.
 bool nonConnesso = true;

 while (nonConnesso) {

 if (gsmAccess.begin() == GSM_READY) {

 // Connessione GSM riuscita
 nonConnesso = false;
 }
 else {

 // Nuovo tentativo dopo un secondo
 Serial.println("GSM non connesso. Nuovo tentativo...");
 delay(1000);
 }
 }

 Serial.println("GSM inizializzato.");
 Serial.println("Attesa iniziale di 10 secondi...");

 // Tempo di stabilizzazione prima di iniziare
 // a controllare il sensore.
 delay(10000);
}

void loop() {

 // Legge lo stato dell'uscita digitale del PIR
 statoPir = digitalRead(pirPin);

 // Mostra lo stato sul Monitor Seriale
 Serial.print("PIR: ");
 Serial.println(statoPir);

 // Il sensore del progetto è attivo LOW:
 // quando statoPir è LOW viene rilevato movimento.
 if (statoPir == LOW) {

 Serial.println("Movimento rilevato.");

 // Avvia la chiamata verso il numero configurato
 if (vcs.voiceCall(charBuffer)) {

 Serial.println("Chiamata avviata.");

 // Resta in attesa finché la chiamata
 // risulta nello stato TALKING.
 while (vcs.getvoiceCallStatus() == TALKING) {
 // Nessuna operazione:
 // attendiamo che la chiamata termini.
 }

 // Chiude la chiamata se necessario
 vcs.hangCall();

 Serial.println("Chiamata terminata.");

 delay(1000);
 }

 // Pausa di 30 secondi:
 // evita di effettuare immediatamente
 // una seconda chiamata per lo stesso evento.
 Serial.println("Attesa di 30 secondi...");
 delay(30000);
 }
}

Come funziona il programma

1. Inizializzazione della GSM Shield

Nel setup() Arduino richiama gsmAccess.begin(). Se la shield non è pronta, il programma riprova ogni secondo finché non ottiene lo stato GSM_READY.

2. Lettura del PIR

Il sensore viene letto con digitalRead(4). Poiché il modello usa una logica attiva-bassa, la condizione di allarme è statoPir == LOW.

3. Avvio della chiamata

Quando viene rilevato movimento, vcs.voiceCall(charBuffer) prova a iniziare la chiamata verso il numero configurato.

4. Attesa della fine

Lo sketch controlla lo stato della chiamata con getvoiceCallStatus() e successivamente esegue hangCall().

5. Pausa anti-ripetizione

Dopo l’evento viene applicato un delay(30000), cioè 30 secondi. È una soluzione semplice per evitare una raffica di chiamate se il PIR resta in allarme.

Attivo LOW: cosa significa?

Uscita PIRInterpretazione nello sketch
HIGHNessun movimento rilevato
LOWMovimento rilevato → avvio chiamata
Concetto chiave: l’espressione if (!statePir) significa “se statePir è falso/LOW”. Nella versione commentata usiamo statoPir == LOW perché è più immediata da leggere per chi sta imparando.

Perché c’è una pausa iniziale di 10 secondi?

Dopo aver inizializzato la shield, il programma aspetta 10 secondi prima di entrare nel funzionamento normale. Questo crea un margine di stabilizzazione prima di iniziare a reagire agli eventi del PIR.

Risultato del progetto

Arduino GSM Shield 2 con PIR progetto completo

Scarica lo sketch

⬇️ Scarica GSM Shield 2 + PIR

Debug rapido

  • verifica alimentazione e piedinatura del PIR utilizzato;
  • controlla che l’uscita di allarme sia realmente collegata a D4;
  • osserva sul Monitor Seriale se il PIR passa da HIGH a LOW durante il movimento;
  • controlla che la SIM sia correttamente inserita nella shield;
  • verifica che il numero telefonico sia stato sostituito nel codice locale;
  • se compare continuamente “GSM non connesso”, il problema è nella fase di inizializzazione della shield/rete;
  • se il PIR funziona ma non parte la chiamata, verifica separatamente il funzionamento di voiceCall().

Miglioramenti possibili

  • aggiungere un LED che indica lo stato armato/allarme;
  • aggiungere un pulsante di attivazione e disattivazione;
  • inviare anche un SMS oltre alla chiamata;
  • evitare delay(30000) usando millis();
  • registrare il numero di eventi rilevati;
  • aggiungere più sensori PIR in stanze diverse.

Una variante senza delay da 30 secondi

In un progetto più evoluto è preferibile usare un tempo di blocco basato su millis(), così Arduino può continuare a svolgere altre attività mentre attende il prossimo evento valido.

Idea di cooldown non bloccante
// 30 secondi tra due notifiche
const unsigned long cooldown = 30000;

unsigned long ultimaChiamata = 0;

void loop() {

 int statoPir = digitalRead(pirPin);

 bool movimento = (statoPir == LOW);

 bool cooldownTerminato =
 (millis() - ultimaChiamata >= cooldown);

 if (movimento && cooldownTerminato) {

 // Qui avvieresti la chiamata GSM

 ultimaChiamata = millis();
 }

 // Il resto del programma può continuare
 // a funzionare senza delay(30000).
}

Cosa devi ricordare

  • Il PIR è collegato al pin D4.
  • Il sensore usato nella pagina genera un allarme LOW.
  • La GSM Shield viene inizializzata tramite GSM.h.
  • GSMVoiceCall gestisce la chiamata.
  • Il numero telefonico deve essere sostituito solo nella copia locale dello sketch.
  • Il programma aspetta 30 secondi dopo ogni rilevamento per limitare le chiamate ripetute.

Domande frequenti

Perché il codice usa if (!statePir)?

Perché il PIR del progetto è attivo LOW. L’operatore ! rende vera la condizione quando l’ingresso vale LOW.

Posso usare un PIR alimentato a 5 V?

Dipende dal modello. Questo progetto usa un sensore alimentato tra 7 e 12 V. Controlla la documentazione del tuo PIR e non applicare automaticamente quei valori a moduli diversi.

Perché la chiamata non parte subito dopo l’accensione?

Lo sketch attende prima che la GSM Shield sia pronta e poi applica altri 10 secondi di attesa iniziale.

Posso inviare un SMS invece di chiamare?

Sì, modificando il progetto e utilizzando le funzioni della libreria GSM dedicate agli SMS. Questa pagina mantiene però il funzionamento basato sulla chiamata vocale.