Introduzione
Confessiamo che non è la prima volta che progettiamo un dispositivo che integra questo modulo di comunicazione GSM. Tuttavia, in passato, ci siamo sempre arenati senza riuscire a farlo funzionare.
Stavolta abbiamo passato molte ore a studiare e a fare prove, fino a quando non abbiamo finalmente ottenuto il risultato sperato. Dalla lettura dei forum abbiamo notato che non poche persone hanno avuto i nostri stessi problemi. Ecco perché abbiamo deciso di raccogliere tutto quello che abbiamo imparato in questa guida.
Speriamo che aiuti molti maker appassionati di elettronica a risolvere gli stessi problemi e a realizzare i loro progetti.
Cosa fa il modulo SIM800L
Prima di entrare nel dettaglio hardware, riassumiamo cosa permette di fare concretamente questo modulo, così da capire dove si colloca nel vostro progetto:
- comunica in rete GSM/GPRS (chiamate voce, SMS, dati) tramite una normale SIM card;
- dialoga con un microcontrollore — in questo caso un Arduino UNO — via seriale, con un semplice set di comandi AT testuali;
- entra in una modalità a basso consumo (sleep) e ne esce su comando, utile nei progetti alimentati a batteria;
- segnala con un LED integrato lo stato della connessione alla rete, senza bisogno di leggere la seriale.
Nei paragrafi seguenti vediamo come cablarlo, alimentarlo correttamente — il punto dove ci si arena quasi sempre, noi compresi la prima volta — e come dialogarci via comandi AT.
L’hardware necessario
| # | Componente | Specifiche | Qtà | Note | Link |
|---|---|---|---|---|---|
| 1 | Scheda di controllo | Arduino UNO R3 (o clone con interfaccia CH340) | 1 | Gestisce l’interfaccia con il PC e il dialogo seriale col modulo | Link Amazon Marketplace |
| 2 | Step-down DC-DC | Con integrato LM2596, uscita regolabile | 1 | Indispensabile per alimentare correttamente il SIM800L — vedi sezione “Alimentazione” | Link Amazon Marketplace |
| 3 | Modulo GSM | SIM800L | 1 | Link Amazon Marketplace | |
| 4 | SIM card | Attiva, dati e/o SMS a seconda dell’uso | 1 | Verificatene il funzionamento in un telefono prima di montarla nel circuito | Link Amazon Marketplace |
| 5 | Resistenza | 10 kΩ | 1 | Partitore di tensione per il livello logico del pin Rx | |
| 6 | Resistenza | 20 kΩ | 1 | Partitore di tensione per il livello logico del pin Rx (vedi nota sotto) | |
| 7 | Basetta millefori | — | 1 | Usata per il modulo di alimentazione permanente | Link Amazon Marketplace |
| 8 | Cavetteria/jumper | — | q.b. |
In qualità di Affiliati Amazon riceviamo un guadagno dagli acquisti idonei.
Nota sui condensatori: nella foto della nostra scheda di alimentazione (più avanti) si vedono alcuni condensatori. Non sono collegati al circuito: sono un residuo del riutilizzo di una vecchia basetta e non sono necessari al funzionamento del modulo. Li lasciamo visibili in foto solo per trasparenza — potete ignorarli.
Nota sulla resistenza da 20 kΩ: in una versione precedente di questo articolo questo valore era riportato in due punti diversi (20 kΩ e 22 kΩ). Il valore corretto, coerente con lo schema di riferimento citato più avanti, è 20 kΩ.

Quanto consuma il modulo
Iniziamo con una tabella che riporta l’assorbimento (in mA e A) del modulo per ogni specifica modalità di funzionamento:
| Modalità | Frequenza | Assorbimento |
|---|---|---|
| Power down | 60 µA | |
| Sleep mode | 1 mA | |
| Stand by | 18 mA | |
| Chiamata | GSM850 | 199 mA |
| Chiamata | EGSM900 | 216 mA |
| Chiamata | DCS1800 | 146 mA |
| Chiamata | PCS1900 | 131 mA |
| GPRS | 453 mA | |
| Burst di trasmissione | 2 A |
Tabella degli assorbimenti per modalità di funzionamento (fonte: datasheet SIM800L).
Alimentazione: il punto dove ci si arena quasi sempre
L’intervallo di tensione per l’alimentazione di questo modulo va dai 3,4V ai 4,4V circa. Nel nostro primo progetto con questo modulo (l’allarme GSM per batteria scarica) avevamo pensato di alimentarlo con un semplice partitore di tensione in uscita da un integrato LM7805.
Guardando la tabella dei consumi qui sopra, però, appare evidente che — contrariamente a quanto pensavamo, e a quanto avevamo letto in qualche articolo in rete — non è assolutamente possibile alimentare il modulo in questo modo. Tanto meno utilizzando direttamente la porta 5V di Arduino: nei picchi di trasmissione il modulo può assorbire fino a 2A, molto più di quanto la porta 5V di Arduino sia in grado di erogare.
In rete abbiamo visto alcuni “colleghi” che hanno utilizzato una batteria LiPo da 3,7V. Sarebbe stato effettivamente possibile, ma per un’applicazione permanentemente connessa avremmo dovuto sviluppare anche la gestione della carica della batteria, magari con un BMS dedicato per batterie LiPo.
Abbiamo preferito la soluzione dello step-down DC-DC, che si presta bene sia al banco prova che al progetto originario da cui nasce l’esigenza di questo modulo. Visto che torna utile spesso, ci siamo costruiti (su una basetta millefori) un mini modulo di alimentazione permanente, composto da un banale LM7805 — che, ricordiamo, è uno step-down DC-DC con uscita fissa a 5V — per alimentare qualunque scheda Arduino, e uno step-down DC-DC con uscita regolabile (nel nostro caso impostata a 4,2V) per il SIM800L.

In buona sostanza, è la realizzazione di questo schema, che abbiamo trovato in questo articolo: lastminuteengineers.com/sim800l-gsm-module-arduino-tutorial
Pin del modulo utilizzati in questo progetto
Non è il pinout completo del SIM800L — per quello fate riferimento al datasheet ufficiale, linkato più avanti — ma solo i pin che colleghiamo in questo specifico progetto:
| Pin SIM800L | Collegato a | Funzione in questo progetto |
|---|---|---|
| VCC | Uscita dello step-down DC-DC (~3,8-4,2V) | Alimentazione — mai al 5V diretto di Arduino |
| GND | GND comune con Arduino e alimentatore | Massa |
| TX | Pin digitale D6 di Arduino (SIM_TX_PIN) | Trasmissione dati dal modulo verso Arduino |
| RX | Pin digitale D5 di Arduino (SIM_RX_PIN), tramite partitore 10 kΩ/20 kΩ | Ricezione dati da Arduino — richiede l’adattamento di livello logico 5V→3,3V |
| DTR | Pin digitale di Arduino, impostato HIGH | Controllo sleep/wake-up del modulo (vedi sezione dedicata) |
Connessione seriale con Arduino


Una piccola nota sulla scheda Elegoo UNO R3, clone della Arduino UNO R3 originale: monta lo stesso integrato ATMEGA328P dell’originale, ma il convertitore USB-Seriale utilizza il chip CH340G, i cui driver non sono compresi nell’installazione standard dell’IDE Arduino. Vanno quindi installati separatamente — trovate istruzioni e link in questo articolo: makerslab.it/installare-i-driver-per-il-modulo-ftdi-ch340g-per-i-cloni-di-arduino
Livelli logici: perché serve un partitore di tensione
A questo punto apriamo un inciso sui livelli logici, che non sono gli stessi tra la scheda di controllo e il nostro modulo SIM800L.
Non possiamo collegare il pin Rx del modulo direttamente al pin digitale di Arduino, perché Arduino UNO lavora a livello logico 5V mentre il modulo SIM800L lavora a livello logico 3,3V.
Per abbassare il segnale da 5V a 3,3V usiamo il nostro (ormai caro e inseparabile) partitore di tensione: una resistenza da 10 kΩ tra il pin Rx di SIM800L e il pin digitale di Arduino, e una da 20 kΩ tra il pin Rx e GND di SIM800L. Esistono anche dei convertitori di livello logico 5V-3,3V dedicati, li trovate linkati nella sezione componenti.
Lo sketch per dialogare con il modulo
Prima di vedere come inviare un SMS o leggere lo stato del modulo, dobbiamo caricare uno sketch che ci permetta di colloquiare con il SIM800L e fare i nostri esperimenti.
Abbiamo utilizzato un semplice sketch che invia al modulo GSM quello che scriviamo sul monitor seriale, e visualizza sul monitor seriale quello che il modulo GSM invia alla scheda.
Configurazione e inizializzazione
//Includiamo la libreria per la comunicazione seriale tra l'Arduino e il SIM800L
#include "SoftwareSerial.h"
//Definiamo il pin dell'Arduino a cui è collegato il pin TX del Sim800L, in questo caso D6
#define SIM_TX_PIN 6
//Definiamo il pin dell'Arduino a cui è collegato il pin RX del Sim800L, in questo caso D5 (occhio al partitore!)
#define SIM_RX_PIN 5
//Definiamo una seriale software sui TX e RX del SIM800L
SoftwareSerial serialSIM800(SIM_TX_PIN, SIM_RX_PIN);
void setup() {
//Inizializziamo la seriale tra Arduino e il PC
Serial.begin(57600);
//Inizializziamo la seriale virtuale lato SIM800L
serialSIM800.begin(57600);
delay(500);
}
(Corretto rispetto alla versione precedente: il commento sopra SIM_RX_PIN riportava ancora “pin TX” per un evidente copia-incolla.)
Loop di dialogo bidirezionale
void loop() {
//Scrivi sulla seriale Arduino-PC quello che leggi dal pin TX del SIM800L
if (serialSIM800.available()) {
Serial.write(serialSIM800.read());
}
// TODO AUTORE: qui va il blocco simmetrico che inoltra al SIM800L quanto
// digitato sul monitor seriale (nel PDF di origine era coperto dalla
// barra di navigazione del sito). Presumibilmente:
// if (Serial.available()) {
// serialSIM800.write(Serial.read());
// }
}
Indicatori di funzionamento
Ora che lo abbiamo connesso e alimentato possiamo inserire la scheda SIM e verificare il LED di funzionamento:
- 1 lampeggio ogni 1 secondo: modulo attivo ma non ancora registrato sulla rete;
- 1 lampeggio ogni 3 secondi: modulo attivo e correttamente registrato sulla rete.
Per avere maggiori dettagli sul funzionamento dobbiamo inviare qualche comando AT e analizzare le risposte.
Comandi AT principali per verificare i collegamenti
Il manuale completo dei comandi è disponibile nella documentazione (linkata più avanti). Riportiamo qui solo i comandi principali, quelli che ci permettono di verificare che i collegamenti funzionino e che il modulo sia pronto all’uso.
AT — verifica del dialogo seriale
10:40:20.795 -> AT 10:40:20.796 -> OK
Primo comando da lanciare per verificare il dialogo tra Arduino e il SIM800L. Se non ricevete in risposta la stringa “OK”, c’è un problema nei collegamenti tra i pin RX e TX del SIM800L e i pin di Arduino.
AT+CSQ — qualità del segnale
10:40:25.735 -> AT+CSQ 10:40:35.980 -> +CSQ: 16,0
Serve per verificare la qualità del segnale. Il primo numero (16 nel nostro caso) dovrebbe trovarsi tra 2 e 30, che equivale a un segnale tra -110 e -54 dBm.
AT+CCID — lettura della SIM
10:40:35.983 -> AT+CCID 10:40:42.373 -> 8944502206206365147
È l’identificativo della SIM. Lo usiamo per verificare che il modulo legga correttamente i dati della SIM inserita.
AT+CREG — stato di registrazione alla rete
10:40:46.745 -> AT+CREG 10:40:50.949 -> +CREG: 0,5
Verifichiamo se il modulo si è correttamente registrato sulla rete. Nella nostra prova il secondo numero (5) indica “registrato in roaming”: con una SIM che opera come MVNO in appoggio a un altro operatore è un risultato normale. Se invece avete una SIM “diretta” dell’operatore e ottenete comunque 5 invece di 1 (registrato in rete domestica), vale la pena verificarlo con il vostro gestore.
AT+COPS? — operatore di rete
10:40:50.949 -> AT+COPS? 10:40:57.062 -> +COPS: 0,0,"Wind Telecom SpA" 10:40:57.065 -> 10:40:57.065 -> OK
Verifichiamo anche l’operatore a cui siamo connessi, ed effettivamente troviamo conferma di quanto sopra.
Sleep & wake-up
Abbiamo creato due funzioni dedicate, rispettivamente per mandare il modulo in sleep mode e per “svegliarlo”. Il prerequisito è sempre che il pin DTR del SIM800L sia connesso a un pin output di Arduino impostato al valore HIGH.
sim800sleepmode() — mandare il modulo in sleep
void sim800sleepmode(){
serialSIM800.println("AT+CSCLK=2");
}
Per mandarlo in sleep mode è sufficiente un comando AT (AT+CSCLK=2) con pin DTR impostato ad HIGH. Il problema è che, una volta entrato in sleep mode, il modulo chiude le comunicazioni sulla seriale.
sim800wakeup() — risvegliare il modulo
void sim800wakeup(){
digitalWrite(DTR_PIN, LOW);
delay(200);
digitalWrite(DTR_PIN, HIGH);
serialSIM800.println("AT");
serialSIM800.println("AT+CSCLK=0");
}
Per svegliarlo dalla modalità sleep è necessario portare il pin DTR al valore LOW (noi teniamo 200 millisecondi) e, a quel punto, inviare un comando AT qualsiasi. Solo dopo queste operazioni si può inviare il comando AT+CSCLK=0 per ripristinare la normale funzionalità, cioè disabilitare lo sleep controllato da DTR.
(Corretto rispetto alla versione precedente: il testo indicava AT+CSCLK=1, che non corrisponde al codice qui sopra.)
Inviare un SMS
Per inviare un SMS possiamo usare lo sketch di interfaccia seriale, scrivendo i comandi direttamente nel monitor seriale, oppure scrivere uno sketch dedicato che invia l’SMS in autonomia.
Abbiamo utilizzato la prima soluzione per i test. Una volta accertato che tutto funziona correttamente, inseriremo le righe di comando per l’invio del messaggio all’interno del programma di monitoraggio e allarme del livello di carica della batteria della moto, che vedremo in un articolo dedicato.
11:26:23.833 -> at+cmgf=1 11:26:30.783 -> OK 11:26:30.783 -> at+cmgs="+39xxxxxxxxxx" 11:26:46.372 -> > testo di prova 11:26:53.794 -> > 11:27:12.950 -> OK
Domande frequenti
I condensatori mostrati nelle foto sono necessari?
No. Nella foto della nostra scheda di alimentazione si vedono alcuni condensatori, residuo del riutilizzo di una vecchia basetta millefori: non sono collegati al circuito e non servono al funzionamento del modulo.
Il modulo funziona con qualsiasi SIM e operatore?
Nella nostra esperienza e in quella di diversi lettori nei commenti, i risultati variano a seconda della combinazione SIM/operatore/alimentazione. Il fattore che ha causato più problemi in assoluto resta l’alimentazione: senza una sorgente in grado di erogare un paio di ampere a circa 3,8V, il modulo non si registra sulla rete oppure risponde con caratteri incomprensibili sulla seriale.
Posso collegare il SIM800L direttamente a una scheda che lavora nativamente a 3,3V (es. NodeMCU/ESP), senza partitore di tensione?
Il partitore di tensione descritto in questo articolo serve solo ad adattare il livello logico da 5V (Arduino UNO) a 3,3V (SIM800L): con una scheda che lavora già a 3,3V non serve per quel motivo. Questo però non basta a garantire il funzionamento — come sopra, il problema più comune resta l’alimentazione del modulo, non il livello logico.
Posso alimentare il modulo con una batteria LiPo da 3,7V invece dello step-down?
Sì, è una soluzione che abbiamo visto usare da altri maker. Per un dispositivo permanentemente connesso, però, va messa in conto anche la gestione della carica della batteria (ad esempio con un BMS dedicato), che noi abbiamo preferito evitare scegliendo lo step-down DC-DC.
Come faccio a sapere se il modulo si è registrato sulla rete senza usare la seriale?
Guardate il LED di stato sulla scheda: un lampeggio ogni secondo significa che il modulo è attivo ma non ancora registrato sulla rete; un lampeggio ogni 3 secondi significa che si è registrato correttamente.
File del progetto
- Sketch di interfaccia seriale usato per i test: INSERISCI-LINK-REPOSITORY-O-FILE-INO
- Schema elettrico di collegamento: INSERISCI-LINK-SCHEMA-EASYEDA-O-IMMAGINE-AD-ALTA-RISOLUZIONE
Disclaimer
Questo modulo, se alimentato in modo scorretto, può danneggiarsi in modo permanente — nelle nostre prove è successo più di una volta prima di trovare la combinazione di alimentazione giusta. Se il vostro progetto finale prevede di collegarlo in modo permanente a un veicolo o a un impianto elettrico, prestate particolare attenzione ai punti di alimentazione e ai livelli logici descritti sopra.
Questo articolo ha scopo divulgativo e amatoriale: non forniamo alcuna garanzia sulla correttezza di schemi, codice e procedure descritte, e la realizzazione del progetto è a rischio e responsabilità di chi la effettua. Il dispositivo descritto non è uno strumento certificato o omologato. Per i dettagli completi, consultate i nostri Termini e Condizioni di utilizzo.
Documentazione
Fondamentale la consultazione della documentazione relativa al modulo e ai comandi AT che vi condividiamo qui:
- Datasheet SIM800L – file PDF con tutte le specifiche hardware;
- Manuale comandi AT – file PDF con tutti i comandi AT, il linguaggio per poter colloquiare con il modulo.
Unisciti alla nostra community e aiutaci a crescere!
Ti è piaciuto questo articolo? Condividi la tua opinione lasciando un commento! Aiutaci a migliorare sempre di più i nostri contenuti.
Hai un blog o un sito web? Condividi il link nei commenti e visitiamolo insieme. Aiutiamoci a crescere a vicenda!
Hai un’idea in mente ma non sai da dove iniziare? Contattaci!
Sitografia
Per arrivare a far funzionare il modulo abbiamo consultato numerosi siti, ed ecco l’intera sitografia:
- makerslab.it – driver per il CH340G
- treccarichi.net – nei commenti viene evidenziato il problema relativo all’alimentazione, che noi stessi abbiamo verificato in modo sperimentale con il prototipo;
- electroyou.it – discussione molto interessante;
- lastminuteengineers.com – uno degli articoli più interessanti e forse fatti meglio;
- iemma.it – fondamentale per la questione del partitore per l’adattamento dei livelli logici tra Arduino e SIM800L;
- pijaeducation.com
- andino.systems
- raviyp.com – articolo molto interessante per gestire lo sleep-mode e soprattutto la funzione di wake-up da software.
12 Comments
Lorenzo · 05/09/2025 at 07:34
Scusate ma i condensatori che valori devono avere?
Non ci sono nella lista
Alessandro · 07/09/2026 at 23:44
Ciao Lorenzo. Abbiamo aggiornato l’articolo e integrato la risposta al tuo commento. I condensatori sono un residuo di test. Non sono collegati e non servono
Lorenzo · 05/09/2025 at 07:34
Scusate ma i condensatori che valori devono avere?
Non ci sono nella lista
Alessandro · 05/09/2025 at 08:42
Ciao Lorenzo. I condensatori che vedi in foto non sono collegati. Ho riutilizzato una vecchia scheda forata che li aveva. Se vedi lo schema circuitale non ci sono, e non servono.
Grazie per averci scritto.
Cris · 29/08/2025 at 16:12
Tutorial molto interessante. Ho provato a usarlo tramite un NodeMCU dal momento che mi pare lavori nativamente con la tensione di 3.3 V, in questo modo mi sono evitato riduttori vari. Il modulo risponde, purtroppo con ben 2 sim provate non prende la linea. Inserendo una sim ho. mobile addirittura smette di rispondere ai comandi AT.
Ho provato anche un modulo simile, SIM900A il quale risponde solo con caratteri incomprensibili, e leggo sui forum che capita a un sacco di gente.
L’impressione è che per vedere funzionare questi moduletti occorra azzeccare la combo tipo di arduino/sim/operatore, oltre che stare molto attenti alle tensioni e che se varia un solo fattore non si conclude nulla.
Grazie comunque per l’aiuto!
Alessandro · 29/08/2025 at 22:19
Ciao Cris, grazie per il tuo contributo. Non ho ben chiaro il tuo circuito ma il problema potrebbe essere l’alimentazione. Io ho lavorato molto e fatto numerose prove (e bruciato diverse schede) prima di far funzionare il modulo e posso dirti che il problema è sempre stato quello dell’alimentazione del modulo. Senza una sorgente in grado di dare un paio di ampere a circa 3.8V non funziona, o funziona male (messaggi incomprensibili sulla porta seriale). Con i 3.3V di una scheda (arduino o nodeMCU che sia) non prende la linea.
giuseppe · 18/11/2024 at 19:27
ciao il modulo SIM800L funziona con tutte le sim
Alessandro · 20/11/2024 at 11:33
Ciao Giuseppe e grazie per il tuo contributo. Se sei interessato ad altri contenuti come questo faccelo sapere. Il vostro feedback è fondamentale per pubblicare contenuti utili e di qualità.
GIUSEPPE · 18/11/2024 at 19:24
Ciao mario , questo modulo sim800L funziona con le sim 4 e 5, grazie
Mario · 17/06/2024 at 12:10
Complimenti molto chiaro e interessante
Margherita e Alessandro · 26/08/2024 at 08:37
Grazie Mario. Cerchiamo sempre di condividere informazioni in modo fruibile ai nostri lettori. Non esitare a contattarci per qualsiasi informazione e/o approfondimento.
Come monitorare blackout della rete elettrica da remoto con Arduino e un SIM800L - officinasottocasa · 11/11/2024 at 10:53
[…] In questo articolo usiamo il nostro caro circuito SIM800L. Non ci dilungheremo sul suo funzionamento perché abbiamo già detto tutto in questo articolo: Guida completa modulo GSM SIM800L […]