Parçalar · 11 dk okuma

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.

ÖzellikLoRa (SX1278)nRF24L01433 MHz ASKWi-Fi (ESP32)
Tipik menzil1–3 km şehir, 10 km'ye kadar açık alan50–100 m (PA+LNA ile ~1 km)20–100 m50–100 m (modeme kadar)
Veri hızı0,3–5,5 kbit/s (125 kHz)250 kbit/s – 2 Mbit/s1–10 kbit/sMbit/s düzeyi
Verici akımı40–120 mA (güce göre)11–12 mA10–40 mA120–240 mA
Uyku akımı1 µA altı1 µA civarıYok (kapatılır)10 µA (deep sleep)
Çift yönlüEvetEvetHayır (verici ve alıcı ayrı)Evet
AltyapıGerekmezGerekmezGerekmezModem 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ülYongaFrekansArayüzNot
Ai-Thinker Ra-02SX1278433 MHzSPIEn ucuz ve yaygın; IPEX anten konnektörlü
Ai-Thinker Ra-01SX1278433 MHzSPIRa-02'nin yay antenli sürümü
HopeRF RFM95WSX1276868 / 915 MHzSPILoRaWAN ve TTN için sık tercih edilir
Ebyte E32 / E220SX1278 / LLCC68433 / 868 MHzUARTKendi işlemcisi var; kütüphanesiz seri port gibi çalışır
TTGO LoRa32, Heltec LoRa 32ESP32 + SX1276/78433 / 868 / 915 MHzKart üstündeESP32, LoRa ve OLED tek kartta
Ra-02 özelliğiDeğer
YongaSemtech 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)
Besleme1,8–3,7 V, tipik 3,3 V
AkımGönderirken yaklaşık 40–120 mA, dinlerken yaklaşık 12 mA, uykuda 1 µA altı
ArayüzSPI (en fazla 10 MHz) + DIO0 kesme pini
AntenIPEX (U.FL) konnektörü, 433 MHz anten gerekir
SX1278 bir 3,3 V yongadır ve pinleri 5 V'a dayanıklı değildir. Ra-02'yi Arduino Uno'nun 5V pinine ya da 5 V SPI hatlarına doğrudan bağlamak modülü kalıcı olarak bozar. Besleme her zaman 3,3 V olmalı; Uno kullanıyorsan SPI hatlarına seviye dönüştürücü koymalısın (bağlantı bölümünde anlatılıyor).

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ölgeLoRa frekansıLoRaWAN planı
Türkiye, Avrupa433 MHz ve 863–870 MHzEU868 (EU433 nadir)
ABD, Kanada, Meksika902–928 MHzUS915
Brezilya, Arjantin, Avustralya915–928 MHzAU915
Hindistan865–867 MHzIN865
Japonya, Güneydoğu Asya920–923 MHzAS923
Çin470–510 MHz (ve 433 MHz)CN470
Avrupa kurallarında 433 MHz bandında izin verilen güç genellikle 10 mW (10 dBm), 868 MHz alt bantlarında ise çoğunlukla 25 mW ve %1 kullanım oranıdır; yani 1 saniye yayın yapan cihaz sonraki 99 saniye susmalıdır. Ra-02'nin 18 dBm'lik en yüksek gücü bu sınırın üzerindedir; bu yüzden örnek kodlarda setTxPower(10) kullanıyoruz. Kesin sınırlar için ülkenin telsiz düzenleyicisine (Türkiye'de BTK) bak.

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.

SFBit hızı20 bayt paket süresiYaklaşık hassasiyetÇözülebilen en düşük SNR%1 kuralında bekleme
SF75,5 kbit/s57 ms-123 dBm-7,5 dB6 sn
SF83,1 kbit/s103 ms-126 dBm-10 dB10 sn
SF91,8 kbit/s185 ms-129 dBm-12,5 dB18 sn
SF10977 bit/s371 ms-132 dBm-15 dB37 sn
SF11537 bit/s741 ms-134 dBm-17,5 dB73 sn
SF12293 bit/s1319 ms-137 dBm-20 dB131 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.

Başlangıç için SF9, 125 kHz, 4/5 iyi bir dengedir. Menzil yetmezse SF'yi birer birer artır; hız gerekiyorsa azalt. Verici ve alıcıda frekans, SF, BW, CR ve sync word (eşleme kelimesi) birebir aynı olmalıdır; biri bile farklıysa alıcı hiçbir paket görmez. Varsayılan sync word 0x12'dir ve özel ağların çoğu bunu kullanır; LoRaWAN ağları ise 0x34 kullanır. Örneklerdeki gibi 0xF3 gibi kendine özgü bir değer seçmek, komşu hobi cihazlarının ve LoRaWAN'ın paketlerini donanım düzeyinde ayıklamaya yardım 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 piniArduino UnoESP32Raspberry Pi Pico
3.3VHarici 3,3 V regülatör3V33V3 (OUT)
GNDGNDGNDGND
SCKD13 (seviye dönüştürücüyle)GPIO 18GP18
MISOD12 (doğrudan)GPIO 19GP16
MOSID11 (seviye dönüştürücüyle)GPIO 23GP19
NSSD10 (seviye dönüştürücüyle)GPIO 5GP17
RESETD9 (seviye dönüştürücüyle)GPIO 14GP20
DIO0D2 (doğrudan, kesme pini)GPIO 26GP21
Uno ile iki sorun var. Birincisi gerilim: Uno'nun SCK, MOSI, NSS ve RESET çıkışları 5 V'tur; bunları bir seviye dönüştürücüyle (ör. 74HC4050) ya da her hatta 2,2 kΩ + 3,3 kΩ'luk gerilim bölücüyle 3,3 V'a düşürmelisin. MISO ve DIO0 modülden Uno'ya gittiği için doğrudan bağlanabilir. İkincisi akım: Uno'nun 3.3V pini yaklaşık 50 mA verebilir, Ra-02 ise gönderirken 100 mA'i geçebilir. Modülü AMS1117 gibi ayrı bir 3,3 V regülatörden besle. Bu dertlerin hiçbiri ESP32, Pico ya da 3,3 V'luk Arduino Pro Mini'de yoktur.

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

  1. Arduino IDE'de Kütüphane Yöneticisi'ni aç, LoRa yaz ve Sandeep Mistry'nin LoRa kütüphanesini kur.
  2. Modülü tablodaki gibi bağla, anteni takmadan asla gönderim yapma.
  3. 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.
  4. Seri Monitör'ü 115200 baud'da aç; her 5 saniyede bir "Gonderildi" satırı görmelisin.
  5. LoRa.begin() başarısız oluyorsa kabloları, 3,3 V beslemeyi ve NSS ile RESET pinlerini kontrol et.
C++ (Arduino IDE)
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
FonksiyonNe 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.

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

RSSI (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çümDeğerAnlamı
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 dBmZayıf; SF'yi artırmayı düşün
SNR+5 dB ve üstüRahat; daha düşük SF ile hız kazanabilirsin
SNR0 ile -10 dBNormal LoRa çalışma bölgesi
SNRSF 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 geliştirme kartı
ESP32: 3,3 V pinleri sayesinde Ra-02'ye seviye dönüştürücüsüz bağlanır; aynı anda Wi-Fi ile LoRa verisini internete aktarabilir.

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.

MicroPython
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)
29

Menzil 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.

OrtamTipik menzil (Ra-02, SF9–SF12, basit anten)Belirleyici etken
Ev ve bina içiBirkaç kat, 100–500 mBeton duvar ve metal
Yoğun şehir1–3 kmBinalar, görüş hattı yok
Banliyö, köy3–6 kmAğaçlar ve tek katlı yapılar
Açık arazi, tarla5–10 kmAntenin 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.

ÖzellikLoRa (noktadan noktaya)LoRaWAN
KatmanYalnızca radyo (fiziksel katman)Radyo + ağ protokolü (MAC)
Altyapıİki modül yeterGateway ve ağ sunucusu gerekir
ŞifrelemeYok, kendin eklersinAES-128, zorunlu
Arduino kütüphanesiLoRa (Sandeep Mistry)MCCI LoRaWAN LMIC, RadioLib
Avrupa frekansı433 ya da 868 MHz serbestEU868 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ü

Toprak nem sensörü
Toprak nem sensörü: tarladaki LoRa düğümü bu sensörle ölçüp her 10 dakikada bir eve paket gönderir.

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.

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

Pil ö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

BelirtiOlası nedenÇözüm
"LoRa baslatilamadi"SPI kablosu, NSS ya da RESET pini yanlış; besleme yokBağlantıları ve setPins() değerlerini kontrol et, 3,3 V'u ölç
Verici gönderiyor, alıcı hiçbir şey görmüyorFrekans, SF, BW, CR ya da sync word farklıİki taraftaki ayarları birebir eşitle
Modül ısınıyor ya da hiç çalışmıyor5 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 resetleniyor3,3 V hattı akım darbesini karşılayamıyorAyrı regülatör ve beslemeye 100 µF kondansatör
Menzil birkaç metreAnten takılı değil ya da yanlış frekans anteni433 MHz anten tak; antensiz göndermek PA'yı bozabilir
Paketler bozuk karakterliCRC kapalı, gürültülü paketler kabul ediliyorİki tarafta enableCrc() çağır
Bazı paketler hiç gelmiyorPaketler çok sık, havada çakışıyorPaket aralığını havada kalma süresine göre artır
İlk denemeyi iki modül aynı masadayken, düşük güçle (setTxPower(2)) yap. Çok yakın mesafede yüksek güç alıcının girişini doyurup paket kaybına yol açabilir. Masada çalıştıktan sonra mesafeyi artırmaya geç.

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.

Tüm projeleri gör
2 Arduino Tek Yönlü Haberleşme
#57Orta
Premium

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

4.4(37)
50
2 Arduino Çift Yönlü Haberleşme
#58Orta
Premium

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

4.5(20)
26
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
ESP32 Deep Sleep — Pil Tasarrufu (OLED + RTC RAM Sayaç)
#135İleri
Premium

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

4.3(10)
16
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)
9
ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)
#144İleri
Premium

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,

4.7(7)
12
Bluetooth İle Telefondan Led Yakma
#34Başlangıç
Premium

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

4.8(68)
89