Parçalar · 13 dk okuma

SIM800L Arduino Kullanımı: SMS Gönderme, Röle Kontrolü ve Arama

SIM800L GSM modülü Arduino'ya nasıl bağlanır? 4 V ve 2 A besleme, LED anlamları, AT komutları, SMS gönderme, SMS ile röle, arama, ESP32 ve Pico kodu.

SIM800L GSM modülü, Arduino projene bir telefon hattı ekleyen, posta pulu büyüklüğünde ve çok ucuz bir 2G modemdir. İçine taktığın micro SIM kartla SMS gönderip alabilir, telefon araması yapabilir ve GPRS üzerinden internete küçük veriler yollayabilirsin. Wi-Fi'nin ya da Bluetooth'un ulaşmadığı bağ evi, sera, depo ya da araç gibi yerlerde, şebekenin çektiği her noktadan cihazını uzaktan kontrol etmenin en basit yolu SIM800L ile Arduino'yu birlikte kullanmaktır. Modül, Arduino ile iki kabloluk bir seri bağlantı (UART) üzerinden konuşur ve AT komutları adı verilen kısa metin komutlarıyla yönetilir.

Ancak SIM800L, yeni başlayanları en çok uğraştıran modüllerden biridir ve sorunların neredeyse tamamı iki yerden çıkar: yanlış besleme ve 2G kapsaması. Bu rehberde modülü 3,4–4,4 V ve 2 A tepe akım ihtiyacına göre doğru beslemeyi, kart üzerindeki LED'in yanıp sönme hızından ne anlaman gerektiğini, AT komutlarıyla adım adım test etmeyi, Arduino Uno ile SMS göndermeyi, SMS ile röle açıp kapatmayı ve alarm durumunda seni arayan bir devre kurmayı öğreneceksin. Ardından aynı işleri ESP32, hazır TTGO T-Call kartı ve Raspberry Pi Pico ile yapacak, en sonda da şebekeye bağlanmama sorunlarının çözümlerini bir tabloda bulacaksın.

SIM800L GSM/GPRS modülü ve yay anteni
SIM800L kartı: üstte yay biçimli anten, yanında besleme kondansatörü ve iki sıra pin başlığı; kartın arka yüzünde (altta) micro SIM yuvası bulunur.

SIM800L nedir, nasıl çalışır?

SIM800L, SIMCom firmasının ürettiği, yalnızca 17,8 × 15,8 mm boyutunda bir GSM/GPRS modülüdür. Satın aldığın kırmızı kart ise bu modülün yanına SIM yuvası, anten bağlantısı, durum LED'i ve pin başlıkları eklenmiş küçük bir taşıyıcıdır (breakout). Modül dört GSM bandını da (850, 900, 1800 ve 1900 MHz) otomatik tarar, şebekeye bir cep telefonu gibi kaydolur ve sonra seri porttan gelen komutları uygular: "şu numaraya şu mesajı gönder", "bu numarayı ara", "gelen mesajları bana ilet" gibi. Onu ekranı ve tuşları olmayan bir telefon gibi düşünebilirsin; ekranın ve tuş takımının işini Arduino yapar. MIC ve SPK pinlerine mikrofon ve hoparlör bağlarsan gerçek bir sesli görüşme bile yapabilirsin.

ÖzellikDeğer
ModülSIMCom SIM800L, 2G GSM/GPRS
Frekans bantlarıDört bant: GSM 850, EGSM 900, DCS 1800, PCS 1900 MHz
Besleme gerilimi3,4–4,4 V (önerilen 4,0 V)
Tepe akım2 A'e kadar (yayın anındaki kısa darbeler)
Ortalama akımKapalı ~0,1 mA, uyku ~1–2 mA, boşta ~15 mA, sesli arama 130–220 mA, GPRS 150–450 mA (banda ve veri sayfası sürümüne göre)
Yayın gücü2 W (850/900 MHz), 1 W (1800/1900 MHz)
HaberleşmeUART ve AT komutları; otomatik baud 1200–115200
Lojik seviyeÇıkış 2,8 V; RXD girişi en fazla 3,1 V
SIM kartMicro SIM (1,8 V ve 3 V kartlar)
GPRS hızıEn fazla 85,6 kbps
Çalışma sıcaklığı-40 ile +85 °C arası

SIM800L pinleri

PinGöreviNot
NETAnten bağlantısıYay anten buraya lehimlenir; u.FL (IPEX) yuvası varsa harici anten takılır
VCCBesleme (+)3,4–4,4 V; Arduino'nun 5V ya da 3.3V pinine bağlanmaz
RSTDonanımsal resetEn az 105 ms LOW çekilirse modül yeniden başlar; boş bırakılabilir
RXDModülün seri girişiKartın TX pinine gider; en fazla 3,1 V
TXDModülün seri çıkışıKartın RX pinine gider; 2,8 V seviyesindedir
GNDToprakHem besleme kaynağına hem Arduino'ya (ortak toprak)
RINGArama / SMS bildirimiGelen aramada LOW olur, SMS gelince 120 ms LOW darbe verir
DTRUyku kontrolüAT+CSCLK=1 ile birlikte HIGH tutulursa modül uyur, LOW çekilince uyanır
MIC+ / MIC−Mikrofon girişiElektret mikrofon için
SPK+ / SPK−Hoparlör çıkışıKüçük bir 8 Ω hoparlör bağlanabilir

Kartın köşesindeki NET deliğine kutudan çıkan yay biçimli anten lehimlenir; bazı kartlarda bunun yanında harici anten için küçük bir u.FL (IPEX) yuvası da bulunur. Anten olmadan modül şebeke bulamaz ve sinyal gücü sıfıra yakın çıkar; bina içinde sinyal zayıfsa kablolu, yapışkanlı bir GSM anteni yay antene göre belirgin bir fark yaratır. Arka yüzdeki yuvaya micro SIM kart, kesik köşesi yuvanın üzerindeki çizime uyacak şekilde takılır. Kartı takmadan önce bir telefonda PIN sorgusunu kapat, hattın SMS ve arama yapabildiğinden ve yeterli bakiyesi olduğundan emin ol.

Besleme: 3,4–4,4 V ve 2 A tepe akım

SIM800L'in en kritik ve en çok yanlış yapılan noktası beslemedir. GSM şebekesi zaman paylaşımıyla çalışır: modül her 4,615 ms'lik çerçevenin içinde yalnızca 577 µs'lik kendi zaman diliminde yayın yapar. Bu kısa anlarda çektiği akım 2 A'e kadar çıkar, hemen ardından yeniden birkaç on miliampere düşer. Kaynak bu ani akımı veremezse gerilim çöker. SIMCom'un veri sayfasına göre gerilim 3,5 V'a inince modül seri porta UNDER-VOLTAGE WARNNING, 3,4 V'un altına düşünce UNDER-VOLTAGE POWER DOWN yazar ve kendini kapatır (WARNNING'deki yazım hatası üreticinin yazılımından gelir). Üst tarafta 4,3 V'ta OVER-VOLTAGE WARNNING uyarısı gelir, 4,4 V aşılınca modül yine kapanır. Bazı yazılım sürümlerinde bu otomatik kapanma varsayılan olarak kapalıdır ve AT+CBATCHK=1 ile açılır; kapalı olsa bile modül bu sınırların dışında kararsız çalışır ve sık sık yeniden başlar. Bu yüzden Arduino'nun 5V pini SIM800L için fazla yüksektir. 3.3V pini ise hem alt sınırın altındadır hem de resmi olarak yalnızca 50 mA verebilir; zaten bilgisayarın USB portu da en fazla 500 mA sağlar.

Besleme yoluUygun mu?Açıklama
Tek hücre 3,7 V LiPo ya da 18650 Li-ion pilEvet, en kolay yolDolu pil 4,2 V'tur; pil 3,6–3,7 V'a inene kadar rahat çalışır, daha aşağıda yayın darbelerinde kapanabilir. En az 1000 mAh ve 2 A verebilen bir pil seç, TP4056 ile şarj et
LM2596 step-down (buck) modülEvet, adaptörlü projeler için7–12 V adaptörden 4,0–4,1 V'a ayarlanır; en fazla 3 A verir
5 V girişli SIM800L kartları (ör. "SIM800L V2")Evet, kartın talimatına göreKart üzerindeki devre gerilimi düşürür; yine de 2 A verebilen bir 5 V kaynak gerekir
Arduino'nun 5V piniHayır4,4 V sınırını aşar, modül kapanır ya da zarar görür; USB 2 A veremez
Arduino'nun 3.3V piniHayır3,4 V'un altındadır ve akımı çok azdır; modül açılmaz ya da sürekli yeniden başlar
AMS1117 gibi 3,3 V regülatörlerHayır3,3 V çıkış, modülün alt sınırının altındadır
LM2596
LM2596
18650 Li-Ion
18650 Li-Ion
TP4056
TP4056
LM2596 kullanıyorsan çıkış gerilimini SIM800L'i bağlamadan önce multimetreyle ölçerek trimpotla 4,0–4,1 V'a ayarla. Modülün fabrikadan hangi ayarla geldiği belli değildir; girişteki 12 V'a yakın bir çıkış SIM800L'i ilk saniyede yakar. Pille çalışacaksan pili TP4056 şarj modülüyle doldur ve pilin ters bağlanmasına karşı dikkatli ol; SIM800L'de ters gerilim koruması yoktur.
VCC ile GND arasına, modülün pinlerine olabildiğince yakın, 470–1000 µF düşük ESR'li bir elektrolitik kondansatör ile 100 nF'lık bir seramik kondansatör ekle; SIMCom kendi tasarımında en az 100 µF düşük ESR'li bir kondansatör önerir. Kondansatör 2 A'lik darbeleri kaynağın yerine karşılayarak gerilim çökmesini önler; nasıl çalıştığını Kondansatör nedir? yazısında anlattık. Besleme kablolarını kısa ve kalın tut, breadboard'un yay kontaklarından 2 A geçirmemeye çalış ve modülün GND'sini Arduino'nun GND'sine mutlaka bağla.

LED ne anlatıyor? Yanıp sönme anlamları

LED davranışıAnlamıNe yapmalı?
Hiç yanmıyorModül çalışmıyorBeslemeyi ve VCC–GND yönünü kontrol et, gerilimi ölç
Yaklaşık saniyede bir (64 ms yanık, 800 ms sönük)Modül açık ama şebekeye kayıtlı değilİlk 10–60 saniye normaldir; uzarsa SIM, PIN, anten ve 2G kapsamasını kontrol et
Yaklaşık 3 saniyede bir (64 ms yanık, 3000 ms sönük)Şebekeye kayıtlıSMS ve arama için hazır
Çok hızlı, saniyede yaklaşık 3 kez (64 ms yanık, 300 ms sönük)GPRS veri bağlantısı açıkİnternet bağlantısı kurulmuş
Birkaç kez yanıp sönüp kapanıyor, sonra yeniden başlıyorGerilim çöküyor, modül kendini kapatıyorDaha güçlü kaynak, büyük kondansatör, kısa ve kalın kablo kullan

LED'i bir teşhis aracı olarak kullanmayı alışkanlık hâline getir: kod yazmadan önce modülün 3 saniyede bir yanıp sönmeye geçtiğini görmek, sorunların yarısını baştan eler. Modül dakikalarca saniyede bir yanıp sönüyorsa yazılımla uğraşmanın anlamı yoktur; önce aşağıdaki şebeke kaydı bölümüne bak. En büyük akım darbeleri kayıt anında, yani modül baz istasyonuyla ilk kez konuşurken gelir; besleme zayıfsa modül tam bu sırada kapanır ve döngü baştan başlar.

SIM800L Arduino bağlantısı ve seviye uyumu

SIM800L, Arduino ile UART üzerinden haberleşir ve veri hatları çapraz bağlanır: modülün TXD pini kartın RX pinine, modülün RXD pini de kartın TX pinine gider. Arduino Uno'nun tek donanım seri portu (D0 ve D1) USB ile kod yüklemek ve Seri Monitör için kullanıldığından modülü SoftwareSerial ile D2 ve D3 pinlerine bağlıyoruz; SoftwareSerial 9600 baud hızında güvenilir çalışır. ESP32 ve Pico'da yazılımsal seri porta gerek yoktur, donanım UART'ları kullanılır. Seri haberleşmenin temellerini UART seri haberleşme yazısında bulabilirsin.

SIM800L piniArduino UnoESP32Raspberry Pi Pico
VCCHarici 4,0 V (+)Harici 4,0 V (+)Harici 4,0 V (+)
GNDGND + kaynağın (−) ucuGND + kaynağın (−) ucuGND + kaynağın (−) ucu
TXDD2 (SoftwareSerial RX)GPIO 16 (RX2)GP1 (UART0 RX)
RXDD3, 10 kΩ + 15 kΩ bölücü üzerindenGPIO 17 (TX2), 1 kΩ + 5,6 kΩ bölücü üzerindenGP0 (UART0 TX), 1 kΩ + 5,6 kΩ bölücü üzerinden
RSTBoş bırakılabilirBoş bırakılabilirBoş bırakılabilir
NETAntenAntenAnten
SIM800L'in RXD girişi veri sayfasına göre en fazla 3,1 V kabul eder. Uno'nun D3 pini 5 V verdiği için araya bir gerilim bölücü koy: D3 → 10 kΩ → RXD ve RXD → 15 kΩ → GND bağlantısı yaklaşık 3,0 V verir. İnternette sık görülen 10 kΩ + 20 kΩ bölücü 3,3 V üretir; çoğu zaman çalışır ama üretici sınırının biraz üstündedir. ESP32 ve Pico'nun 3,3 V'luk çıkışı için SIMCom'un önerdiği 1 kΩ seri + 5,6 kΩ GND direnci yaklaşık 2,8 V verir. Ters yönde modülün 2,8 V'luk TXD sinyalini Uno çoğunlukla doğru okur, ancak Uno'nun veri sayfası 5 V'ta HIGH için 3,0 V ister; kalıcı bir devrede çift yönlü bir lojik seviye dönüştürücü en temiz çözümdür.

AT komutlarıyla ilk test

  1. Modülü tablodaki gibi bağla, anteni tak ve PIN sorgusu kapalı micro SIM kartı yerleştir.
  2. Beslemeyi ver ve LED'i izle: birkaç saniye saniyede bir yanıp söndükten sonra 3 saniyede bir yanıp sönmeye geçmeli.
  3. Aşağıdaki köprü kodunu Arduino'ya yükle; SoftwareSerial Arduino IDE ile birlikte gelir, ek kütüphane gerekmez.
  4. Seri Monitör'ü aç, hızı 9600 baud, satır sonunu Both NL & CR olarak seç.
  5. AT yazıp Enter'a bas. Modül otomatik baud özelliğiyle hızını sana uydurur; ilk denemelerde cevap gelmeyebilir, OK görene kadar tekrarla.
  6. Ardından aşağıdaki tablodaki komutlarla SIM kartı, sinyal gücünü ve şebeke kaydını sırayla kontrol et.
Arduino (C++)
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}
KomutÖrnek cevapAnlamı
ATOKModül çalışıyor ve hız eşleşti
AT+CPIN?+CPIN: READYSIM hazır; SIM PIN görürsen PIN'i kapat ya da AT+CPIN="1234" gönder
AT+CSQ+CSQ: 18,0Sinyal gücü 0–31 arası (99 = bilinmiyor); 10 ve üzeri yeterli
AT+CREG?+CREG: 0,11 = kayıtlı, 5 = dolaşımda kayıtlı, 2 = arıyor, 3 = reddedildi
AT+COPS?+COPS: 0,0,"OPERATÖR"Bağlı olunan operatörün adı
AT+CBC+CBC: 0,82,4012Besleme gerilimi, milivolt (burada 4,012 V)
AT+GSN15 haneli sayıModülün IMEI numarası
AT+CCID19–20 haneli sayıSIM kartın seri numarası (ICCID); kartın okunduğunu gösterir
AT+CMGF=1OKSMS için metin modu
AT+CMGS="+905551112233">Mesaj metnini bekler; Ctrl+Z (26) ile gönderilir
AT+CNMI=1,2,0,0,0OKGelen SMS'i saklamadan doğrudan seri porta yazar
ATD+905551112233;OKSesli arama başlatır (sondaki ; şart)
ATA / ATHOKGelen aramayı açar / aramayı kapatır
AT+CLIP=1OKGelen aramada arayan numarayı +CLIP satırıyla gösterir
AT+IPR=9600OKHızı otomatik yerine 9600 baud'a sabitler; kalıcı olması için ardından AT&W gönder
AT+CMEE=2OKHataları sayı yerine açıklamalı metinle verir

AT+CSQ cevabındaki ilk sayıdan sinyal gücünü dBm olarak hesaplayabilirsin: dBm ≈ −113 + 2 × değer. Örneğin 18, yaklaşık −77 dBm demektir ve gayet iyidir; 10'un altı zayıf, 5'in altı ise SMS'in bile zor gittiği bir sinyaldir. 99 cevabı, modülün henüz ölçüm yapamadığını gösterir. AT+CBC komutu da besleme sorunlarını yakalamak için birebirdir: modül boştayken 4,0 V civarı görüyor ama SMS ya da arama sırasında modül kapanıyorsa sorun kesinlikle kaynağın akım kapasitesindedir. Varsayılan otomatik baud modunda modül açılışta hiçbir şey yazmaz; AT+IPR=9600 ile hızı sabitleyip AT&W ile kaydedersen ayar kalıcı belleğe yazılır ve modül her açılışta RDY, +CFUN: 1 ve +CPIN: READY satırlarıyla hazır olduğunu haber verir.

Şebekeye kayıt olmuyor mu? 2G kapsaması, SIM ve IMEI

SIM800L yalnızca 2G (GSM/GPRS) şebekesini kullanır; 3G, 4G ya da 5G'yi tanımaz. Türkiye'de operatörlerin 2G şebekeleri hâlâ açık; haberlere göre 2G ve 3G'nin, lisans sürelerinin dolduğu 2029'da kapatılması planlanıyor. Başka ülkelerde durum farklı: ABD'de son 2G şebekesi Ağustos 2026'da kapandı, Avustralya'da ve İsviçre'de 2G çoktan kapatıldı, Fransa'da operatörler 2G'yi 2026 sonuna kadar kapatıyor, Almanya'da Telekom 2028'i hedefliyor; Japonya ve Güney Kore'de ise GSM hiç kullanılmadı. 2G'nin olmadığı bir yerde SIM800L ne kadar iyi beslenirse beslensin şebekeye kayıt olamaz; böyle bölgelerde SIM7600 ve A7670 gibi 4G LTE ya da SIM7080G gibi LTE-M/NB-IoT modüllerine geçmen gerekir. Kayıt sorununu çözerken şu sırayı izle:

  • Bölgende 2G var mı? Telefonunun mobil ağ ayarlarından tercih edilen ağ türünü yalnızca 2G yap ve aynı SIM kartla arama yapmayı dene. Telefon 2G'de şebeke bulamıyorsa SIM800L de bulamaz.
  • SIM kart okunuyor mu? AT+CCID bir numara döndürmeli, AT+CPIN? cevabı +CPIN: READY olmalı. Hata alırsan kartı yönüne dikkat ederek yeniden tak; nano SIM'i adaptörle takıyorsan adaptörün kontakları sıkıştırmadığından emin ol.
  • Sinyal yeterli mi? AT+CSQ en az 10 olmalı. Anteni lehimle ya da harici anten tak, modülü pencere kenarına taşı.
  • Kayıt reddediliyor mu? AT+CREG? cevabında 0,3 görüyorsan şebeke modülü kabul etmiyordur: hat kapalı olabilir ya da cihazın IMEI'si engellenmiş olabilir.
  • IMEI kaydı: Türkiye'de BTK'ya kayıtlı olmayan IMEI'li cihazlar belirli bir süre sonra şebekeden kesilebilir. Yurt dışından getirilen modüllerde bu sorun çıkabilir; yurt içi satıcıların "IMEI kayıtlı" olarak sattığı modülleri tercih et, IMEI'yi AT+GSN ile öğrenip e-Devlet'teki IMEI sorgulama ekranından kontrol et.
  • Besleme yeterli mi? Kayıt anında modül yeniden başlıyorsa sorun şebekede değil, beslemededir; yukarıdaki besleme bölümüne dön.

Arduino ile SMS gönderme

SMS göndermek için önce AT+CMGF=1 ile metin moduna geçilir. Ardından AT+CMGS="+905551112233" komutu gönderilir; numarayı ülke koduyla birlikte (Türkiye için +90) yazmak en güvenlisidir. Modül > işaretiyle mesaj metnini beklediğini bildirir. Metni yazdıktan sonra Enter yerine Ctrl+Z karakteri (ASCII 26, 0x1A) gönderilir; ağ mesajı teslim alınca modül +CMGS: 12 gibi bir referans numarası ve OK döndürür. Bu onay birkaç saniye, zayıf sinyalde 60 saniyeye kadar sürebilir. Aşağıdaki kod modülle eşleşir, şebeke kaydını bekler ve tek bir SMS gönderir; PHONE satırına kendi numaranı yaz:

Arduino (C++)
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}

Kodda waitReply() fonksiyonu modülden gelen her karakteri Seri Monitör'e yazarken beklenen cevabı (OK, > ya da +CMGS:) ve ERROR kelimesini arar; böylece her komutun sonucunu görebilirsin. waitForNetwork(), +CREG cevabında 0,1 (ev ağı) ya da 0,5 (dolaşım) görene kadar bekler, çünkü şebekeye kayıt olmadan gönderilen SMS hata verir. Metin modunda bir SMS en fazla 160 karakter olabilir ve GSM alfabesinde ş, ğ, ı gibi Türkçe harfler yoktur; mesajları koddaki "calisiyor" örneğindeki gibi Türkçe karaktersiz yaz.

Her SMS hattından ücret düşer. SMS gönderen kodu asla loop() içine koşulsuz yazma: saniyede bir tetiklenen bir hata, birkaç dakikada yüzlerce mesaj ve büyük bir fatura demektir. Alarm gibi tekrar eden durumlarda iki mesaj arasına millis() ile bekleme süresi koy; nasıl yapıldığını millis() ve delay() yazısında bulabilirsin.

SMS ile röle kontrolü ve çağrıyla aç-kapa

Gelen mesajları okumak için AT+CNMI=1,2,0,0,0 komutunu kullanırız: bu ayarla modül yeni SMS'i SIM karta kaydetmez, doğrudan seri porta iki satır hâlinde yazar. İlk satır +CMT: "+905551112233","","26/10/30,14:05:12+12" gibi gönderen numarayı ve zamanı (sondaki +12, çeyrek saat cinsinden UTC+3 demektir), ikinci satır mesajın kendisini içerir. Aşağıdaki kod D7'ye bağlı bir röle modülünü "ROLE AC", "ROLE KAPA" ve "DURUM" mesajlarıyla yönetir, her komuttan sonra cevap SMS'i gönderir ve yalnızca senin numarandan gelen mesajları dikkate alır. Ayrıca AT+CLIP=1 sayesinde modülü kendi numaranla aradığında arama hiç açılmadan reddedilir ve röle durum değiştirir; açılmayan arama ücretlendirilmediği için bu, en ucuz uzaktan anahtardır. Bazı şebekeler gönderen numarasını +90 yerine 0 ile başlayan yerel biçimde iletir; komutlar işlenmiyorsa Seri Monitör'deki +CMT satırına bak ve OWNER'ı aynı biçimde yaz.

Arduino (C++)
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}
Kod parçasıNe yapar?
ATE0Modülün gönderdiğin komutu geri yansıtmasını (yankı) kapatır; gelen satırlar sadeleşir
AT+CNMI=1,2,0,0,0Yeni SMS'i bir +CMT satırı ve hemen ardından mesaj metni olarak seri porta yazar
AT+CLIP=1Gelen aramada RING satırının ardından arayan numarayı +CLIP satırıyla bildirir
strstr(line, OWNER)Satırda yetkili numara geçiyor mu diye bakar; diğer numaralardan gelen komutlar yok sayılır
toupper()"role ac" ile "ROLE AC" aynı kabul edilsin diye metni büyük harfe çevirir
ATHGelen aramayı açmadan sonlandırır
RELAY_ONDüşük seviyede tetiklenen (active-low) röle modüllerinde LOW yapılır
Röleyle 220 V şebeke gerilimini anahtarlıyorsan bağlantıları cihaz fişten çekiliyken yap ve yüksek gerilim tarafına dokunma; deneyimin yoksa önce bir LED ya da 12 V'luk bir yükle dene. Ayrıca SMS'te görünen gönderen numarası sahte gösterilebilir. Kapı kilidi ya da kombi gibi önemli bir cihazı yönetiyorsan komuta yalnızca senin bildiğin bir şifre ekle (örneğin "ROLE AC 4827") ve kodda bu şifreyi de kontrol et.

SIM800L ile arama yapmak: alarm olunca seni arasın

Arama yapmak için ATD komutundan sonra numara ve noktalı virgül yazılır: ATD+905551112233;. Sondaki noktalı virgül çağrının sesli arama olduğunu belirtir; unutursan modül bir veri araması (data call) başlatır ve sesli arama kurulmaz. Karşı taraf reddederse ya da görüşme biterse modül NO CARRIER ya da BUSY, cevap gelmezse NO ANSWER, şebeke yoksa NO DIALTONE yazar; ATH aramayı her an sonlandırır. Telefonunun çalması, bir alarm için SMS'ten çok daha dikkat çekicidir. Aşağıdaki kod D4'e bağlı bir PIR hareket sensörü tetiklendiğinde önce SMS gönderir, ardından telefonunu en fazla 20 saniye çaldırır ve iki alarm arasında 2 dakika bekler:

Arduino (C++)
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}

Kod açıldıktan sonraki ilk 2 dakika boyunca da alarm vermez; bu süre hem PIR sensörünün ısınmasına hem de evden çıkmana zaman tanır. Aramayı açarsan görüşme bağlanır; SIM800L'in MIC ve SPK pinlerine bir elektret mikrofon ve 8 Ω'luk küçük bir hoparlör bağlarsan cihazla konuşabilirsin. Gelen aramaları otomatik açmak için RING satırını gördüğünde ATA göndermen yeterlidir. Arama sırasında modül ortalama 130–220 mA, tepe noktalarda yine 2 A çeker; beslemen SMS'e yetiyor ama arama sırasında modül kapanıyorsa kondansatörü büyüt ya da kaynağını güçlendir.

ESP32 ile SIM800L ve TTGO T-Call kartı

ESP32'de SoftwareSerial'a gerek yoktur; üç donanım UART'ından biri istediğin pinlere atanabilir. Yukarıdaki Uno kodlarını ESP32'de çalıştırmak için SoftwareSerial satırlarını silip yerine HardwareSerial sim800(2); yazman ve setup() içinde sim800.begin(9600, SERIAL_8N1, 16, 17); kullanman yeterlidir; kodun geri kalanı aynen çalışır. ESP32 3,3 V ile çalıştığı için yalnızca TX hattına 1 kΩ + 5,6 kΩ bölücü koyman yeterli. SIM800L'i ESP32 ile aynı zayıf kaynaktan beslersen 2 A'lik darbeler ESP32'nin gerilimini de düşürür ve kart "Brownout detector was triggered" hatasıyla yeniden başlar; iki kartı ayrı kaynaklardan besleyip yalnızca GND'leri birleştir. Bu hatayı ESP32 brownout yazısında ayrıntılı anlattık.

Kablo uğraşmak istemiyorsan LilyGO TTGO T-Call kartı ESP32 ile SIM800 modemini tek kartta birleştirir. Kartta ESP32-WROVER-B modülü, SIM800L (bazı üretimlerde aynı ailenin SIM800H'si), SIM kart yuvası, LiPo pil girişi ve pili şarj edip modem için gerekli akımı sağlayan IP5306 güç yönetim yongası bulunur. Modem dışarıdaki pinlerden değil, ESP32'nin belirli GPIO'larıyla açılıp kapatılır; bu yüzden sıradan SIM800L kodları T-Call'da doğrudan çalışmaz.

LilyGO TTGO T-Call ESP32 SIM800 kartı
TTGO T-Call: ön yüzde ESP32-WROVER-B ve SIM800 modemi, arka yüzde SIM kart yuvası ve LiPo pil konnektörü.
T-Call tanımıGPIOGörevi
MODEM_PWRKEY41 saniyelik LOW darbesiyle modemi açar
MODEM_RST5Modem reseti; HIGH tutulur
MODEM_POWER_ON23HIGH yapılınca modemin beslemesini açar
MODEM_TX27ESP32'den modemin RXD girişine
MODEM_RX26Modemin TXD çıkışından ESP32'ye
I2C SDA / SCL21 / 22IP5306 güç yongası (adres 0x75)
LED13Kart üzerindeki kullanıcı LED'i
Arduino (C++)
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}

Bu pinler LilyGO'nun IP5306'lı T-Call SIM800L sürümleri içindir. AXP192 güç yongalı sürümde güç yongası farklı bir kodla ayarlanır, SIM800C'li sürümde ise modemin besleme pini GPIO 25'tir; kartının üzerindeki sürüm tarihine ve üreticinin pin tablosuna bak. setPowerBoostKeepOn() fonksiyonu IP5306'nın 0x00 yazmacına 0x37 yazarak yongayı pilden çalışırken düşük akımda kendini kapatmaktan alıkoyar. Kartı yalnızca bilgisayarın USB'sinden beslediğinde modem kayıt anında kapanıyorsa LiPo pili de tak; pil, 2 A'lik darbeleri karşılar. ESP32-WROVER'da GPIO 16 ve 17 dahili PSRAM'e ayrıldığı için modem 26 ve 27'ye bağlanmıştır. GPRS ile HTTP isteği ya da MQTT gibi işler için TinyGSM kütüphanesi bu kartı TINY_GSM_MODEM_SIM800 tanımıyla destekler.

Raspberry Pi Pico ve MicroPython ile SIM800L

Raspberry Pi Pico'da modülü UART0'a bağlarız: SIM800L'in TXD'si GP1'e, RXD'si 1 kΩ + 5,6 kΩ bölücü üzerinden GP0'a gider ve GND'ler birleştirilir. Pico'nun VBUS ya da 3V3 pinleri SIM800L'i besleyemez; modülü yine 4 V'luk harici kaynaktan besle. Aşağıdaki MicroPython kodu Arduino'daki röle örneğiyle aynı işi yapar: GP15'teki röleyi SMS ile açıp kapatır ve cevap gönderir. to_text() fonksiyonu gürültüden kaynaklanan bozuk baytları atıp yalnızca ASCII karakterleri bıraktığı için bir decode hatası programı durdurmaz. Kod ek kütüphane gerektirmez; Thonny ile çalıştırmayı bilmiyorsan önce MicroPython temelleri yazısına göz at.

MicroPython
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 = True

SIM800L ile proje fikirleri

  • SMS'li hırsız alarmı: PIR ve kapı sensörüyle hareket olunca SMS gönderen, ardından seni arayan bir sistem; ayrıntılar için Arduino ev alarm sistemi yazısına bak.
  • Gaz kaçağı uyarısı: MQ-2 gaz sensörü eşiği aşınca evde kimse olmasa da telefonuna SMS gelsin.
  • SMS ile konum gönderen takip cihazı: NEO-6M GPS modülü ile, "KONUM" yazan mesaja Google Haritalar bağlantısıyla cevap veren bir araç ya da bisiklet takipçisi.
  • Uzaktan sulama: Toprak nem sensörü değerini SMS ile bildiren ve "SULA" mesajıyla pompayı çalıştıran bir bağ evi sistemi.
  • Sıcaklık bekçisi: Sera, kümes ya da derin dondurucu sıcaklığı sınırın dışına çıkınca uyarı gönderen bir DS18B20 devresi.
  • Çağrıyla açılan garaj kapısı: Yalnızca kayıtlı numaralardan gelen aramada röleyi bir saniye çeken, ücretsiz bir uzaktan kumanda.
  • Elektrik kesintisi bildirici: Şebeke gerilimi gidince pille çalışmaya devam edip "Elektrik kesildi" SMS'i gönderen küçük bir devre.

Şebekeye bağlanmıyor, SMS gitmiyor: sık hatalar ve çözümleri

BelirtiOlası nedenÇözüm
AT yazınca hiç cevap yokTXD ve RXD ters, GND ortak değil, satır sonu ayarı yanlış ya da otomatik baud eşleşmediTXD'yi D2'ye bağla, GND'leri birleştir, Both NL & CR seç, AT'yi birkaç kez gönder
Anlamsız karakterler geliyorBaud hızı uyuşmuyor ya da gerilim seviyesi sınırdaSeri Monitör ve koddaki hızı 9600 yap, seviye dönüştürücü kullan
LED birkaç kez yanıp sönüp sönüyor, modül yeniden başlıyorGerilim kayıt anında 3,4 V'un altına iniyor2 A verebilen kaynak, 1000 µF kondansatör, kısa ve kalın kablolar
Seri porta UNDER-VOLTAGE POWER DOWN düşüyorBesleme 3,4 V'un altına indiPili şarj et ya da buck çıkışını 4,0–4,1 V'a ayarla
OVER-VOLTAGE WARNNING ya da OVER-VOLTAGE POWER DOWNGerilim 4,3–4,4 V'un üstündeÇıkışı 4,0 V'a düşür; modülü asla 5 V'a bağlama
LED hep saniyede bir yanıp sönüyorAnten yok, SIM okunmuyor, PIN açık ya da bölgede 2G yokAnteni tak, AT+CPIN? ve AT+CSQ ile kontrol et, telefonla 2G kapsamasını dene
+CREG: 0,3 cevabıŞebeke kaydı reddettiHattın açık olduğunu ve IMEI'nin engelli olmadığını kontrol et
SMS gitmiyor, +CMS ERROR geliyorBakiye yok, numara biçimi yanlış ya da SMS merkezi numarası eksikBakiyeyi kontrol et, numarayı ülke koduyla yaz, AT+CSCA? ile SMS merkezini gör
Arduino SMS gönderirken resetleniyorSIM800L ile Arduino aynı zayıf kaynaktan besleniyorKaynakları ayır, yalnızca GND'leri birleştir
Gelen SMS seri porta düşmüyorAT+CNMI ayarı yapılmamış ya da modül yeniden başlayınca silinmişKurulumda AT+CMGF=1 ve AT+CNMI=1,2,0,0,0 gönder
Sorunun kodda mı yoksa donanımda mı olduğunu anlamanın en hızlı yolu, modülü 3,3 V seviyeli bir USB-TTL dönüştürücü ile doğrudan bilgisayara bağlayıp AT komutlarını elle göndermektir. Teşhis sırasında AT+CMEE=2 komutunu ver: modül "+CME ERROR: 10" yerine "+CME ERROR: SIM not inserted" gibi okunabilir hata mesajları gösterir.

SIM800L, doğru beslendiğinde ve 2G kapsaması olan bir yerde kullanıldığında, Arduino projelerine kilometrelerce uzaktan ulaşmanın en ucuz yoludur: 4 V'luk sağlam bir kaynak, büyük bir kondansatör ve birkaç AT komutu yeterlidir. Diğer kablosuz seçenekleri karşılaştırmak istersen kablosuz haberleşme modülleri yazısına göz at. BlueGrays uygulamasında hareket sensörlü alarm, gaz ve alev alarmı, 220 V lamba kontrolü, akıllı sulama ve Telegram bildirimli ESP32 alarmı gibi SIM800L ile kolayca genişletebileceğin projeleri devre şemaları ve adım adım kodlarıyla bulabilirsin.

Sıkça sorulan sorular

SIM800L hangi gerilimle çalışır, 5V'a bağlanır mı?

SIM800L 3,4–4,4 V arasında çalışır, önerilen değer 4,0 V'tur. Arduino'nun 5V pinine bağlamak modülün aşırı gerilim nedeniyle kapanmasına ya da bozulmasına yol açar. Tek hücre LiPo ya da 18650 pil veya 4,0 V'a ayarlanmış bir LM2596 kullan; kaynak, kısa süreli 2 A'lik darbeleri de karşılayabilmelidir.

SIM800L Türkiye'de çalışır mı?

Evet. Türkiye'de operatörlerin 2G şebekeleri hâlâ açık olduğu için SIM800L normal bir hatla SMS gönderip arama yapabilir. Haberlere göre 2G'nin 2029'da kapatılması planlanıyor. Yurt dışından alınan modüllerde IMEI kaydı sorunu çıkabileceği için IMEI'si kayıtlı modül tercih et.

SIM800L neden şebekeye bağlanmıyor?

En sık nedenler yetersiz besleme, takılmamış anten, PIN kodu açık SIM kart ve bölgede 2G olmamasıdır. AT+CSQ ile sinyali, AT+CPIN? ile SIM'i, AT+CREG? ile kayıt durumunu kontrol et. Modül kayıt sırasında yeniden başlıyorsa sorun kesinlikle beslemededir.

SIM800L LED'inin yanıp sönmesi ne anlama gelir?

Saniyede bir yanıp sönme modülün açık olduğunu ama şebekeye kayıtlı olmadığını, 3 saniyede bir yanıp sönme şebekeye kayıtlı ve SMS ile aramaya hazır olduğunu gösterir. Çok hızlı yanıp sönme GPRS veri bağlantısının açık olduğu anlamına gelir. LED birkaç kez yanıp sönüp kapanıyorsa modül gerilim düşmesi yüzünden yeniden başlıyordur.

SIM800L ile internete bağlanılabilir mi?

Evet, GPRS ile en fazla 85,6 kbps hızında veri gönderip alabilir; sensör verisini bir sunucuya yollamak, HTTP isteği yapmak ya da MQTT kullanmak için yeterlidir. Operatörünün APN ayarını girmen gerekir ve TinyGSM kütüphanesi bu işi kolaylaştırır. Görüntü ya da büyük dosya göndermek için ise çok yavaştır.

SIM800L yerine hangi modül kullanılabilir?

2G'nin kapatıldığı ya da kapanmak üzere olduğu ülkelerde SIM7600 ve A7670 gibi 4G LTE modülleri ya da SIM7080G gibi LTE-M/NB-IoT modülleri kullanılır. AT komutlarının çoğu benzer olduğu için SMS ve arama kodları küçük değişikliklerle taşınabilir. Aynı aileden SIM800C ve eski SIM900 de benzer komutlarla çalışır, ama onlar da yalnızca 2G kullanır.

Tüm projeleri gör
DHT11 İle Sıcaklık Ve Nem
#55Orta

DHT11 İle Sıcaklık Ve Nem

Odan kaç derece, hava nemli mi, kuru mu? DHT11 sensörü sıcaklığı ve nemi ölçer, Arduino da bu değerleri iki satırlık LCD ekrana yazar ve birkaç saniyede bir yeniler. Sensöre bir şey olursa ekranda hat

4.7(47)
64
ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)
#145İleri
Premium

ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)

PIR sensörü hareket algıladığında buzzer ve LED'i aktif eden, aynı anda Telegram üzerinden sahibine anlık bildirim gönderen akıllı bir güvenlik alarm sistemidir. Tekrarlayan alarmların sıklığını sınırlamak için 30 saniyelik cooldown (bekleme süresi) mekanizması vardır; bu mekanizma PIR sensörünün yanlış algılamalarını doğrulamaz veya ortadan kaldırmaz. Ev güvenliği, garaj izleme, depo veya çalışma odası gibi alanlarda kullanılabilir. Telegram entegrasyonu sayesinde nerede olursanız olun anında h

0.0(0)
8
Hareket Sensörü İle Hareket Algılayıcı
#24Başlangıç
Premium

Hareket Sensörü İle Hareket Algılayıcı

Biri odaya girdiğinde haber veren basit bir bekçi. Hareket sensörü insan vücudunun yaydığı ısıyı fark eder; Arduino hareket olduğu sürece LED'i yakar, hareket bitince söndürür. Kapı önünde kendiliğind

4.6(47)
67
ESP32 Hareket Algılama Alarmı
#140Orta
Premium

ESP32 Hareket Algılama Alarmı

ESP32 ve PIR sensörü kullanılarak hazırlanan bu projede hareket algılandığında buzzer devreye girerek sesli alarm verir. Basit ve düşük maliyetli bir güvenlik sistemi uygulamasıdır. (Görseller temsilidir yazılara göre bağlayınız)

4.4(10)
15
Alev ve Gaz Sensörü Alarm
#52İleri
Premium

Alev ve Gaz Sensörü Alarm

Gaz kaçtığında ya da bir yerde alev çıktığında seni hemen uyaran küçük bir bekçi. Gaz sensörü havadaki gazı, alev sensörü ateşin ışığını izler; her şey yolundayken yeşil LED yanar, biri tehlike sezinc

4.8(52)
67
220V Ampülü Buton(Push) İle Yakma
#19İleri
Premium

220V Ampülü Buton(Push) İle Yakma

Butona bastığın sürece 220 voltluk gerçek bir ampul yanar, bıraktığın anda söner. Arduino'nun küçük sinyali ampulü doğrudan yakamaz; araya röle denen elektrikli bir anahtar girer ve ampulün devresini

4.4(30)
38
220V Ampülü Uzaktan Kumanda İle Yakma
#21İleri
Premium

220V Ampülü Uzaktan Kumanda İle Yakma

Kanepeden kalkmadan, televizyon kumandasıyla evdeki gerçek bir ampulü yakıp söndür. Arduino kumandadan gelen görünmez ışık sinyalini okur; açma tuşuna basınca röleyi çekip ampulü yakar, sessiz tuşuna

4.4(22)
30
Akıllı Sulama İstasyonu
#83İleri
Premium

Akıllı Sulama İstasyonu

Tatile gidince çiçeklerin kurumasın diye kendi kendine sulayan bir bahçıvan. Toprak nem sensörü toprağın ne kadar ıslak olduğunu ölçer; toprak kuruyunca Arduino su pompasını birkaç saniye çalıştırır v

5.0(42)
57