LoRa Arduino: SX1278 Ra-02 ile Kilometrelerce Kablosuz Haberleşme
LoRa Arduino rehberi: SX1278 Ra-02 bağlantısı, SF ve BW ayarları, verici ve alıcı kodu, ESP32 ve Pico, 3,3 V uyarısı, menzil testi, LoRaWAN ve TTN farkı.
LoRa Arduino projeleri, iki kart arasında kilometrelerce uzağa, çok az enerjiyle ve internet ya da SIM kart olmadan veri göndermenin en pratik yoludur. LoRa (Long Range), Semtech firmasının geliştirdiği bir radyo modülasyonudur; SX1278 yongalı Ra-02 gibi ucuz modüllerle 433 MHz'te şehir içinde 1–3 km, açık arazide 10 km'ye varan menzile ulaşabilirsin. Karşılığında hız düşüktür: saniyede birkaç yüz bayt ile birkaç kilobit arası. Bu yüzden LoRa ses ya da görüntü için değil, sıcaklık, nem, su seviyesi, kapı durumu ya da GPS konumu gibi küçük ölçümleri uzaktan taşımak için idealdir.
Bu rehberde LoRa'nın nasıl bu kadar uzağa gidebildiğini, menzili belirleyen SF, BW ve CR ayarlarını, bölgene göre doğru frekansı, Ra-02 modülünü Arduino Uno, ESP32 ve Raspberry Pi Pico'ya bağlamayı, LoRa kütüphanesiyle verici ve alıcı kodunu, RSSI ve SNR değerlerini okumayı ve gerçek bir menzil testini adım adım göreceksin. Son bölümlerde LoRa ile LoRaWAN arasındaki farkı, The Things Network'ü (TTN) ve aylarca pille çalışan bir tarla sensörü projesini anlatıyoruz.
LoRa nedir, nasıl bu kadar uzağa gider?
LoRa, chirp yayılı spektrum (CSS) adı verilen bir teknik kullanır. Her sembol, frekansı bant içinde sürekli yükselen bir "cıvıltı" (chirp) olarak gönderilir; bilgi, bu cıvıltının hangi frekanstan başladığına gizlenir. Alıcı gelen sinyali bilinen cıvıltı şekliyle çarpıp topladığında gürültü birbirini götürür, sinyal ise birikir. Bu sayede LoRa, gürültü seviyesinin 20 dB altına kadar inen sinyalleri bile çözebilir. Sıradan 433 MHz ASK modülleri sinyalin gürültüden belirgin şekilde güçlü olmasını isterken LoRa neredeyse duyulmayan sinyalleri anlamlandırır; aynı çıkış gücüyle çok daha uzağa gitmesinin sırrı budur.
Bunun bedeli zamandır: bir cıvıltı ne kadar uzun sürerse alıcı o kadar fazla enerji toplar ve menzil artar, ama aynı veri o kadar yavaş gönderilir. LoRa'da menzil, hız ve pil ömrü her zaman birbirine bağlıdır. 20 baytlık bir ölçüm paketi en hızlı ayarda yaklaşık 57 milisaniyede, en uzun menzilli ayarda ise 1,3 saniyede gönderilir. Aşağıdaki tablo LoRa'yı Arduino dünyasındaki diğer kablosuz seçeneklerle karşılaştırıyor.
| Özellik | LoRa (SX1278) | nRF24L01 | 433 MHz ASK | Wi-Fi (ESP32) |
|---|---|---|---|---|
| Tipik menzil | 1–3 km şehir, 10 km'ye kadar açık alan | 50–100 m (PA+LNA ile ~1 km) | 20–100 m | 50–100 m (modeme kadar) |
| Veri hızı | 0,3–5,5 kbit/s (125 kHz) | 250 kbit/s – 2 Mbit/s | 1–10 kbit/s | Mbit/s düzeyi |
| Verici akımı | 40–120 mA (güce göre) | 11–12 mA | 10–40 mA | 120–240 mA |
| Uyku akımı | 1 µA altı | 1 µA civarı | Yok (kapatılır) | 10 µA (deep sleep) |
| Çift yönlü | Evet | Evet | Hayır (verici ve alıcı ayrı) | Evet |
| Altyapı | Gerekmez | Gerekmez | Gerekmez | Modem ve internet |
LoRa modülleri: Ra-02, RFM95, E32 ve hazır kartlar
Piyasadaki LoRa modüllerinin çoğunda Semtech'in SX127x ailesinden bir yonga vardır. SX1276 137–1020 MHz arasını, SX1278 ise 137–525 MHz arasını kapsar; bu yüzden 433 MHz modüllerinde SX1278, 868/915 MHz modüllerinde SX1276 görürsün. Modüller SPI ile konuşan "çıplak" radyolar ve kendi işlemcisi olup UART ile seri port gibi kullanılan hazır modüller olarak ikiye ayrılır.
| Modül | Yonga | Frekans | Arayüz | Not |
|---|---|---|---|---|
| Ai-Thinker Ra-02 | SX1278 | 433 MHz | SPI | En ucuz ve yaygın; IPEX anten konnektörlü |
| Ai-Thinker Ra-01 | SX1278 | 433 MHz | SPI | Ra-02'nin yay antenli sürümü |
| HopeRF RFM95W | SX1276 | 868 / 915 MHz | SPI | LoRaWAN ve TTN için sık tercih edilir |
| Ebyte E32 / E220 | SX1278 / LLCC68 | 433 / 868 MHz | UART | Kendi işlemcisi var; kütüphanesiz seri port gibi çalışır |
| TTGO LoRa32, Heltec LoRa 32 | ESP32 + SX1276/78 | 433 / 868 / 915 MHz | Kart üstünde | ESP32, LoRa ve OLED tek kartta |
| Ra-02 özelliği | Değer |
|---|---|
| Yonga | Semtech SX1278 |
| Frekans aralığı | 410–525 MHz (genellikle 433 MHz kullanılır) |
| En yüksek çıkış gücü | +18 dBm (yaklaşık 63 mW) |
| Alıcı hassasiyeti | -141 dBm'e kadar (en düşük bant genişliğinde) |
| Besleme | 1,8–3,7 V, tipik 3,3 V |
| Akım | Gönderirken yaklaşık 40–120 mA, dinlerken yaklaşık 12 mA, uykuda 1 µA altı |
| Arayüz | SPI (en fazla 10 MHz) + DIO0 kesme pini |
| Anten | IPEX (U.FL) konnektörü, 433 MHz anten gerekir |
Hangi frekans: 433 MHz mi, 868 MHz mi?
LoRa lisanssız ISM bantlarında çalışır, ama bu bantlar ülkeden ülkeye değişir ve her birinin güç ile kullanım oranı (duty cycle) sınırı vardır. Türkiye ve Avrupa'da LoRa için iki bant kullanılır: 433,05–434,79 MHz ve 863–870 MHz. LoRaWAN ağları ve TTN Avrupa'da 868 MHz'i kullanır; 433 MHz ise noktadan noktaya hobi bağlantıları için ucuz Ra-02 modülleriyle çok yaygındır. Modülü satın almadan önce bölgeni kontrol et, çünkü anten ve yonga belirli bir frekansa göre ayarlanmıştır; 868 MHz'lik bir modül 433 MHz'te çalışmaz.
| Bölge | LoRa frekansı | LoRaWAN planı |
|---|---|---|
| Türkiye, Avrupa | 433 MHz ve 863–870 MHz | EU868 (EU433 nadir) |
| ABD, Kanada, Meksika | 902–928 MHz | US915 |
| Brezilya, Arjantin, Avustralya | 915–928 MHz | AU915 |
| Hindistan | 865–867 MHz | IN865 |
| Japonya, Güneydoğu Asya | 920–923 MHz | AS923 |
| Çin | 470–510 MHz (ve 433 MHz) | CN470 |
SF, BW ve CR: menzili belirleyen üç ayar
LoRa'da menzili ve hızı üç parametre belirler. Spreading Factor (SF), her sembolün kaç "chip"ten oluşacağını seçer: SF7'den SF12'ye her adımda sembol süresi iki katına çıkar, alıcı yaklaşık 2,5 dB daha zayıf sinyali çözebilir, ama havada kalma süresi de neredeyse ikiye katlanır. Aşağıdaki tablo 125 kHz bant genişliği, 4/5 kodlama ve 20 baytlık bir paket için hesaplanmıştır; son sütun, %1 kullanım oranı kuralına uymak için iki paket arasında beklemen gereken en kısa süredir.
| SF | Bit hızı | 20 bayt paket süresi | Yaklaşık hassasiyet | Çözülebilen en düşük SNR | %1 kuralında bekleme |
|---|---|---|---|---|---|
| SF7 | 5,5 kbit/s | 57 ms | -123 dBm | -7,5 dB | 6 sn |
| SF8 | 3,1 kbit/s | 103 ms | -126 dBm | -10 dB | 10 sn |
| SF9 | 1,8 kbit/s | 185 ms | -129 dBm | -12,5 dB | 18 sn |
| SF10 | 977 bit/s | 371 ms | -132 dBm | -15 dB | 37 sn |
| SF11 | 537 bit/s | 741 ms | -134 dBm | -17,5 dB | 73 sn |
| SF12 | 293 bit/s | 1319 ms | -137 dBm | -20 dB | 131 sn |
Bandwidth (BW) sinyalin kapladığı frekans genişliğidir: 125 kHz standarttır; 250 ve 500 kHz hızı iki ve dört katına çıkarır ama hassasiyeti 3 ve 6 dB düşürür, 62,5 kHz ve altı ise menzili artırır ama ucuz kristallerin frekans kaymasına karşı hassaslaşır. Coding Rate (CR) hata düzeltme payıdır: 4/5 her 4 bite 1 düzeltme biti ekler, 4/8 ise 4 bit ekler; parazitli ortamda işe yarar ama paketi uzatır. Bit hızının formülü Rb = SF × (BW / 2^SF) × 4 / (4 + CR) şeklindedir; SF9, 125 kHz ve 4/5 için 9 × 125000 / 512 × 0,8 ≈ 1758 bit/s eder.
Ra-02 bağlantısı: Arduino Uno, ESP32 ve Pico
Ra-02, SPI veri yolunun dört hattına (SCK, MISO, MOSI, NSS) ek olarak bir reset ve bir kesme (DIO0) pini ister. DIO0, paket gönderimi bittiğinde ya da yeni paket geldiğinde HIGH olur; LoRa kütüphanesi bunu kesme olarak kullanır. Modülün DIO1–DIO5 pinleri bu rehberdeki kodlar için boşta kalabilir. SPI'yi tanımıyorsan önce SPI nedir yazısına göz atabilirsin.
| Ra-02 pini | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| 3.3V | Harici 3,3 V regülatör | 3V3 | 3V3 (OUT) |
| GND | GND | GND | GND |
| SCK | D13 (seviye dönüştürücüyle) | GPIO 18 | GP18 |
| MISO | D12 (doğrudan) | GPIO 19 | GP16 |
| MOSI | D11 (seviye dönüştürücüyle) | GPIO 23 | GP19 |
| NSS | D10 (seviye dönüştürücüyle) | GPIO 5 | GP17 |
| RESET | D9 (seviye dönüştürücüyle) | GPIO 14 | GP20 |
| DIO0 | D2 (doğrudan, kesme pini) | GPIO 26 | GP21 |
Anten konusu da en az bağlantı kadar önemlidir. Ra-02'nin IPEX konnektörüne 433 MHz için ayarlanmış bir anten takmalısın. Kendi antenini yapmak çok kolaydır: dalga boyu 300 / 433 = 0,693 metredir ve çeyrek dalga anten için 17,3 cm'lik düz bir tel yeterlidir (868 MHz için 8,6 cm). Anteni dik tut, metal kutunun içine koyma ve iki taraftaki antenlerin aynı yönde (ikisi de dik) olmasına dikkat et; ters yönde duran antenler sinyalin büyük kısmını kaybettirir.
Adım adım: LoRa kütüphanesiyle verici
- Arduino IDE'de Kütüphane Yöneticisi'ni aç, LoRa yaz ve Sandeep Mistry'nin LoRa kütüphanesini kur.
- Modülü tablodaki gibi bağla, anteni takmadan asla gönderim yapma.
- Aşağıdaki kodu verici olacak karta yükle; kod kartın ESP32 mi Uno mu olduğunu kendisi anlar ve pinleri ona göre seçer.
- Seri Monitör'ü 115200 baud'da aç; her 5 saniyede bir "Gonderildi" satırı görmelisin.
- LoRa.begin() başarısız oluyorsa kabloları, 3,3 V beslemeyi ve NSS ile RESET pinlerini kontrol et.
1#include <SPI.h>
2#include <LoRa.h>
3
4#if defined(ESP32)
5const int PIN_SS = 5, PIN_RST = 14, PIN_DIO0 = 26; // ESP32 (VSPI: SCK 18, MISO 19, MOSI 23)
6#else
7const int PIN_SS = 10, PIN_RST = 9, PIN_DIO0 = 2; // Uno (SCK 13, MISO 12, MOSI 11) + seviye dönüştürücü / level shifter
8#endif
9
10const long FREKANS = 433E6; // Ra-02: 433 MHz; RFM95 için 868E6 / 868E6 for an RFM95
11unsigned long sayac = 0;
12
13void setup() {
14 Serial.begin(115200);
15 LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);
16 if (!LoRa.begin(FREKANS)) { // SX1278 bulunamadı / SX1278 not found
17 Serial.println("LoRa baslatilamadi / LoRa init failed");
18 while (true) delay(1000);
19 }
20 LoRa.setSpreadingFactor(9); // SF9: menzil ile hız dengesi / range vs speed balance
21 LoRa.setSignalBandwidth(125E3); // 125 kHz bant genişliği / bandwidth
22 LoRa.setCodingRate4(5); // hata düzeltme 4/5 / error coding 4/5
23 LoRa.setSyncWord(0xF3); // iki tarafta aynı olmalı / must match on both sides
24 LoRa.enableCrc(); // bozuk paketi ele / drop corrupted packets
25 LoRa.setTxPower(10); // 10 dBm (433 MHz bandında yasal sınır) / legal limit on 433 MHz
26 Serial.println("Verici hazir / sender ready");
27}
28
29void loop() {
30 LoRa.beginPacket();
31 LoRa.print("BG #");
32 LoRa.print(sayac); // paket numarası / packet number
33 LoRa.endPacket(); // gönderim bitene kadar bekler / blocks until sent
34 Serial.print("Gonderildi / sent #");
35 Serial.println(sayac);
36 sayac++;
37 delay(5000); // havada kalma süresine göre bekle / wait according to airtime
38}
39| Fonksiyon | Ne yapar? |
|---|---|
| LoRa.setPins(ss, reset, dio0) | NSS, RESET ve DIO0 pinlerini tanımlar; begin()'den önce çağrılır |
| LoRa.begin(433E6) | Modülü başlatır ve frekansı Hz cinsinden ayarlar; yonga bulunamazsa 0 döner |
| setSpreadingFactor(6–12) | SF ayarı, varsayılan 7 |
| setSignalBandwidth(125E3) | Bant genişliği, varsayılan 125 kHz |
| setCodingRate4(5–8) | Kodlama oranı 4/5 – 4/8, varsayılan 4/5 |
| setSyncWord(0xF3) | Eşleme kelimesi, varsayılan 0x12 (LoRaWAN 0x34 kullanır) |
| enableCrc() | Pakete CRC ekler; kütüphanede varsayılan olarak kapalıdır |
| setTxPower(2–20) | Çıkış gücü dBm, varsayılan 17 |
| beginPacket() / print() / endPacket() | Paketi hazırlar, yazar ve gönderir |
Alıcı: paketi okumak, RSSI ve SNR
Alıcı kodu her döngüde LoRa.parsePacket() ile yeni paket olup olmadığına bakar; paket varsa boyutunu döndürür ve içeriği LoRa.read() ile bayt bayt okunur. Kod ayrıca paket numaralarındaki atlamaları sayarak kayıp oranını hesaplar; bu, birazdan yapacağımız menzil testinin temelidir.
1#include <SPI.h>
2#include <LoRa.h>
3
4#if defined(ESP32)
5const int PIN_SS = 5, PIN_RST = 14, PIN_DIO0 = 26;
6#else
7const int PIN_SS = 10, PIN_RST = 9, PIN_DIO0 = 2;
8#endif
9
10long sonNo = -1; // son alınan paket numarası / last packet number
11unsigned long alinan = 0, kayip = 0;
12
13void setup() {
14 Serial.begin(115200);
15 LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);
16 if (!LoRa.begin(433E6)) {
17 Serial.println("LoRa baslatilamadi / LoRa init failed");
18 while (true) delay(1000);
19 }
20 LoRa.setSpreadingFactor(9); // verici ile aynı ayarlar / same settings as the sender
21 LoRa.setSignalBandwidth(125E3);
22 LoRa.setCodingRate4(5);
23 LoRa.setSyncWord(0xF3);
24 LoRa.enableCrc();
25 Serial.println("Alici hazir / receiver ready");
26}
27
28void loop() {
29 int boyut = LoRa.parsePacket(); // paket geldi mi? / did a packet arrive?
30 if (boyut == 0) return;
31
32 String mesaj = "";
33 while (LoRa.available()) mesaj += (char)LoRa.read();
34
35 int diyez = mesaj.indexOf('#'); // "BG #123" içinden numara / number from "BG #123"
36 long no = (diyez >= 0) ? mesaj.substring(diyez + 1).toInt() : -1;
37 if (sonNo >= 0 && no > sonNo + 1) kayip += no - sonNo - 1; // atlanan numaralar kayıp / skipped numbers are lost
38 if (no >= 0) sonNo = no;
39 alinan++;
40
41 Serial.print(mesaj);
42 Serial.print(" RSSI: ");
43 Serial.print(LoRa.packetRssi()); // dBm, -120'ye yaklaştıkça zayıf / weaker towards -120
44 Serial.print(" dBm SNR: ");
45 Serial.print(LoRa.packetSnr(), 1); // dB, eksi değerler de çözülebilir / negative values still decode
46 Serial.print(" dB kayip / lost: ");
47 Serial.print(100.0 * kayip / (alinan + kayip), 1);
48 Serial.println(" %");
49}
50RSSI (Received Signal Strength Indicator), alınan sinyalin gücüdür ve dBm cinsinden eksi bir sayıdır: -40 dBm çok güçlü, -120 dBm çok zayıftır. SNR (Signal to Noise Ratio) ise sinyalin gürültüden ne kadar güçlü olduğunu gösterir. LoRa'nın özel tarafı SNR'nin eksiye düşmesine izin vermesidir: SF9'da -12,5 dB'e kadar paketler hâlâ çözülür. Menzilin sınırına yaklaşıp yaklaşmadığını anlamak için RSSI'den çok SNR'ye bak; gürültülü bir şehirde RSSI -100 dBm iken bile SNR sınıra dayanmış olabilir.
| Ölçüm | Değer | Anlamı |
|---|---|---|
| RSSI | -30 ile -70 dBm | Çok güçlü; modüller yakın |
| RSSI | -70 ile -110 dBm | İyi, kararlı bağlantı |
| RSSI | -110 ile -125 dBm | Zayıf; SF'yi artırmayı düşün |
| SNR | +5 dB ve üstü | Rahat; daha düşük SF ile hız kazanabilirsin |
| SNR | 0 ile -10 dB | Normal LoRa çalışma bölgesi |
| SNR | SF sınırına yakın (SF9'da -12 dB) | Kopmak üzere; SF'yi artır ya da anteni iyileştir |
ESP32 ile LoRa: Wi-Fi'ye köprü

ESP32, LoRa için en rahat karttır: pinleri zaten 3,3 V'tur, 3V3 pini modülün akımını karşılar ve VSPI hattı (GPIO 18, 19, 23) doğrudan kullanılır. Yukarıdaki verici ve alıcı kodları ESP32'de değişiklik yapmadan derlenir; kod #if defined(ESP32) satırıyla NSS = 5, RESET = 14 ve DIO0 = 26 pinlerini seçer. DIO0'ı GPIO 2 yerine 26'ya bağlamamızın sebebi, GPIO 2'nin açılışta durumunu kontrol eden bir strapping pini olmasıdır. ESP32'nin asıl gücü köprü olmasıdır: tarladaki sensörlerden LoRa ile gelen veriyi Wi-Fi üzerinden bir web sayfasına, MQTT sunucusuna ya da Telegram'a aktarabilir. TTGO LoRa32 ve Heltec LoRa 32 gibi kartlarda ESP32, LoRa yongası ve bir OLED ekran tek kartta gelir; bu kartlarda pin numaraları farklıdır, kartın şemasına bakmalısın.
Raspberry Pi Pico ile LoRa (MicroPython)
Pico'da Ra-02'yi SPI0 hattına bağlarsın (GP16 MISO, GP18 SCK, GP19 MOSI, GP17 NSS). MicroPython'un resmi micropython-lib deposunda SX127x yongaları için bir LoRa sürücüsü vardır; Thonny'nin paket yöneticisinden ya da mpremote mip install lora-sync lora-sx127x komutuyla kurabilirsin. Sürücü ayarları bir sözlükle alır; SF, bant genişliği ve sync word Arduino tarafıyla aynı olduğu sürece Pico, yukarıdaki Arduino vericisinin paketlerini sorunsuz okur. Sürücüde SNR değeri yonganın kaydındaki gibi 4 katı olarak gelir, bu yüzden kodda 4'e bölünür. Ra-02'nin anteni yonganın PA_BOOST çıkışına bağlı olduğundan tx_ant ayarı "PA_BOOST" olmalıdır; aksi hâlde gönderim çok zayıf kalır.
1from machine import Pin, SPI
2from lora import SX1278 # mip: lora-sync + lora-sx127x paketleri / packages
3import time
4
5lora_cfg = {
6 "freq_khz": 433000, # Ra-02: 433 MHz
7 "sf": 9, # Arduino tarafıyla aynı / same as the Arduino side
8 "bw": "125", # kHz
9 "coding_rate": 5, # 4/5
10 "preamble_len": 8,
11 "syncword": 0xF3,
12 "tx_ant": "PA_BOOST", # Ra-02 anteni PA_BOOST çıkışında / Ra-02 antenna is on PA_BOOST
13 "output_power": 10, # dBm
14}
15
16spi = SPI(0, baudrate=2_000_000, sck=Pin(18), mosi=Pin(19), miso=Pin(16))
17modem = SX1278(spi=spi, cs=Pin(17), dio0=Pin(21), reset=Pin(20), lora_cfg=lora_cfg)
18
19while True:
20 paket = modem.recv(timeout_ms=10000) # 10 sn dinle / listen for 10 s
21 if paket and paket.valid_crc:
22 # snr kayıtta 4 katı tutulur / snr is stored as 4x in the register
23 print(bytes(paket), "RSSI:", paket.rssi, "dBm SNR:", paket.snr / 4, "dB")
24 elif paket:
25 print("CRC hatali paket / bad CRC")
26 else:
27 print("Paket yok / no packet")
28 time.sleep_ms(10)
29Menzil testi: LoRa kaç km gider?
Gerçek menzili öğrenmenin tek yolu denemektir. Vericiyi evde bir pencerenin önüne ya da çatıya yerleştir, alıcıyı bir dizüstü bilgisayara ya da powerbank ile beslenen bir ESP32 + OLED'e bağla ve uzaklaşırken RSSI, SNR ve kayıp oranını not al. Kayıp oranı %10'u geçtiğinde ya da SNR SF sınırına yaklaştığında pratik menzilin sonuna gelmişsindir. Her denemede yalnızca bir şeyi değiştir (SF, anten, yükseklik) ki farkın nereden geldiğini görebilesin. Telefondaki harita uygulamasıyla iki nokta arasındaki kuş uçuşu mesafeyi ölçebilirsin.
| Ortam | Tipik menzil (Ra-02, SF9–SF12, basit anten) | Belirleyici etken |
|---|---|---|
| Ev ve bina içi | Birkaç kat, 100–500 m | Beton duvar ve metal |
| Yoğun şehir | 1–3 km | Binalar, görüş hattı yok |
| Banliyö, köy | 3–6 km | Ağaçlar ve tek katlı yapılar |
| Açık arazi, tarla | 5–10 km | Antenin yerden yüksekliği |
| Tepeden tepeye görüş hattı | 15 km ve üstü | Dünyanın eğriliği ve anten kazancı |
- Anteni yükselt: Menzili en çok artıran şey antenin yüksekliğidir. Yerden 1 metre yerine 5 metre yukarıdaki bir anten, görüş hattını kat kat uzatır.
- Doğru anten: Modülle gelen küçük yay antenler kolaydır ama verimsizdir; 17,3 cm'lik çeyrek dalga tel ya da dış mekân çubuk anten belirgin fark yaratır.
- SF'yi artır: SF9'dan SF12'ye çıkmak yaklaşık 8 dB kazanç sağlar; bu, açık alanda mesafenin kabaca iki katından fazlası demektir.
- Bant genişliğini daralt: 125 kHz'ten 62,5 kHz'e inmek 3 dB kazandırır, ama iki modülün kristal kayması sorun çıkarabilir.
- Fresnel bölgesini boşalt: Görüş hattı açık görünse bile iki anten arasındaki elips şeklindeki alanda ağaç ya da bina varsa sinyal zayıflar; antenleri biraz daha yükseltmek bunu çözer.
- Güç kaynağını ihmal etme: Gönderim anındaki akım çekişi zayıf bir 3,3 V hattında gerilimi düşürüp modülü sıfırlayabilir; beslemeye 100 µF kondansatör ekle.
LoRa ve LoRaWAN farkı, TTN nedir?
Bu iki kavram sık karıştırılır. LoRa yalnızca radyo modülasyonudur, yani fiziksel katmandır: iki modül birbirine doğrudan paket gönderir, kimin kime ne gönderdiğini sen belirlersin. Bu rehberdeki tüm örnekler noktadan noktaya LoRa'dır. LoRaWAN ise LoRa'nın üzerine kurulmuş bir ağ protokolüdür: cihazlar (end node) paketlerini çevredeki gateway'lere gönderir, gateway'ler internet üzerinden bir ağ sunucusuna aktarır, veri oradan senin uygulamana gelir. LoRaWAN; cihaz kimlikleri, AES-128 şifreleme, frekans ve SF'nin otomatik ayarlanması (ADR) ve kullanım oranı kurallarını kendisi yönetir.
| Özellik | LoRa (noktadan noktaya) | LoRaWAN |
|---|---|---|
| Katman | Yalnızca radyo (fiziksel katman) | Radyo + ağ protokolü (MAC) |
| Altyapı | İki modül yeter | Gateway ve ağ sunucusu gerekir |
| Şifreleme | Yok, kendin eklersin | AES-128, zorunlu |
| Arduino kütüphanesi | LoRa (Sandeep Mistry) | MCCI LoRaWAN LMIC, RadioLib |
| Avrupa frekansı | 433 ya da 868 MHz serbest | EU868 kanal planı |
| Uygun olduğu iş | Kendi bahçen, iki bina arası, kumanda | Şehir çapında sensör ağları, çok sayıda cihaz |
The Things Network (TTN), gönüllülerin kurduğu gateway'lerden oluşan ücretsiz ve topluluk temelli bir LoRaWAN ağıdır. Yakınında bir TTN gateway'i varsa kendi gateway'ini kurmadan cihazını kaydedip verilerini internetten okuyabilirsin. Ücretsiz kullanımda adil kullanım kuralları vardır: cihaz başına günde toplam yaklaşık 30 saniye gönderim süresi ve günde en fazla 10 aşağı yönlü mesaj. Avrupa'daki TTN EU868 kullandığı için 433 MHz Ra-02 bu ağa uygun değildir; TTN için 868 MHz'lik RFM95 ya da hazır bir LoRaWAN modülü almalısın. Yakında gateway yoksa noktadan noktaya LoRa çok daha basittir.
Proje: pille çalışan tarla ve bahçe sensörü

LoRa'nın en klasik kullanımı, elektrik ve Wi-Fi'nin olmadığı bir tarladan ya da bahçenin ucundaki seradan veri almaktır. Aşağıdaki ESP32 kodu toprak nemini ölçer, "T1,42,37" biçiminde (düğüm kimliği, paket numarası, nem yüzdesi) küçük bir paket gönderir, sonra hem LoRa modülünü hem ESP32'yi uyutur ve 10 dakika sonra yeniden uyanır. Sensör yalnızca ölçüm sırasında GPIO 25 üzerinden beslenir; böylece uykuda akım harcamaz ve kapasitif olmayan sensörlerde elektrot aşınması da azalır. Sensörün kalibrasyonu Toprak Nem Sensörü yazısında; derin uykunun ayrıntıları ESP32 Deep Sleep yazısında. Evdeki alıcı, yukarıdaki alıcı kodunu virgüllerden ayırarak kullanabilir.
1#include <SPI.h>
2#include <LoRa.h>
3
4const int PIN_SS = 5, PIN_RST = 14, PIN_DIO0 = 26;
5const int NEM_PIN = 34; // toprak nem sensörü AO (yalnız giriş pini) / soil sensor AO (input-only pin)
6const int SENSOR_GUC = 25; // sensörü yalnız ölçerken besle / power the sensor only while measuring
7const int KURU = 3000, ISLAK = 1200; // kendi sensörünle kalibre et / calibrate with your sensor
8const uint64_t UYKU_US = 10ULL * 60 * 1000000; // 10 dakika / 10 minutes
9
10RTC_DATA_ATTR uint32_t paketNo = 0; // derin uykuda korunur / kept during deep sleep
11
12void setup() {
13 pinMode(SENSOR_GUC, OUTPUT);
14 digitalWrite(SENSOR_GUC, HIGH);
15 delay(200); // sensör otursun / let the sensor settle
16 int ham = analogRead(NEM_PIN);
17 digitalWrite(SENSOR_GUC, LOW);
18 int nem = constrain(map(ham, KURU, ISLAK, 0, 100), 0, 100); // % nem / % moisture
19
20 LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);
21 if (LoRa.begin(433E6)) {
22 LoRa.setSpreadingFactor(10); // uzak tarla için daha yüksek SF / higher SF for a distant field
23 LoRa.setSignalBandwidth(125E3);
24 LoRa.setSyncWord(0xF3);
25 LoRa.enableCrc();
26 LoRa.setTxPower(10);
27 LoRa.beginPacket();
28 LoRa.print("T1,"); // düğüm kimliği / node id
29 LoRa.print(paketNo++);
30 LoRa.print(",");
31 LoRa.print(nem); // ör. "T1,42,37" / e.g. "T1,42,37"
32 LoRa.endPacket();
33 LoRa.sleep(); // SX1278 uykuda 1 uA altı / under 1 uA asleep
34 }
35 esp_sleep_enable_timer_wakeup(UYKU_US);
36 esp_deep_sleep_start(); // 10 dk sonra setup() baştan başlar / setup() restarts after 10 min
37}
38
39void loop() {}
40Pil ömrünü kabaca hesaplayalım. Düğüm her 10 dakikada (600 saniyede) yaklaşık 0,5 saniye uyanır ve bu sürede ortalama 100 mA çeker; uykuda çıplak bir ESP32 modülü ve Ra-02 birlikte 15 µA civarındadır. Ortalama akım (0,5 × 100) / 600 + 0,015 ≈ 0,1 mA eder; 2000 mAh'lik bir 18650 pil teoride 20.000 saat, yani iki yıldan fazla dayanır. Gerçekte pilin kendi kendine boşalması ve regülatör kayıpları bu süreyi kısaltır. Dikkat: hazır ESP32 DevKit kartları üzerindeki USB-seri yonga ve regülatör yüzünden uykuda bile birkaç miliamper çekebilir; 5 mA'lik bir uyku akımı aynı pili 17 güne indirir. Uzun pil ömrü için düşük kayıplı bir regülatör ya da çıplak modül kullan. Hesabı kendi değerlerinle pil ömrü hesaplayıcısında yapabilirsin.
LoRa ile proje fikirleri
- Uzak su deposu seviyesi: Köydeki deponun doluluk oranını su seviye sensörüyle ölçüp eve gönder.
- Posta kutusu bildirimi: Bahçe kapısındaki posta kutusu açılınca reed röle ile algıla ve içerideki ekranda göster.
- Arı kovanı terazisi: HX711 yük hücresiyle kovanın ağırlığını günde birkaç kez gönder.
- GPS takip: Bir NEO-6M GPS ile bisikletin ya da hayvanların konumunu kilometrelerce öteden izle.
- Sera iklim kontrolü: Seradaki sıcaklık ve nemi LoRa ile al, eşik aşılınca evden uyarı ver.
- Kendi gateway'in: Birkaç LoRa sensöründen gelen veriyi tek bir ESP32 ile Wi-Fi'ye aktarıp telefondan izle.
Sık yapılan hatalar ve çözümleri
| Belirti | Olası neden | Çözüm |
|---|---|---|
| "LoRa baslatilamadi" | SPI kablosu, NSS ya da RESET pini yanlış; besleme yok | Bağlantıları ve setPins() değerlerini kontrol et, 3,3 V'u ölç |
| Verici gönderiyor, alıcı hiçbir şey görmüyor | Frekans, SF, BW, CR ya da sync word farklı | İki taraftaki ayarları birebir eşitle |
| Modül ısınıyor ya da hiç çalışmıyor | 5 V ile beslendi ya da 5 V sinyal aldı | 3,3 V besleme ve seviye dönüştürücü kullan; modül zarar görmüş olabilir |
| Gönderim anında kart resetleniyor | 3,3 V hattı akım darbesini karşılayamıyor | Ayrı regülatör ve beslemeye 100 µF kondansatör |
| Menzil birkaç metre | Anten takılı değil ya da yanlış frekans anteni | 433 MHz anten tak; antensiz göndermek PA'yı bozabilir |
| Paketler bozuk karakterli | CRC kapalı, gürültülü paketler kabul ediliyor | İki tarafta enableCrc() çağır |
| Bazı paketler hiç gelmiyor | Paketler çok sık, havada çakışıyor | Paket aralığını havada kalma süresine göre artır |
LoRa modülü, Arduino projelerini evin dışına, tarlaya, bahçeye ve komşu binaya taşımanın en ucuz yoludur: doğru frekans, uygun SF ve iyi bir antenle kilometrelerce uzaktan pille aylarca çalışan sensörler kurabilirsin. Daha kısa mesafelerde hızlı veri gerekiyorsa nRF24L01 ya da ESP-NOW daha uygun olabilir. BlueGrays uygulamasında iki Arduino arasında tek ve çift yönlü haberleşme, akıllı sulama ve ESP32 derin uyku projelerini adım adım devre şemaları ve kodlarıyla bulabilir, LoRa'yı bu projelerin üzerine ekleyebilirsin.
Sıkça sorulan sorular
LoRa modülü kaç km menzile sahiptir?
Ra-02 gibi bir SX1278 modülü basit bir antenle şehir içinde genellikle 1–3 km, açık arazide 5–10 km menzile ulaşır. Antenler yüksekte ve arada görüş hattı varsa 15 km'nin üzerine çıkılabilir. Menzili en çok antenin yüksekliği, anten kalitesi ve SF ayarı belirler.
LoRa ile LoRaWAN arasındaki fark nedir?
LoRa yalnızca radyo modülasyonudur ve iki modül birbirine doğrudan paket gönderir. LoRaWAN ise LoRa'nın üzerine kurulmuş bir ağ protokolüdür; cihazlar gateway'lere gönderir, veri internet üzerinden bir ağ sunucusuna ulaşır, şifreleme ve cihaz yönetimi protokol tarafından yapılır. Kendi bahçen için LoRa, şehir çapında ağ için LoRaWAN uygundur.
Türkiye'de LoRa için hangi frekans kullanılır?
Türkiye'de Avrupa'daki gibi 433 MHz ve 863–870 MHz bantları kullanılır. LoRaWAN ve TTN 868 MHz'i (EU868) kullanır; noktadan noktaya hobi projelerinde ise ucuz 433 MHz Ra-02 modülleri çok yaygındır. Her iki bantta da güç ve kullanım oranı sınırları vardır.
LoRa modülü 5 V Arduino'ya bağlanır mı?
Doğrudan bağlanmaz; SX1278 3,3 V'luk bir yongadır ve 5 V sinyaller onu bozar. Arduino Uno ile kullanmak için SCK, MOSI, NSS ve RESET hatlarına seviye dönüştürücü koymalı ve modülü ayrı bir 3,3 V regülatörden beslemelisin. ESP32 ve Raspberry Pi Pico 3,3 V olduğu için doğrudan bağlanır.
LoRa ile ses ya da fotoğraf gönderilebilir mi?
Pratikte hayır. LoRa'nın veri hızı 125 kHz bant genişliğinde saniyede yaklaşık 0,3–5,5 kilobittir ve kullanım oranı kuralları sık gönderimi sınırlar. Küçük bir fotoğraf bile dakikalar sürer; LoRa sensör ölçümleri, konum ve durum bilgisi gibi küçük veriler için tasarlanmıştır.
Spreading Factor (SF) nedir, kaç olmalı?
SF, her LoRa sembolünün ne kadar uzun gönderileceğini belirler; SF7'den SF12'ye her adımda menzil artar ama veri iki kat yavaşlar ve pil daha çok harcanır. Başlangıç için SF9 iyi bir dengedir. Menzil yetmezse SF'yi artır, yakın mesafede hız gerekiyorsa SF7'ye in; verici ve alıcıda SF aynı olmalıdır.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
2 Arduino Tek Yönlü Haberleşme
İki Arduino'yu tek bir kabloyla konuşturursun: birindeki butona basınca öbüründeki LED yanar, bir daha basınca söner. Gönderen kart butona basıldığını kısa bir mesajla bildirir, alan kart bu mesajı du

2 Arduino Çift Yönlü Haberleşme
İki Arduino kabloyla birbirine bağlanıp konuşur: birinin butonuna basınca öbürünün ışığı yanar, yeniden basınca söner. İki kartta da aynı program çalışır, yani ikisi de hem haber gönderir hem haber al

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

ESP32 Deep Sleep — Pil Tasarrufu (OLED + RTC RAM Sayaç)
ESP32'nin Deep Sleep modu, CPU ve çoğu çevre birimini kapatarak akım tüketimini ~10µA seviyesine düşürür ve pille çalışan IoT cihazları için kritik öneme sahiptir. Bu projede üç farklı uyandırma kaynağını kullanıyoruz: zamanlayıcı (timer, 15sn), harici pin (EXT0 — buton GPIO 33) ve touch (T0/GPIO 4). RTC_DATA_ATTR ile işaretlenen değişkenler deep sleep boyunca korunur — boot sayacı, timer wake sayacı ve buton wake sayacı kalıcı olarak izlenir. SSD1306 OLED ekranda her uyanışta wake reason, say

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

ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)
ESP32 ile zamanlı sıcaklık ve nem kayıt sistemi kur! Bu projede DHT22 sensörü ile dakikada bir sıcaklık/nem okuyup DS1307 RTC modülünden aldığın gerçek zaman etiketiyle microSD karta CSV formatında kaydediyoruz. OLED ekranda büyük font ile son sıcaklık değeri, nem yüzdesi, timestamp ve toplam kayıt sayısı canlı gösterilir. SD kart üzerindeki /temp_log.csv dosyası Excel/Google Sheets/Python pandas ile açılıp analiz edilebilir — sera monitörü, ev/oda sıcaklık takibi, laboratuvar veri toplama,

Bluetooth İle Telefondan Led Yakma
Telefonundan odadaki ışıkları açıp kapatmanın küçük bir provası. Bluetooth modülü telefondan gelen harfleri Arduino'ya iletir; bir harf kırmızı LED'i, başka bir harf yeşil LED'i yakar, aynı harflerin
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den 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ç

