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 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.
| Özellik | Değer |
|---|---|
| Modül | SIMCom SIM800L, 2G GSM/GPRS |
| Frekans bantları | Dört bant: GSM 850, EGSM 900, DCS 1800, PCS 1900 MHz |
| Besleme gerilimi | 3,4–4,4 V (önerilen 4,0 V) |
| Tepe akım | 2 A'e kadar (yayın anındaki kısa darbeler) |
| Ortalama akım | Kapalı ~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şme | UART ve AT komutları; otomatik baud 1200–115200 |
| Lojik seviye | Çıkış 2,8 V; RXD girişi en fazla 3,1 V |
| SIM kart | Micro 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
| Pin | Görevi | Not |
|---|---|---|
| NET | Anten bağlantısı | Yay anten buraya lehimlenir; u.FL (IPEX) yuvası varsa harici anten takılır |
| VCC | Besleme (+) | 3,4–4,4 V; Arduino'nun 5V ya da 3.3V pinine bağlanmaz |
| RST | Donanımsal reset | En az 105 ms LOW çekilirse modül yeniden başlar; boş bırakılabilir |
| RXD | Modülün seri girişi | Kartın TX pinine gider; en fazla 3,1 V |
| TXD | Modülün seri çıkışı | Kartın RX pinine gider; 2,8 V seviyesindedir |
| GND | Toprak | Hem besleme kaynağına hem Arduino'ya (ortak toprak) |
| RING | Arama / SMS bildirimi | Gelen aramada LOW olur, SMS gelince 120 ms LOW darbe verir |
| DTR | Uyku kontrolü | AT+CSCLK=1 ile birlikte HIGH tutulursa modül uyur, LOW çekilince uyanır |
| MIC+ / MIC− | Mikrofon girişi | Elektret 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 yolu | Uygun mu? | Açıklama |
|---|---|---|
| Tek hücre 3,7 V LiPo ya da 18650 Li-ion pil | Evet, en kolay yol | Dolu 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ül | Evet, adaptörlü projeler için | 7–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öre | Kart üzerindeki devre gerilimi düşürür; yine de 2 A verebilen bir 5 V kaynak gerekir |
| Arduino'nun 5V pini | Hayır | 4,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 pini | Hayır | 3,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örler | Hayır | 3,3 V çıkış, modülün alt sınırının altındadır |



LED ne anlatıyor? Yanıp sönme anlamları
| LED davranışı | Anlamı | Ne yapmalı? |
|---|---|---|
| Hiç yanmıyor | Modül çalışmıyor | Beslemeyi 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ıyor | Gerilim çöküyor, modül kendini kapatıyor | Daha 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 pini | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | Harici 4,0 V (+) | Harici 4,0 V (+) | Harici 4,0 V (+) |
| GND | GND + kaynağın (−) ucu | GND + kaynağın (−) ucu | GND + kaynağın (−) ucu |
| TXD | D2 (SoftwareSerial RX) | GPIO 16 (RX2) | GP1 (UART0 RX) |
| RXD | D3, 10 kΩ + 15 kΩ bölücü üzerinden | GPIO 17 (TX2), 1 kΩ + 5,6 kΩ bölücü üzerinden | GP0 (UART0 TX), 1 kΩ + 5,6 kΩ bölücü üzerinden |
| RST | Boş bırakılabilir | Boş bırakılabilir | Boş bırakılabilir |
| NET | Anten | Anten | Anten |
AT komutlarıyla ilk test
- Modülü tablodaki gibi bağla, anteni tak ve PIN sorgusu kapalı micro SIM kartı yerleştir.
- 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.
- Aşağıdaki köprü kodunu Arduino'ya yükle; SoftwareSerial Arduino IDE ile birlikte gelir, ek kütüphane gerekmez.
- Seri Monitör'ü aç, hızı 9600 baud, satır sonunu Both NL & CR olarak seç.
- 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.
- Ardından aşağıdaki tablodaki komutlarla SIM kartı, sinyal gücünü ve şebeke kaydını sırayla kontrol et.
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 cevap | Anlamı |
|---|---|---|
| AT | OK | Modül çalışıyor ve hız eşleşti |
| AT+CPIN? | +CPIN: READY | SIM hazır; SIM PIN görürsen PIN'i kapat ya da AT+CPIN="1234" gönder |
| AT+CSQ | +CSQ: 18,0 | Sinyal gücü 0–31 arası (99 = bilinmiyor); 10 ve üzeri yeterli |
| AT+CREG? | +CREG: 0,1 | 1 = 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,4012 | Besleme gerilimi, milivolt (burada 4,012 V) |
| AT+GSN | 15 haneli sayı | Modülün IMEI numarası |
| AT+CCID | 19–20 haneli sayı | SIM kartın seri numarası (ICCID); kartın okunduğunu gösterir |
| AT+CMGF=1 | OK | SMS için metin modu |
| AT+CMGS="+905551112233" | > | Mesaj metnini bekler; Ctrl+Z (26) ile gönderilir |
| AT+CNMI=1,2,0,0,0 | OK | Gelen SMS'i saklamadan doğrudan seri porta yazar |
| ATD+905551112233; | OK | Sesli arama başlatır (sondaki ; şart) |
| ATA / ATH | OK | Gelen aramayı açar / aramayı kapatır |
| AT+CLIP=1 | OK | Gelen aramada arayan numarayı +CLIP satırıyla gösterir |
| AT+IPR=9600 | OK | Hızı otomatik yerine 9600 baud'a sabitler; kalıcı olması için ardından AT&W gönder |
| AT+CMEE=2 | OK | Hataları 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:
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.
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.
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? |
|---|---|
| ATE0 | Modülün gönderdiğin komutu geri yansıtmasını (yankı) kapatır; gelen satırlar sadeleşir |
| AT+CNMI=1,2,0,0,0 | Yeni SMS'i bir +CMT satırı ve hemen ardından mesaj metni olarak seri porta yazar |
| AT+CLIP=1 | Gelen 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 |
| ATH | Gelen aramayı açmadan sonlandırır |
| RELAY_ON | Düşük seviyede tetiklenen (active-low) röle modüllerinde LOW yapılır |
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:
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.

| T-Call tanımı | GPIO | Görevi |
|---|---|---|
| MODEM_PWRKEY | 4 | 1 saniyelik LOW darbesiyle modemi açar |
| MODEM_RST | 5 | Modem reseti; HIGH tutulur |
| MODEM_POWER_ON | 23 | HIGH yapılınca modemin beslemesini açar |
| MODEM_TX | 27 | ESP32'den modemin RXD girişine |
| MODEM_RX | 26 | Modemin TXD çıkışından ESP32'ye |
| I2C SDA / SCL | 21 / 22 | IP5306 güç yongası (adres 0x75) |
| LED | 13 | Kart üzerindeki kullanıcı LED'i |
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.
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 = TrueSIM800L 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
| Belirti | Olası neden | Çözüm |
|---|---|---|
| AT yazınca hiç cevap yok | TXD ve RXD ters, GND ortak değil, satır sonu ayarı yanlış ya da otomatik baud eşleşmedi | TXD'yi D2'ye bağla, GND'leri birleştir, Both NL & CR seç, AT'yi birkaç kez gönder |
| Anlamsız karakterler geliyor | Baud hızı uyuşmuyor ya da gerilim seviyesi sınırda | Seri 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ıyor | Gerilim kayıt anında 3,4 V'un altına iniyor | 2 A verebilen kaynak, 1000 µF kondansatör, kısa ve kalın kablolar |
| Seri porta UNDER-VOLTAGE POWER DOWN düşüyor | Besleme 3,4 V'un altına indi | Pili şarj et ya da buck çıkışını 4,0–4,1 V'a ayarla |
| OVER-VOLTAGE WARNNING ya da OVER-VOLTAGE POWER DOWN | Gerilim 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üyor | Anten yok, SIM okunmuyor, PIN açık ya da bölgede 2G yok | Anteni tak, AT+CPIN? ve AT+CSQ ile kontrol et, telefonla 2G kapsamasını dene |
| +CREG: 0,3 cevabı | Şebeke kaydı reddetti | Hattın açık olduğunu ve IMEI'nin engelli olmadığını kontrol et |
| SMS gitmiyor, +CMS ERROR geliyor | Bakiye yok, numara biçimi yanlış ya da SMS merkezi numarası eksik | Bakiyeyi kontrol et, numarayı ülke koduyla yaz, AT+CSCA? ile SMS merkezini gör |
| Arduino SMS gönderirken resetleniyor | SIM800L ile Arduino aynı zayıf kaynaktan besleniyor | Kaynakları ayır, yalnızca GND'leri birleştir |
| Gelen SMS seri porta düşmüyor | AT+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 |
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.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
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

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

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

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)

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

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

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

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
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 160'tan fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

