Panduan SIM800L Arduino: Kirim SMS, Kendalikan Relay, dan Melakukan Panggilan
Cara memakai modul GSM SIM800L dengan Arduino: catu daya 4 V/2 A, kode kedip LED, perintah AT, kirim SMS, kendali relay lewat SMS, panggilan, serta kode ESP32 dan Pico.
Modul GSM SIM800L adalah modem 2G mungil yang sangat murah, kira-kira sebesar perangko, yang memberi proyek Arduino-mu saluran teleponnya sendiri. Dengan kartu micro SIM di dalamnya, kamu bisa mengirim dan menerima SMS, melakukan panggilan telepon, dan mengirim data kecil ke internet lewat GPRS. Di tempat yang tidak terjangkau Wi-Fi dan Bluetooth, seperti pondok, rumah kaca, gudang, atau kendaraan, memasangkan SIM800L dengan Arduino adalah cara paling sederhana untuk mengendalikan perangkat dari jauh, dari mana saja yang ada sinyal seluler. Modul ini berkomunikasi dengan Arduino lewat koneksi serial dua kabel (UART) dan dikendalikan dengan perintah teks pendek yang disebut perintah AT.
Meski begitu, SIM800L termasuk modul yang paling sering bikin pemula kesulitan, dan hampir semua masalahnya berasal dari dua hal: catu daya yang tidak memadai dan jangkauan 2G. Di panduan ini kamu akan mempelajari cara memberi daya modul dengan benar sesuai rentang 3,4–4,4 V dan arus puncak 2 A, arti kecepatan kedip LED onboard, cara mengujinya langkah demi langkah dengan perintah AT, serta cara mengirim SMS dengan Arduino Uno, menyalakan dan mematikan relay lewat SMS, dan membuat rangkaian yang meneleponmu ketika alarm berbunyi. Setelah itu kamu akan melakukan hal yang sama dengan ESP32, board siap pakai TTGO T-Call, dan Raspberry Pi Pico, dan di bagian akhir kamu akan menemukan solusi masalah registrasi jaringan dalam sebuah tabel.

Apa itu SIM800L dan bagaimana cara kerjanya?
SIM800L adalah modul GSM/GPRS buatan SIMCom yang berukuran hanya 17,8 × 15,8 mm. Board merah yang kamu beli adalah breakout kecil yang menambahkan slot SIM, sambungan antena, LED status, dan pin header di sekelilingnya. Modul ini otomatis memindai keempat band GSM (850, 900, 1800, dan 1900 MHz), mendaftar ke jaringan persis seperti ponsel, lalu menjalankan perintah yang diterimanya lewat port serial: “kirim pesan ini ke nomor ini”, “telepon nomor ini”, “teruskan pesan masuk ke aku”, dan seterusnya. Anggap saja ia ponsel tanpa layar dan tanpa keypad; Arduino mengerjakan tugas keduanya. Hubungkan mikrofon dan speaker ke pin MIC dan SPK, dan kamu bahkan bisa melakukan panggilan suara sungguhan.
| Fitur | Nilai |
|---|---|
| Modul | SIMCom SIM800L, GSM/GPRS 2G |
| Band frekuensi | Quad-band: GSM 850, EGSM 900, DCS 1800, PCS 1900 MHz |
| Tegangan catu daya | 3,4–4,4 V (disarankan 4,0 V) |
| Arus puncak | Sampai 2 A (pulsa singkat ketika memancar) |
| Arus rata-rata | Power down ~0,1 mA, sleep ~1–2 mA, idle ~15 mA, panggilan suara 130–220 mA, GPRS 150–450 mA (tergantung band dan revisi datasheet) |
| Daya pancar | 2 W (850/900 MHz), 1 W (1800/1900 MHz) |
| Antarmuka | UART dan perintah AT; autobauding 1200–115200 |
| Level logika | Output 2,8 V; input RXD maks. 3,1 V |
| Kartu SIM | Micro SIM (kartu 1,8 V dan 3 V) |
| Kecepatan GPRS | Sampai 85,6 kbps |
| Suhu operasi | -40 sampai +85 °C |
Pinout SIM800L
| Pin | Fungsi | Catatan |
|---|---|---|
| NET | Sambungan antena | Antena pegas disolder di sini; kalau ada soket u.FL (IPEX), pasang antena eksternal |
| VCC | Catu daya (+) | 3,4–4,4 V; jangan pernah hubungkan ke pin 5V atau 3.3V Arduino |
| RST | Reset hardware | Menarik LOW minimal 105 ms me-restart modul; boleh tidak dihubungkan |
| RXD | Input serial modul | Ke pin TX board; maks. 3,1 V |
| TXD | Output serial modul | Ke pin RX board; level 2,8 V |
| GND | Ground | Ke catu daya dan ke Arduino sekaligus (ground bersama) |
| RING | Indikator panggilan / SMS | Menjadi LOW ketika ada panggilan masuk dan memberi pulsa LOW 120 ms ketika SMS tiba |
| DTR | Kendali sleep | Dengan AT+CSCLK=1, modul tidur selama DTR HIGH dan bangun ketika ditarik LOW |
| MIC+ / MIC− | Input mikrofon | Untuk mikrofon electret |
| SPK+ / SPK− | Output speaker | Bisa dihubungkan ke speaker kecil 8 Ω |
Antena pegas spiral yang ada di dalam kantong disolder ke lubang NET di pojok board; beberapa board juga punya soket u.FL (IPEX) kecil untuk antena eksternal. Tanpa antena, modul tidak bisa menemukan jaringan dan kekuatan sinyalnya terbaca mendekati nol; kalau penerimaan sinyal lemah di dalam ruangan, antena GSM tempel berkabel memberi perbedaan nyata dibanding antena pegas. Kartu micro SIM masuk ke slot di bagian belakang, dengan sudut terpotongnya sesuai gambar di dudukan. Sebelum memasang kartu, matikan permintaan PIN di ponsel dan pastikan nomornya bisa mengirim SMS, melakukan panggilan, dan pulsanya cukup.
Catu daya: 3,4–4,4 V dan arus puncak 2 A
Daya adalah bagian paling kritis dari SIM800L dan bagian yang paling sering salah. GSM bekerja dengan pembagian waktu: di setiap frame 4,615 ms, modul hanya memancar selama time slot miliknya sendiri yang 577 µs. Di momen-momen singkat ini ia menarik sampai 2 A, lalu langsung turun lagi ke beberapa puluh miliampere. Kalau catu daya tidak bisa memberikan arus mendadak ini, tegangannya anjlok. Menurut datasheet SIMCom, ketika tegangan turun ke 3,5 V modul mencetak UNDER-VOLTAGE WARNNING di port serial, dan di bawah 3,4 V ia mencetak UNDER-VOLTAGE POWER DOWN lalu mematikan dirinya sendiri (salah ketik WARNNING berasal dari firmware pabrikan). Di batas atas kamu mendapat OVER-VOLTAGE WARNNING di 4,3 V, dan di atas 4,4 V modul kembali mati. Pada beberapa versi firmware, pematian otomatis ini nonaktif secara default dan diaktifkan dengan AT+CBATCHK=1; meski begitu, di luar batas ini modul jadi tidak stabil dan terus restart. Karena itu pin 5V Arduino terlalu tinggi untuk SIM800L. Pin 3.3V berada di bawah batas minimum dan secara resmi hanya kuat 50 mA; ditambah lagi, port USB komputer tidak memberikan lebih dari 500 mA.
| Pilihan catu daya | Cocok? | Detail |
|---|---|---|
| Baterai LiPo 3,7 V satu sel atau Li-ion 18650 | Ya, pilihan paling mudah | Sel penuh bertegangan 4,2 V; modul bekerja nyaman sampai sel turun ke 3,6–3,7 V, di bawah itu bisa mati ketika semburan pancar. Pilih minimal 1000 mAh yang sanggup memberi 2 A dan isi ulang dengan TP4056 |
| Modul step-down (buck) LM2596 | Ya, untuk proyek yang memakai adaptor | Setel ke 4,0–4,1 V dari adaptor 7–12 V; memberikan sampai 3 A |
| Board SIM800L dengan input 5 V (mis. “SIM800L V2”) | Ya, sesuai petunjuk board-nya | Rangkaian di board menurunkan tegangannya; kamu tetap butuh catu daya 5 V yang sanggup memberi 2 A |
| Pin 5V Arduino | Tidak | Melebihi batas 4,4 V, modul mati atau rusak; USB tidak sanggup memberi 2 A |
| Pin 3.3V Arduino | Tidak | Di bawah 3,4 V dan arusnya jauh terlalu kecil; modul tidak mau menyala atau terus restart |
| Regulator 3,3 V seperti AMS1117 | Tidak | Output 3,3 V berada di bawah batas minimum modul |



Apa arti LED-nya? Penjelasan kode kedip
| Perilaku LED | Arti | Yang harus dilakukan |
|---|---|---|
| Mati | Modul tidak berjalan | Cek catu daya dan polaritas VCC–GND, ukur tegangannya |
| Sekitar sekali per detik (nyala 64 ms, mati 800 ms) | Berjalan tapi belum terdaftar di jaringan | Normal di 10–60 detik pertama; kalau lebih lama, cek SIM, PIN, antena, dan jangkauan 2G |
| Sekitar sekali tiap 3 detik (nyala 64 ms, mati 3000 ms) | Terdaftar di jaringan | Siap untuk SMS dan panggilan |
| Sangat cepat, sekitar 3 kali per detik (nyala 64 ms, mati 300 ms) | Koneksi data GPRS aktif | Koneksi internet sudah terbentuk |
| Berkedip beberapa kali, padam, lalu mulai lagi | Tegangan anjlok dan modul mati | Pakai catu daya yang lebih kuat, kapasitor besar, dan kabel pendek yang tebal |
Biasakan memakai LED sebagai alat diagnosis: melihat modul berpindah ke kedipan tiap 3 detik sebelum kamu menulis kode apa pun langsung menyingkirkan separuh kemungkinan masalah. Kalau modul terus berkedip sekali per detik selama bermenit-menit, tidak ada gunanya mengutak-atik software; cek dulu bagian registrasi jaringan di bawah. Pulsa arus terbesar muncul pada momen registrasi, ketika modul berbicara dengan BTS untuk pertama kalinya; kalau catu dayanya lemah, modul mati tepat pada momen itu dan siklusnya mulai lagi dari awal.
Pengkabelan SIM800L ke Arduino dan level logika
SIM800L berkomunikasi dengan Arduino lewat UART, dan jalur datanya bersilang: pin TXD modul ke pin RX board, dan pin RXD modul ke pin TX board. Satu-satunya port serial hardware Arduino Uno (D0 dan D1) dipakai untuk meng-upload kode lewat USB dan untuk Serial Monitor, jadi kita hubungkan modul ke D2 dan D3 dengan SoftwareSerial, yang bekerja andal di 9600 baud. Di ESP32 dan Pico kamu tidak butuh port serial software; UART hardware-nya yang dipakai. Dasar-dasar komunikasi serial bisa kamu temukan di panduan komunikasi serial UART kami.
| Pin SIM800L | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | Eksternal 4,0 V (+) | Eksternal 4,0 V (+) | Eksternal 4,0 V (+) |
| GND | GND + catu daya (−) | GND + catu daya (−) | GND + catu daya (−) |
| TXD | D2 (SoftwareSerial RX) | GPIO 16 (RX2) | GP1 (UART0 RX) |
| RXD | D3, lewat pembagi 10 kΩ + 15 kΩ | GPIO 17 (TX2), lewat pembagi 1 kΩ + 5,6 kΩ | GP0 (UART0 TX), lewat pembagi 1 kΩ + 5,6 kΩ |
| RST | Boleh tidak dihubungkan | Boleh tidak dihubungkan | Boleh tidak dihubungkan |
| NET | Antena | Antena | Antena |
Uji pertama dengan perintah AT
- Hubungkan modul seperti di tabel, pasang antena, dan masukkan micro SIM yang permintaan PIN-nya sudah dimatikan.
- Nyalakan dan perhatikan LED-nya: setelah berkedip sekali per detik selama beberapa detik, kedipannya harus berpindah ke sekali tiap 3 detik.
- Upload sketch jembatan di bawah ke Arduino; SoftwareSerial sudah ikut dengan Arduino IDE, jadi tidak perlu library tambahan.
- Buka Serial Monitor, setel kecepatan ke 9600 baud dan akhir baris ke Both NL & CR.
- Ketik AT lalu tekan Enter. Modul menyesuaikan diri dengan kecepatanmu lewat autobauding; percobaan pertama mungkin tidak dibalas, jadi ulangi sampai kamu melihat OK.
- Lalu cek kartu SIM, kekuatan sinyal, dan registrasi jaringan satu per satu dengan perintah di tabel di bawah.
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3); // RX = D2 (SIM800L TXD), TX = D3 (SIM800L RXD, bölücüyle / via divider)
4
5void setup() {
6 Serial.begin(9600); // Seri Monitör hızı / Serial Monitor speed
7 sim800.begin(9600); // SIM800L bu hıza kendini ayarlar / SIM800L autobauds to this rate
8 Serial.println(F("AT yaz ve Enter'a bas / Type AT and press Enter"));
9}
10
11void loop() {
12 if (Serial.available()) sim800.write(Serial.read()); // bilgisayar → modül / PC → module
13 if (sim800.available()) Serial.write(sim800.read()); // modül → bilgisayar / module → PC
14}| Perintah | Contoh balasan | Arti |
|---|---|---|
| AT | OK | Modul berjalan dan baud rate sudah cocok |
| AT+CPIN? | +CPIN: READY | SIM siap; kalau kamu melihat SIM PIN, matikan PIN atau kirim AT+CPIN="1234" |
| AT+CSQ | +CSQ: 18,0 | Kekuatan sinyal dari 0 sampai 31 (99 = tidak diketahui); 10 atau lebih sudah cukup |
| AT+CREG? | +CREG: 0,1 | 1 = terdaftar, 5 = terdaftar (roaming), 2 = mencari, 3 = ditolak |
| AT+COPS? | +COPS: 0,0,"OPERATOR" | Nama operator jaringan |
| AT+CBC | +CBC: 0,82,4012 | Tegangan catu daya dalam milivolt (di sini 4,012 V) |
| AT+GSN | Angka 15 digit | IMEI modul |
| AT+CCID | Angka 19–20 digit | Nomor seri kartu SIM (ICCID); menunjukkan kartunya terbaca |
| AT+CMGF=1 | OK | Mode teks untuk SMS |
| AT+CMGS="+905551112233" | > | Menunggu teks pesan; dikirim dengan Ctrl+Z (26) |
| AT+CNMI=1,2,0,0,0 | OK | Mencetak SMS masuk langsung ke port serial tanpa menyimpannya |
| ATD+905551112233; | OK | Memulai panggilan suara (tanda ; di akhir wajib) |
| ATA / ATH | OK | Menjawab panggilan masuk / menutup telepon |
| AT+CLIP=1 | OK | Menampilkan nomor penelepon di baris +CLIP ketika ada panggilan masuk |
| AT+IPR=9600 | OK | Mengunci kecepatan di 9600 baud alih-alih autobauding; kirim AT&W sesudahnya agar permanen |
| AT+CMEE=2 | OK | Melaporkan error sebagai teks deskriptif, bukan angka |
Angka pertama di balasan AT+CSQ bisa kamu ubah ke dBm: dBm ≈ −113 + 2 × nilai. Misalnya, 18 berarti sekitar −77 dBm, yang cukup bagus; di bawah 10 itu lemah, dan di bawah 5 adalah sinyal yang bahkan untuk SMS pun susah tembus. Balasan 99 berarti modul belum sempat mengukur. Perintah AT+CBC ideal untuk menangkap masalah daya: kalau kamu melihat sekitar 4,0 V ketika modul diam, tetapi modul mati ketika mengirim SMS atau menelepon, masalahnya pasti kapasitas arus catu dayamu. Dalam mode autobaud default, modul tidak mencetak apa pun ketika menyala; kalau kamu mengunci kecepatan dengan AT+IPR=9600 dan menyimpannya dengan AT&W, pengaturannya tersimpan di memori non-volatil dan modul mengumumkan dirinya siap dengan RDY, +CFUN: 1, dan +CPIN: READY setiap kali dinyalakan.
Tidak mau terdaftar di jaringan? Jangkauan 2G, SIM, dan IMEI
SIM800L hanya memakai jaringan 2G (GSM/GPRS); ia tidak mengenal 3G, 4G, atau 5G. 2G mulai hilang di banyak negara: di AS jaringan 2G terakhir dimatikan pada Agustus 2026, Australia dan Swiss sudah mematikan 2G bertahun-tahun lalu, operator Prancis menghentikannya paling lambat akhir 2026, dan di Jerman Telekom menargetkan 2028, sementara Jepang dan Korea Selatan tidak pernah memakai GSM sama sekali. Di Inggris, operator menyatakan 2G akan bertahan lebih lama, dengan pematian akhir paling lambat 2033, dan di Turki penghentiannya direncanakan pada 2029. Di tempat yang tidak ada 2G, SIM800L tidak bisa mendaftar sebaik apa pun catu dayanya; di daerah seperti itu kamu butuh modul 4G LTE seperti SIM7600 atau A7670, atau modul LTE-M/NB-IoT seperti SIM7080G. Ketika mencari penyebab masalah registrasi, ikuti urutan ini:
- Apakah ada 2G di tempatmu? Di pengaturan jaringan seluler ponselmu, setel jenis jaringan pilihan ke 2G saja dan coba menelepon dengan kartu SIM yang sama. Kalau ponsel tidak menemukan jaringan di 2G, SIM800L juga tidak akan menemukannya.
- Apakah kartu SIM terbaca? AT+CCID harus mengembalikan sebuah angka dan AT+CPIN? harus membalas +CPIN: READY. Kalau muncul error, pasang ulang kartunya dengan arah yang benar; kalau kamu memakai nano SIM di adaptor, pastikan adaptornya tidak menekan kontak secara tidak rata.
- Apakah sinyalnya cukup kuat? AT+CSQ minimal harus 10. Solder antenanya atau pasang antena eksternal, lalu pindahkan modul ke dekat jendela.
- Apakah registrasinya ditolak? Kalau AT+CREG? membalas 0,3, jaringan menolak modul: nomornya mungkin tidak aktif atau IMEI perangkatnya diblokir.
- Registrasi IMEI: Beberapa negara memblokir perangkat yang IMEI-nya tidak terdaftar; di Turki, misalnya, perangkat yang dibawa dari luar negeri tanpa registrasi diputus setelah masa tenggang. Baca IMEI modul dengan AT+GSN dan, kalau kamu berada di negara seperti itu, beli dari penjual lokal yang menawarkan modul dengan IMEI terdaftar.
- Apakah catu dayanya memadai? Kalau modul restart tepat pada momen registrasi, masalahnya bukan jaringan, melainkan daya; kembali ke bagian catu daya di atas.
Mengirim SMS dengan Arduino
Untuk mengirim SMS, pertama kamu beralih ke mode teks dengan AT+CMGF=1. Lalu kirim AT+CMGS="+905551112233"; menulis nomor lengkap dengan kode negaranya adalah pilihan paling aman (+90 di contoh adalah kode Turki; pakai +62 untuk Indonesia, +44 untuk Inggris, +1 untuk AS, dan seterusnya). Modul membalas dengan prompt > untuk menunjukkan bahwa ia menunggu teks pesan. Setelah mengetik teksnya, alih-alih Enter kamu mengirim karakter Ctrl+Z (ASCII 26, 0x1A); begitu jaringan menerima pesannya, modul mengembalikan nomor referensi seperti +CMGS: 12 diikuti OK. Konfirmasi ini bisa butuh beberapa detik, atau sampai 60 detik kalau sinyalnya lemah. Sketch di bawah menyinkronkan diri dengan modul, menunggu registrasi jaringan, lalu mengirim satu SMS; isi baris PHONE dengan nomormu sendiri:
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3); // RX = D2 ← SIM TXD, TX = D3 → SIM RXD
4const char PHONE[] = "+905551112233"; // kendi numaran, uluslararası biçimde / your number, international format
5
6// ok gelirse 1, ERROR gelirse -1, süre dolarsa 0 / 1 on ok, -1 on ERROR, 0 on timeout
7int waitReply(const char *ok, unsigned long timeoutMs) {
8 const char *err = "ERROR";
9 byte m1 = 0, m2 = 0;
10 unsigned long start = millis();
11 while (millis() - start < timeoutMs) {
12 if (!sim800.available()) continue;
13 char c = sim800.read();
14 Serial.write(c); // modülün cevabını göster / show the module's reply
15 m1 = (c == ok[m1]) ? m1 + 1 : (c == ok[0] ? 1 : 0);
16 if (ok[m1] == '\0') return 1;
17 m2 = (c == err[m2]) ? m2 + 1 : (c == err[0] ? 1 : 0);
18 if (err[m2] == '\0') return -1;
19 }
20 return 0;
21}
22
23// Şebeke kaydını bekle: +CREG: 0,1 (ev ağı) ya da 0,5 (dolaşım) / wait for registration: home or roaming
24bool waitForNetwork(unsigned long timeoutMs) {
25 unsigned long start = millis();
26 while (millis() - start < timeoutMs) {
27 sim800.println("AT+CREG?");
28 String reply = "";
29 unsigned long t = millis();
30 while (millis() - t < 1000) {
31 while (sim800.available()) reply += (char)sim800.read();
32 }
33 Serial.print(reply);
34 if (reply.indexOf("+CREG: 0,1") >= 0 || reply.indexOf("+CREG: 0,5") >= 0) return true;
35 delay(2000);
36 }
37 return false;
38}
39
40bool sendSms(const char *number, const char *text) {
41 sim800.print("AT+CMGS=\"");
42 sim800.print(number);
43 sim800.print("\"\r");
44 if (waitReply(">", 5000) != 1) return false; // metin istemi gelmedi / no text prompt
45 sim800.print(text);
46 sim800.write(26); // Ctrl+Z (0x1A): mesajı gönder / send the message
47 return waitReply("+CMGS:", 60000) == 1; // ağ onayı 60 sn sürebilir / network ack may take 60 s
48}
49
50void setup() {
51 Serial.begin(9600);
52 sim800.begin(9600);
53 delay(3000); // modül açılsın / let the module boot
54
55 bool alive = false;
56 for (byte i = 0; i < 10 && !alive; i++) { // otomatik baud için birkaç kez AT / several ATs for autobaud
57 sim800.println("AT");
58 alive = (waitReply("OK", 1000) == 1);
59 }
60 if (!alive) {
61 Serial.println(F("\nModul cevap vermiyor / Module not responding"));
62 return;
63 }
64
65 sim800.println("AT+CMGF=1"); // SMS metin modu / SMS text mode
66 waitReply("OK", 1000);
67
68 Serial.println(F("\nSebeke bekleniyor / Waiting for network"));
69 if (!waitForNetwork(60000)) {
70 Serial.println(F("Sebekeye kayit olunamadi / Not registered"));
71 return;
72 }
73
74 if (sendSms(PHONE, "BlueGrays: SIM800L calisiyor!")) Serial.println(F("\nSMS gonderildi / SMS sent"));
75 else Serial.println(F("\nSMS gonderilemedi / SMS failed"));
76}
77
78void loop() {
79 if (sim800.available()) Serial.write(sim800.read()); // sonraki mesajları göster / show later messages
80}Di sketch ini, fungsi waitReply() mencetak setiap karakter dari modul ke Serial Monitor sambil mencari balasan yang diharapkan (OK, > atau +CMGS:) dan kata ERROR, jadi kamu bisa melihat hasil setiap perintah. waitForNetwork() menunggu sampai balasan +CREG menunjukkan 0,1 (jaringan asal) atau 0,5 (roaming), karena SMS yang dikirim sebelum registrasi akan gagal. Dalam mode teks, panjang SMS paling banyak 160 karakter. Karakter yang kamu ketik di Arduino IDE dienkode UTF-8, jadi huruf beraksen dan huruf non-Latin akan tiba dalam keadaan rusak; pakai teks ASCII biasa seperti contoh di kode.
Mengendalikan relay lewat SMS dan membaliknya dengan panggilan
Untuk membaca pesan masuk kita memakai AT+CNMI=1,2,0,0,0: dengan pengaturan ini modul tidak menyimpan SMS baru di kartu SIM, melainkan langsung mencetaknya ke port serial sebagai dua baris. Baris pertama, seperti +CMT: "+905551112233","","26/10/30,14:05:12+12", berisi nomor pengirim dan waktunya (+12 di akhir adalah zona waktu dalam satuan seperempat jam, yaitu UTC+3; untuk WIB, UTC+7, nilainya +28), dan baris kedua berisi pesannya sendiri. Sketch di bawah mengendalikan modul relay di D7 dengan pesan “ROLE AC” (relay nyala), “ROLE KAPA” (relay mati), dan “DURUM” (status), mengirim SMS balasan setelah setiap perintah, dan hanya menerima pesan dari nomormu sendiri; tentu saja kamu bisa mengganti nama perintahnya menjadi ON, OFF, dan STATUS di kode. Selain itu, berkat AT+CLIP=1, ketika kamu menelepon modul dari nomormu, panggilannya ditolak tanpa dijawab dan relay berbalik keadaan; karena panggilan yang tidak dijawab tidak dikenai biaya, inilah saklar jarak jauh paling murah yang ada. Beberapa jaringan meneruskan nomor pengirim dalam format nasional (diawali 0), bukan format internasional; kalau perintahmu diabaikan, lihat baris +CMT di Serial Monitor dan tulis OWNER dengan format yang sama.
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3); // RX = D2 ← SIM TXD, TX = D3 → SIM RXD
4const byte RELAY_PIN = 7; // röle modülü IN / relay module IN
5const bool RELAY_ON = HIGH; // düşük seviyeli modülde LOW yap / set LOW for active-low modules
6const char OWNER[] = "+905551112233"; // komut kabul edilen tek numara / the only accepted number
7
8char line[100]; // gelen satır tamponu / incoming line buffer
9byte lineLen = 0;
10bool bodyNext = false; // sonraki satır SMS metni mi? / is the next line the SMS text?
11bool fromOwner = false;
12bool relayState = false;
13
14int waitReply(const char *ok, unsigned long timeoutMs) {
15 const char *err = "ERROR";
16 byte m1 = 0, m2 = 0;
17 unsigned long start = millis();
18 while (millis() - start < timeoutMs) {
19 if (!sim800.available()) continue;
20 char c = sim800.read();
21 Serial.write(c);
22 m1 = (c == ok[m1]) ? m1 + 1 : (c == ok[0] ? 1 : 0);
23 if (ok[m1] == '\0') return 1;
24 m2 = (c == err[m2]) ? m2 + 1 : (c == err[0] ? 1 : 0);
25 if (err[m2] == '\0') return -1;
26 }
27 return 0;
28}
29
30bool sendSms(const char *number, const char *text) {
31 sim800.print("AT+CMGS=\"");
32 sim800.print(number);
33 sim800.print("\"\r");
34 if (waitReply(">", 5000) != 1) return false;
35 sim800.print(text);
36 sim800.write(26); // Ctrl+Z: gönder / send
37 return waitReply("+CMGS:", 60000) == 1;
38}
39
40void setRelay(bool on) {
41 relayState = on;
42 digitalWrite(RELAY_PIN, on ? RELAY_ON : !RELAY_ON);
43}
44
45void handleCommand(char *text) {
46 for (char *p = text; *p; p++) *p = toupper(*p); // büyük harfe çevir / convert to upper case
47 if (strstr(text, "ROLE AC")) {
48 setRelay(true);
49 sendSms(OWNER, "Role ACILDI / Relay ON");
50 } else if (strstr(text, "ROLE KAPA")) {
51 setRelay(false);
52 sendSms(OWNER, "Role KAPANDI / Relay OFF");
53 } else if (strstr(text, "DURUM")) {
54 sendSms(OWNER, relayState ? "Role ACIK / Relay ON" : "Role KAPALI / Relay OFF");
55 }
56}
57
58void handleLine() {
59 Serial.println(line);
60 if (bodyNext) { // +CMT satırından sonraki satır SMS metnidir / the line after +CMT is the SMS text
61 bodyNext = false;
62 if (fromOwner) handleCommand(line);
63 } else if (strncmp(line, "+CMT:", 5) == 0) {
64 fromOwner = (strstr(line, OWNER) != NULL); // gönderen kontrolü / sender check
65 bodyNext = true;
66 } else if (strncmp(line, "+CLIP:", 6) == 0 && strstr(line, OWNER) != NULL) {
67 sim800.println("ATH"); // aramayı reddet, ücret yazılmaz / reject the call, nothing is charged
68 setRelay(!relayState); // her çağrıda aç-kapa / toggle on every call
69 }
70}
71
72void setup() {
73 pinMode(RELAY_PIN, OUTPUT);
74 setRelay(false);
75 Serial.begin(9600);
76 sim800.begin(9600);
77 delay(3000);
78 for (byte i = 0; i < 10; i++) { // otomatik baud eşleşmesi / autobaud sync
79 sim800.println("AT");
80 if (waitReply("OK", 1000) == 1) break;
81 }
82 const char *initCmds[] = {"ATE0", "AT+CMGF=1", "AT+CNMI=1,2,0,0,0", "AT+CLIP=1"};
83 for (byte i = 0; i < 4; i++) {
84 sim800.println(initCmds[i]); // yankı kapalı, metin modu, SMS'i ilet, arayanı göster / echo off, text mode, push SMS, caller ID
85 waitReply("OK", 1000);
86 }
87 Serial.println(F("\nHazir / Ready"));
88}
89
90void loop() {
91 while (sim800.available()) {
92 char c = sim800.read();
93 if (c == '\r') continue;
94 if (c == '\n') { // satır tamamlandı / line complete
95 line[lineLen] = '\0';
96 if (lineLen > 0) handleLine();
97 lineLen = 0;
98 } else if (lineLen < sizeof(line) - 1) {
99 line[lineLen++] = c;
100 }
101 }
102}| Elemen kode | Fungsinya |
|---|---|
| ATE0 | Mematikan echo, jadi modul tidak lagi mengulang perintah yang kamu kirim; baris yang masuk jadi lebih bersih |
| AT+CNMI=1,2,0,0,0 | Mencetak SMS baru ke port serial sebagai baris +CMT yang langsung diikuti teks pesannya |
| AT+CLIP=1 | Ketika ada panggilan masuk, melaporkan nomor penelepon di baris +CLIP setelah RING |
| strstr(line, OWNER) | Mengecek apakah nomor yang diizinkan muncul di baris itu; perintah dari nomor lain diabaikan |
| toupper() | Mengubah teks menjadi huruf besar agar “role ac” dan “ROLE AC” diperlakukan sama |
| ATH | Mengakhiri panggilan masuk tanpa menjawabnya |
| RELAY_ON | Setel ke LOW untuk modul relay yang aktif di level rendah (active-low) |
Melakukan panggilan dengan SIM800L: biarkan ia meneleponmu ketika alarm berbunyi
Untuk menelepon, tulis nomor dan titik koma setelah perintah ATD: ATD+905551112233;. Titik koma di akhir menandainya sebagai panggilan suara; kalau lupa, modul memulai panggilan data dan panggilan suara tidak terbentuk. Kalau pihak lain menolak panggilan atau percakapan selesai, modul mencetak NO CARRIER atau BUSY; kalau tidak ada yang menjawab, NO ANSWER; dan tanpa jaringan, NO DIALTONE. ATH mengakhiri panggilan kapan saja. Untuk urusan alarm, ponsel yang berdering jauh lebih menarik perhatian daripada SMS. Sketch di bawah mengirim SMS ketika sensor gerak PIR di D4 terpicu, lalu membunyikan ponselmu sampai 20 detik dan menunggu 2 menit di antara dua alarm:
1#include <SoftwareSerial.h>
2
3SoftwareSerial sim800(2, 3); // RX = D2 ← SIM TXD, TX = D3 → SIM RXD
4const byte SENSOR_PIN = 4; // PIR çıkışı / PIR output
5const char OWNER[] = "+905551112233"; // aranacak numara / number to call
6const unsigned long RING_MS = 20000; // en fazla 20 sn çaldır / ring for at most 20 s
7const unsigned long COOLDOWN_MS = 120000; // iki alarm arası 2 dk; açılışta da 2 dk bekler / 2 min between alarms, also after power-up
8unsigned long lastAlarm = 0;
9
10int waitReply(const char *ok, unsigned long timeoutMs) {
11 const char *err = "ERROR";
12 byte m1 = 0, m2 = 0;
13 unsigned long start = millis();
14 while (millis() - start < timeoutMs) {
15 if (!sim800.available()) continue;
16 char c = sim800.read();
17 Serial.write(c);
18 m1 = (c == ok[m1]) ? m1 + 1 : (c == ok[0] ? 1 : 0);
19 if (ok[m1] == '\0') return 1;
20 m2 = (c == err[m2]) ? m2 + 1 : (c == err[0] ? 1 : 0);
21 if (err[m2] == '\0') return -1;
22 }
23 return 0;
24}
25
26bool sendSms(const char *number, const char *text) {
27 sim800.print("AT+CMGS=\"");
28 sim800.print(number);
29 sim800.print("\"\r");
30 if (waitReply(">", 5000) != 1) return false;
31 sim800.print(text);
32 sim800.write(26); // Ctrl+Z: gönder / send
33 return waitReply("+CMGS:", 60000) == 1;
34}
35
36void callOwner() {
37 sim800.print("ATD");
38 sim800.print(OWNER);
39 sim800.println(";"); // sondaki ; sesli arama demektir / the trailing ; means a voice call
40 waitReply("NO CARRIER", RING_MS); // açıp kapatırsan erken biter / ends early if you answer and hang up
41 sim800.println("ATH"); // aramayı sonlandır / hang up
42 waitReply("OK", 2000);
43}
44
45void setup() {
46 pinMode(SENSOR_PIN, INPUT);
47 Serial.begin(9600);
48 sim800.begin(9600);
49 delay(3000);
50 for (byte i = 0; i < 10; i++) { // otomatik baud eşleşmesi / autobaud sync
51 sim800.println("AT");
52 if (waitReply("OK", 1000) == 1) break;
53 }
54 sim800.println("AT+CMGF=1"); // SMS metin modu / SMS text mode
55 waitReply("OK", 1000);
56}
57
58void loop() {
59 if (digitalRead(SENSOR_PIN) == HIGH && millis() - lastAlarm > COOLDOWN_MS) {
60 lastAlarm = millis();
61 Serial.println(F("Hareket! / Motion!"));
62 sendSms(OWNER, "ALARM: Hareket algilandi / Motion detected");
63 callOwner();
64 }
65 while (sim800.available()) Serial.write(sim800.read());
66}Sketch ini juga diam selama 2 menit pertama setelah dinyalakan; ini memberi sensor PIR waktu untuk pemanasan dan memberimu waktu untuk keluar rumah. Kalau kamu menjawab panggilannya, sambungan terbentuk; dengan mikrofon electret dan speaker kecil 8 Ω di pin MIC dan SPK SIM800L, kamu bisa berbicara lewat perangkat itu. Untuk menjawab panggilan masuk secara otomatis, cukup kirim ATA ketika kamu melihat baris RING. Selama panggilan, modul menarik rata-rata 130–220 mA dan tetap memuncak di 2 A; kalau catu dayamu sanggup untuk SMS tapi modul mati ketika panggilan, pakai kapasitor yang lebih besar atau catu daya yang lebih kuat.
SIM800L dengan ESP32 dan board TTGO T-Call
Di ESP32 kamu tidak butuh SoftwareSerial; salah satu dari tiga UART hardware-nya bisa ditempatkan di pin mana saja yang kamu mau. Untuk menjalankan sketch Uno di atas di ESP32, hapus baris SoftwareSerial, tulis HardwareSerial sim800(2); sebagai gantinya, dan pakai sim800.begin(9600, SERIAL_8N1, 16, 17); di setup(); sisa kodenya bekerja tanpa perubahan. Karena ESP32 bekerja di 3,3 V, pembagi 1 kΩ + 5,6 kΩ di jalur TX sudah cukup. Kalau kamu memberi daya SIM800L dari catu daya lemah yang sama dengan ESP32, pulsa 2 A ikut menarik turun tegangan ESP32 dan board-nya restart dengan error “Brownout detector was triggered”; beri daya kedua board dari catu daya terpisah dan cukup satukan GND-nya. Error ini kami bahas rinci di panduan brownout ESP32 kami.
Kalau kamu lebih suka melewatkan pengkabelan, board LilyGO TTGO T-Call menggabungkan ESP32 dan modem SIM800 dalam satu board. Isinya modul ESP32-WROVER-B, SIM800L (pada beberapa batch SIM800H dari keluarga yang sama), slot kartu SIM, konektor baterai LiPo, dan chip manajemen daya IP5306 yang mengisi baterai dan memasok arus yang dibutuhkan modem. Modem dinyalakan dan dimatikan oleh GPIO ESP32 tertentu, bukan pin eksternal, jadi sketch SIM800L biasa tidak langsung jalan di T-Call apa adanya.

| Define T-Call | GPIO | Fungsi |
|---|---|---|
| MODEM_PWRKEY | 4 | Menyalakan modem dengan pulsa LOW 1 detik |
| MODEM_RST | 5 | Reset modem; dijaga HIGH |
| MODEM_POWER_ON | 23 | Menyalakan catu daya modem ketika disetel HIGH |
| MODEM_TX | 27 | Dari ESP32 ke input RXD modem |
| MODEM_RX | 26 | Dari output TXD modem ke ESP32 |
| I2C SDA / SCL | 21 / 22 | Chip daya IP5306 (alamat 0x75) |
| LED | 13 | LED pengguna di board |
1#include <Wire.h>
2
3// LilyGO TTGO T-Call SIM800L (IP5306'lı sürüm) pinleri / pins of the IP5306 version
4#define MODEM_PWRKEY 4
5#define MODEM_RST 5
6#define MODEM_POWER_ON 23
7#define MODEM_TX 27 // ESP32 TX → modem RX
8#define MODEM_RX 26 // ESP32 RX ← modem TX
9#define I2C_SDA 21
10#define I2C_SCL 22
11#define IP5306_ADDR 0x75 // güç yönetim yongası / power management chip
12
13HardwareSerial &modem = Serial1;
14const char OWNER[] = "+905551112233";
15
16// Pille çalışırken IP5306 kendini kapatmasın / keep the IP5306 boost on when running from battery
17bool setPowerBoostKeepOn() {
18 Wire.beginTransmission(IP5306_ADDR);
19 Wire.write(0x00); // SYS_CTL0 yazmacı / SYS_CTL0 register
20 Wire.write(0x37); // boost keep-on biti açık / boost keep-on bit set
21 return Wire.endTransmission() == 0;
22}
23
24// token gelirse true; ERROR ya da süre dolarsa false / true on token, false on ERROR or timeout
25bool waitFor(const char *token, unsigned long timeoutMs) {
26 String reply = "";
27 unsigned long start = millis();
28 while (millis() - start < timeoutMs) {
29 while (modem.available()) reply += (char)modem.read();
30 if (reply.indexOf(token) >= 0) break;
31 if (reply.indexOf("ERROR") >= 0) break;
32 }
33 Serial.print(reply);
34 return reply.indexOf(token) >= 0;
35}
36
37bool at(const char *cmd) {
38 modem.println(cmd);
39 return waitFor("OK", 2000);
40}
41
42bool registered() {
43 modem.println("AT+CREG?");
44 return waitFor("+CREG: 0,1", 1000); // ev şebekesine kayıtlı / registered on the home network
45}
46
47bool sendSms(const char *number, const char *text) {
48 modem.printf("AT+CMGS=\"%s\"\r", number);
49 if (!waitFor(">", 5000)) return false;
50 modem.print(text);
51 modem.write(26); // Ctrl+Z: gönder / send
52 return waitFor("+CMGS:", 60000);
53}
54
55void setup() {
56 Serial.begin(115200);
57 Wire.begin(I2C_SDA, I2C_SCL);
58 Serial.println(setPowerBoostKeepOn() ? "IP5306 OK" : "IP5306 yok / not found");
59
60 pinMode(MODEM_RST, OUTPUT);
61 pinMode(MODEM_PWRKEY, OUTPUT);
62 pinMode(MODEM_POWER_ON, OUTPUT);
63 digitalWrite(MODEM_RST, HIGH); // reset bırakılmış / reset released
64 digitalWrite(MODEM_POWER_ON, HIGH); // modemin beslemesini aç / switch on the modem supply
65 digitalWrite(MODEM_PWRKEY, HIGH);
66 delay(100);
67 digitalWrite(MODEM_PWRKEY, LOW); // PWRKEY 1 sn düşük: modem açılır / PWRKEY low for 1 s: modem starts
68 delay(1000);
69 digitalWrite(MODEM_PWRKEY, HIGH);
70
71 modem.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
72 delay(3000);
73
74 for (int i = 0; i < 10 && !at("AT"); i++) delay(500); // otomatik baud / autobaud
75 at("AT+CMGF=1"); // SMS metin modu / SMS text mode
76 at("AT+CNMI=1,2,0,0,0"); // gelen SMS'i seri porta ver / push incoming SMS to the UART
77
78 unsigned long start = millis();
79 while (!registered() && millis() - start < 60000) delay(2000);
80
81 if (sendSms(OWNER, "TTGO T-Call hazir / ready")) Serial.println("\nSMS gonderildi / sent");
82}
83
84void loop() {
85 while (modem.available()) Serial.write(modem.read()); // gelen SMS ve aramalar / incoming SMS and calls
86 while (Serial.available()) modem.write(Serial.read()); // Seri Monitör'den AT komutu / AT commands from the monitor
87}Pin-pin ini untuk versi T-Call SIM800L buatan LilyGO yang memakai IP5306. Pada versi dengan chip daya AXP192, chip dayanya diatur dengan kode yang berbeda, dan pada versi SIM800C pin daya modemnya adalah GPIO 25; cek tanggal versi yang tercetak di board-mu dan tabel pin dari pabrikan. Fungsi setPowerBoostKeepOn() menulis 0x37 ke register 0x00 milik IP5306, yang mencegah chip itu mematikan dirinya sendiri ketika bebannya rendah selama berjalan dari baterai. Kalau modem mati pada momen registrasi ketika board hanya diberi daya dari USB komputermu, hubungkan juga baterai LiPo; baterainya yang menutup pulsa 2 A. Pada ESP32-WROVER, GPIO 16 dan 17 dipakai untuk PSRAM internal, karena itu modem disambungkan ke 26 dan 27. Untuk tugas GPRS seperti request HTTP atau MQTT, library TinyGSM mendukung board ini dengan define TINY_GSM_MODEM_SIM800.
SIM800L dengan Raspberry Pi Pico dan MicroPython
Di Raspberry Pi Pico kita hubungkan modul ke UART0: TXD SIM800L ke GP1, RXD-nya ke GP0 lewat pembagi 1 kΩ + 5,6 kΩ, dan GND-nya disatukan. Pin VBUS dan 3V3 Pico tidak bisa memberi daya SIM800L, jadi di sini pun beri daya modul dari catu daya eksternal 4 V. Kode MicroPython di bawah melakukan tugas yang sama dengan contoh relay Arduino: menyalakan dan mematikan relay di GP15 lewat SMS dan mengirim balasan. Fungsi to_text() membuang byte yang rusak karena noise dan hanya menyimpan karakter ASCII, jadi error dekode tidak bisa menghentikan program. Tidak perlu library tambahan; kalau kamu belum tahu cara menjalankannya dengan Thonny, baca dulu panduan dasar-dasar MicroPython kami.
1from machine import UART, Pin
2import time
3
4# GP0 (TX) → SIM RXD (1k + 5,6k bölücü / divider), GP1 (RX) ← SIM TXD
5sim = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1), timeout=100, timeout_char=50)
6relay = Pin(15, Pin.OUT, value=0) # röle modülü IN / relay module IN
7OWNER = "+905551112233" # yetkili numara / authorised number
8
9def to_text(raw):
10 # yalnız ASCII karakterleri al / keep ASCII characters only
11 return "".join(chr(b) for b in raw if 9 < b < 128)
12
13def wait_for(token, timeout_ms):
14 # token ya da ERROR gelene kadar oku / read until token or ERROR
15 buf = ""
16 t0 = time.ticks_ms()
17 while time.ticks_diff(time.ticks_ms(), t0) < timeout_ms:
18 if sim.any():
19 buf += to_text(sim.read())
20 if token in buf:
21 return True
22 if "ERROR" in buf:
23 return False
24 return False
25
26def at(cmd, timeout_ms=2000):
27 sim.write(cmd + "\r\n")
28 return wait_for("OK", timeout_ms)
29
30def send_sms(number, msg):
31 sim.write('AT+CMGS="{}"\r'.format(number))
32 if not wait_for(">", 5000):
33 return False
34 sim.write(msg)
35 sim.write(b"\x1a") # Ctrl+Z: gönder / send
36 return wait_for("+CMGS:", 60000)
37
38for _ in range(10): # otomatik baud eşleşmesi / autobaud sync
39 if at("AT", 1000):
40 break
41at("ATE0") # yankıyı kapat / echo off
42at("AT+CMGF=1") # SMS metin modu / SMS text mode
43at("AT+CNMI=1,2,0,0,0") # gelen SMS'i UART'a ver / push incoming SMS to the UART
44print("Hazir / Ready")
45
46body_next = False
47from_owner = False
48while True:
49 raw = sim.readline()
50 if not raw:
51 continue
52 line = to_text(raw).strip()
53 if not line:
54 continue
55 print(line)
56 if body_next: # +CMT'den sonraki satır SMS metni / line after +CMT is the text
57 body_next = False
58 cmd = line.upper()
59 if not from_owner:
60 continue
61 if "ROLE AC" in cmd:
62 relay.value(1)
63 send_sms(OWNER, "Role ACILDI / Relay ON")
64 elif "ROLE KAPA" in cmd:
65 relay.value(0)
66 send_sms(OWNER, "Role KAPANDI / Relay OFF")
67 elif "DURUM" in cmd:
68 send_sms(OWNER, "Role ACIK / ON" if relay.value() else "Role KAPALI / OFF")
69 elif line.startswith("+CMT:"): # yeni SMS başlığı / new SMS header
70 from_owner = OWNER in line
71 body_next = TrueIde proyek SIM800L
- Alarm maling dengan SMS: sistem yang mengirim SMS lalu meneleponmu ketika sensor PIR atau sensor pintu mendeteksi gerakan; detailnya ada di panduan sistem alarm rumah Arduino kami.
- Peringatan kebocoran gas: dapatkan SMS di ponselmu ketika sensor gas MQ-2 melewati ambangnya, bahkan ketika tidak ada orang di rumah.
- Pelacak GPS yang membalas lewat SMS: dengan modul GPS NEO-6M, pelacak mobil atau sepeda yang menjawab pesan “LOCATION” dengan link Google Maps.
- Penyiraman jarak jauh: sistem untuk kebun atau lahan garapan yang melaporkan pembacaan sensor kelembapan tanah lewat SMS dan menyalakan pompa dengan pesan “WATER”.
- Penjaga suhu: rangkaian DS18B20 yang mengirim peringatan ketika rumah kaca, kandang ayam, atau freezer keluar dari rentang suhunya.
- Pintu garasi yang dibuka dengan panggilan: remote gratis yang memberi pulsa ke relay selama satu detik hanya ketika nomor terdaftar menelepon.
- Pemberi tahu listrik padam: rangkaian kecil yang tetap berjalan dengan baterai ketika listrik PLN padam dan mengirim SMS “Power cut”.
Tidak terhubung ke jaringan, SMS tidak terkirim: masalah umum dan solusinya
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| Tidak ada balasan sama sekali ketika mengetik AT | TXD dan RXD tertukar, tidak ada GND bersama, pengaturan akhir baris salah, atau autobauding belum sinkron | Hubungkan TXD ke D2, satukan GND, pilih Both NL & CR, dan kirim AT beberapa kali |
| Karakter acak | Baud rate tidak cocok atau level logika pas-pasan | Setel Serial Monitor dan sketch sama-sama ke 9600, pakai level shifter |
| LED berkedip beberapa kali lalu padam, modul restart | Tegangan turun di bawah 3,4 V selama registrasi | Catu daya yang sanggup memberi 2 A, kapasitor 1000 µF, kabel pendek yang tebal |
| UNDER-VOLTAGE POWER DOWN muncul di port serial | Catu daya turun di bawah 3,4 V | Isi ulang baterai atau setel output buck ke 4,0–4,1 V |
| OVER-VOLTAGE WARNNING atau OVER-VOLTAGE POWER DOWN muncul | Tegangannya di atas 4,3–4,4 V | Turunkan output ke 4,0 V; jangan pernah hubungkan modul ke 5 V |
| LED terus berkedip sekali per detik | Tidak ada antena, SIM tidak terbaca, PIN aktif, atau tidak ada 2G di daerah itu | Pasang antena, cek dengan AT+CPIN? dan AT+CSQ, uji jangkauan 2G dengan ponsel |
| Balasan +CREG: 0,3 | Registrasi jaringan ditolak | Cek apakah nomornya aktif dan IMEI-nya tidak diblokir |
| SMS gagal dengan +CMS ERROR | Pulsa habis, format nomor salah, atau nomor pusat SMS tidak ada | Cek pulsamu, tulis nomor dengan kode negara, cek pusat SMS dengan AT+CSCA? |
| Arduino reset ketika mengirim SMS | SIM800L dan Arduino berbagi catu daya lemah yang sama | Pisahkan catu dayanya dan cukup satukan GND-nya |
| SMS masuk tidak muncul di port serial | AT+CNMI belum diatur, atau pengaturannya hilang ketika modul restart | Kirim AT+CMGF=1 dan AT+CNMI=1,2,0,0,0 di setup |
Kalau diberi daya dengan benar dan dipakai di tempat yang ada jangkauan 2G, SIM800L adalah cara termurah untuk menjangkau proyek Arduino-mu dari jarak berkilo-kilometer: catu daya 4 V yang kokoh, kapasitor besar, dan segelintir perintah AT sudah cukup. Kalau kamu ingin membandingkan pilihan nirkabel lainnya, lihat panduan modul komunikasi nirkabel kami. Di aplikasi BlueGrays kamu akan menemukan proyek yang mudah dikembangkan dengan SIM800L, seperti alarm sensor gerak, alarm gas dan api, kendali lampu listrik PLN, penyiraman pintar, dan alarm ESP32 dengan notifikasi Telegram, semuanya lengkap dengan skema rangkaian dan kode langkah demi langkah.
Pertanyaan umum
Berapa tegangan yang dibutuhkan SIM800L, dan bolehkah dihubungkan ke 5V?
SIM800L bekerja di 3,4–4,4 V, dengan 4,0 V yang disarankan. Menghubungkannya ke pin 5V Arduino membuat modul mati karena tegangan berlebih atau malah rusak. Pakai baterai LiPo satu sel atau 18650, atau LM2596 yang disetel ke 4,0 V; catu dayanya juga harus sanggup menangani pulsa singkat 2 A.
Apakah SIM800L masih bisa dipakai di 2026?
Hanya di tempat yang jaringan 2G-nya masih berjalan. 2G sudah dimatikan di AS, Australia, dan Swiss, dan Prancis menghentikannya paling lambat akhir 2026, sementara Jerman, Inggris, dan Turki untuk sekarang masih punya 2G. Cek rencana 2G operatormu sebelum membuat proyek jangka panjang; kalau tidak, pilih modul 4G LTE.
Kenapa SIM800L-ku tidak mau terhubung ke jaringan?
Penyebab paling umum adalah catu daya yang tidak memadai, antena yang tidak terpasang, kartu SIM dengan PIN aktif, dan tidak adanya jangkauan 2G di daerah itu. Cek sinyal dengan AT+CSQ, SIM dengan AT+CPIN?, dan status registrasi dengan AT+CREG?. Kalau modul restart selama registrasi, masalahnya pasti catu daya.
Apa arti pola kedip LED SIM800L?
Berkedip sekali per detik berarti modul berjalan tapi belum terdaftar di jaringan, dan berkedip sekali tiap 3 detik berarti sudah terdaftar dan siap untuk SMS dan panggilan. Kedipan yang sangat cepat berarti koneksi data GPRS aktif. Kalau LED berkedip beberapa kali lalu padam, modul sedang restart karena tegangan anjlok.
Bisakah SIM800L terhubung ke internet?
Bisa, lewat GPRS ia bisa mengirim dan menerima data sampai 85,6 kbps, yang cukup untuk mengirim data sensor ke server, membuat request HTTP, atau memakai MQTT. Kamu perlu memasukkan pengaturan APN operatormu, dan library TinyGSM memudahkan pekerjaannya. Tapi untuk gambar atau file besar, kecepatannya jauh terlalu lambat.
Apa yang bisa kupakai sebagai pengganti SIM800L?
Di negara yang 2G-nya sudah atau sedang dimatikan, pakai modul 4G LTE seperti SIM7600 atau A7670, atau modul LTE-M/NB-IoT seperti SIM7080G. Sebagian besar perintah AT-nya mirip, jadi kode SMS dan panggilan bisa dipindahkan dengan sedikit perubahan. SIM800C dan SIM900 yang lebih lama dari keluarga yang sama memakai perintah yang mirip, tapi keduanya juga hanya 2G.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Suhu dan Kelembapan dengan DHT11
Seberapa hangat kamarmu, dan apakah udaranya lembap atau kering? Sensor DHT11 mengukur suhu dan kelembapan, dan Arduino menulis nilainya di layar LCD dua baris, diperbarui setiap beberapa detik. Jika

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

Pendeteksi Gerakan dengan Sensor Gerak
Penjaga sederhana yang memberi tahu ketika ada orang masuk ke ruangan. Sensor gerak menangkap panas yang dipancarkan tubuh manusia, dan Arduino menjaga LED tetap menyala selama ada gerakan lalu memati

Alarm Sensor Api dan Gas
Penjaga kecil yang langsung memperingatkanmu ketika ada gas bocor atau nyala api di suatu tempat. Sensor gas mengawasi gas di udara dan sensor api mengawasi cahaya api; selama semuanya aman LED hijau

Menyalakan Bohlam 220V dengan Tombol Tekan
Selama kamu menahan tombol, bohlam 220 volt sungguhan tetap menyala, dan mati begitu kamu melepasnya. Sinyal kecil Arduino tidak bisa langsung menyalakan bohlam, jadi relay, sakelar yang dikendalikan

Menyalakan Bohlam 220V dengan Remote Control
Nyalakan dan matikan bohlam sungguhan di rumahmu dengan remote TV, tanpa beranjak dari sofa. Arduino membaca sinyal cahaya tak terlihat dari remote; tombol power membuat relay berbunyi klik dan menyal

Stasiun Penyiraman Pintar
Tukang kebun yang menyiram tanamanmu sendiri, supaya tanaman tidak kering ketika kamu berlibur. Sensor kelembapan tanah mengukur seberapa basah tanahnya; ketika kering, Arduino menyalakan pompa air be
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

