Arduino, elektronik projeler geliştirmek isteyenler için mükemmel bir platformdur. Hem hobi amaçlı hem de profesyonel projelerde kullanılabilen bu mikrodenetleyici, düşük maliyeti ve geniş topluluk desteği ile dikkat çeker. Peki, Arduino ile neler yapabilirsiniz? Bu yazıda, başlangıç seviyesinden ileri düzeye kadar Arduino ile yapılabilecek 10 harika projeyi detaylıca inceleyeceğiz. Ayrıca her proje için temel bileşenler ve kod snippetleri de paylaşacağız. Hazırsanız, başlayalım!

Arduino Nedir ve Neden Tercih Edilir?

Arduino, açık kaynaklı bir mikrodenetleyici kartıdır. Sensörler, motorlar, LED’ler ve daha birçok bileşeni kontrol etmek için kullanılır. Kullanım kolaylığı, esnekliği ve uygun fiyatı sayesinde öğrenciler, mühendisler ve hobi tutkunları tarafından sıkça tercih edilir.

Arduino projeleri, Arduino ile neler yapılır, Arduino başlangıç projeleri


1. LED Yakıp Söndürme (Başlangıç Seviyesi)

Arduino ile ilk projeniz olarak basit bir LED yakıp söndürme denemesi yapabilirsiniz. Bu proje, temel devre bağlantılarını ve kod yazımını öğrenmek için idealdir.

Gerekli Malzemeler:

  • Arduino Uno
  • LED
  • 220 ohm direnç
  • Breadboard ve jumper kablolar

Kod Snippeti:

void setup() {
  pinMode(13, OUTPUT); // 13 numaralı pin çıkış olarak ayarlandı
}

void loop() {
  digitalWrite(13, HIGH); // LED’i yak
  delay(1000);            // 1 saniye bekle
  digitalWrite(13, LOW);  // LED’i söndür
  delay(1000);            // 1 saniye bekle
}

2. Sıcaklık ve Nem Ölçer

DHT11 veya DHT22 sensörü kullanarak odanızın sıcaklık ve nem değerlerini ölçebilirsiniz. Bu proje, sensör kullanımını öğrenmek için harikadır.

Gerekli Malzemeler:

  • Arduino Uno
  • DHT11/DHT22 sensör
  • LCD ekran (opsiyonel)

Kod Snippeti:

#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  Serial.print("Nem: ");
  Serial.print(h);
  Serial.print(" %\tSıcaklık: ");
  Serial.println(t);
  delay(2000);
}

3. Ultrasonik Mesafe Ölçer

HC-SR04 ultrasonik sensör ile mesafe ölçen bir cihaz yapabilirsiniz. Bu proje, robotik uygulamalara giriş için idealdir.

Gerekli Malzemeler:

  • Arduino Uno
  • HC-SR04 ultrasonik sensör
  • Breadboard

Kod Snippeti:

#define trigPin 9
#define echoPin 10

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  long duration;
  int distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  Serial.print("Mesafe: ");
  Serial.println(distance);
  delay(500);
}

4. Otomatik Sulama Sistemi

Bitkilerinizin toprağını nem sensörü ile kontrol ederek otomatik sulama yapabilirsiniz. Bu proje, IoT (Nesnelerin İnterneti) ile de genişletilebilir.

Gerekli Malzemeler:

  • Arduino Uno
  • Toprak nem sensörü
  • Su pompası veya servo motor

5. Akıllı Ev Aydınlatma Sistemi

Işık sensörü (LDR) ve röle modülü ile evinizin aydınlatmasını otomatikleştirebilirsiniz. Karanlık olduğunda ışıklar kendiliğinden yanar!


6. Bluetooth Kontrollü Araba

HC-05 Bluetooth modülü ile telefonunuzdan kontrol edebileceğiniz bir araba yapabilirsiniz. Robotik projelere giriş için harika bir seçenektir.

Gerekli Malzemeler:

  • Arduino Uno
  • L298N motor sürücü
  • HC-05 Bluetooth modülü
  • DC motorlar ve şasi

7. Engelden Kaçan Robot

Ultrasonik sensör ve motorlar kullanarak engellerden kaçan bir robot tasarlayabilirsiniz. Bu proje, otonom sistemlere başlangıçtır.


8. Hava Durumu İstasyonu

BMP180 (basınç sensörü) ve DHT11 ile kapsamlı bir hava durumu istasyonu oluşturabilirsiniz. Verileri LCD ekranda veya seri monitörde görüntüleyebilirsiniz.


9. RFID Kapı Kilidi

RFID modülü ile güvenli bir kapı kilidi sistemi yapabilirsiniz. Bu proje, güvenlik sistemlerine ilgi duyanlar için idealdir.


10. LoRa ile Uzak Menzilli Kumanda (868 MHz)


LoRa (Long Range) düşük güç tüketimiyle kilometrelerce mesafeye veri göndermeye izin veren bir kablosuz iletişim teknolojisidir. Bu yazıda 868 MHz ISM bandında çalışan basit bir uzak menzilli kumanda sistemi kuracağız: eldeki kumanda (verici) iki butonla AÇ/KAPA komutu yollar, alıcı tarafta bir role/LED kontrol edilir. Paket yinelemeli (retry) ve ACK (alındı) yanıtıyla güvenilirlik artırılır.

⚠️ Yasal not (TR/AB 868 MHz): 868 MHz ISM bandında kanal ve görev çevrimi (duty cycle, tipik %1) sınırlamaları vardır. Uzun basılı tutarak sürekli yayın yapmayın; kısa paketler ve bekleme süreleri kullanın.


1) Donanım Listesi

  • 2× Arduino (UNO/Nano/Pro Mini olabilir) veya 2× ESP32 (isterseniz)

  • 2× LoRa modülü (SX1276/SX1278 — RFM95, E32-868T20D, Ra-02 gibi)

  • 2× Anten (868 MHz’e uygun)

  • 2× Breadboard ve jumper kabloları

  • 1× 5 V role modülü (alıcı tarafı için) veya LED + 220 Ω direnç

  • 2× Anlık buton + 10 kΩ (UNO/Nano kullanırsanız dahili pull-up ile dirençsiz de olur)

  • Güç kaynağı (USB veya pil; LoRa için iyi besleme/ground önemli)

Not: ESP32 kullanırsanız SPI pinleri farklıdır. Aşağıdaki bağlantılar Arduino UNO/Nano içindir.


2) Bağlantılar (Arduino UNO/Nano ↔ SX1276/78)

SPI pinleri sabittir; LoRa modülünün pin adları üreticiye göre değişebilir ama tipik eşleşme:

LoRa ModülüArduinoAçıklama
NSS/CSD10Çip seçme
SCKD13SPI saat
MOSID11SPI MOSI
MISOD12SPI MISO
DIO0D2IRQ (paket geldi)
RESETD9Donanımsal reset
3V33V3Besleme (akım yeterli olmalı)
GNDGNDToprak

Verici tarafı ekleri:

  • Buton-1 → D4 (dahili pull-up, buton GND’ye)

  • Buton-2 → D5 (dahili pull-up, buton GND’ye)

  • İsteğe bağlı durum LED’i → D6

Alıcı tarafı ekleri:

  • Role veya LED → D5 (LED için seri 220 Ω)

  • İsteğe bağlı durum LED’i → D6


3) Yazılım / Kütüphane

Aşağıdaki kodlar Sandeep Mistry LoRa kütüphanesiyle yazıldı.

  1. Arduino IDE → Library ManagerLoRa by Sandeep Mistry

  2. Kart ve portu seçin, derleyip yükleyin.

Bölgesel ayar: Avrupa/Türkiye için frequency = 868E6.


4) Paket Yapısı ve Güvenilirlik

Kompakt bir 4 baytlık paket kullanıyoruz:

[0] versiyon  (0x01)
[1] nodeId    (0xA1 = verici, 0xB1 = alıcı)
[2] seq       (0..255 artan sayaç)
[3] cmd       (0x01=AC, 0x00=KAPA)

İşleyiş:

  • Verici paketi gönderir ve ACK bekler (aynı seq ile 0xAA komutu döner).

  • ACK gelmezse N tekrar (ör. 5) dener; her deneme arasında bekleme (ör. 200 ms).

  • LoRa’nın dahili CRC’si açıktır. İsterseniz uygulama katmanında ek XOR/AES şifreleme ekleyebilirsiniz (aşağıda kısa örnek var).


5) Verici Kodu (Arduino)

#include <SPI.h>
#include <LoRa.h>

// --- Donanım pinleri (UNO/Nano) ---
const int PIN_SS   = 10;   // NSS/CS
const int PIN_RST  = 9;    // RESET
const int PIN_DIO0 = 2;    // DIO0

// --- Uygulama pinleri ---
const int BTN_ON   = 4;    // buton 1 (AC)
const int BTN_OFF  = 5;    // buton 2 (KAPA)
const int LED_STAT = 6;    // durum LED'i (isteğe bağlı)

// --- LoRa ayarları ---
const long LORA_FREQ = 868E6; // 868 MHz

// Paket alanları
const byte PKT_VER   = 0x01;
const byte NODE_TX   = 0xA1;  // verici kimliği
const byte NODE_RX   = 0xB1;  // beklenen alıcı kimliği (bilgi amaçlı)
const byte CMD_ON    = 0x01;
const byte CMD_OFF   = 0x00;
const byte CMD_ACK   = 0xAA;  // alıcıdan dönen ACK komutu

byte seq = 0;                 // 0..255

// Güvenlik için basit XOR anahtarı (örnek) — gerçek projede AES önerilir
const byte XOR_KEY = 0x5C;

bool sendCommand(byte cmd, int retries = 5, unsigned long ackTimeoutMs = 300);
void buildPacket(byte *buf, byte cmd);
void xorCodec(byte *buf, int len);

void setup() {
  pinMode(BTN_ON, INPUT_PULLUP);
  pinMode(BTN_OFF, INPUT_PULLUP);
  pinMode(LED_STAT, OUTPUT);
  digitalWrite(LED_STAT, LOW);

  Serial.begin(9600);
  while (!Serial) {}

  // LoRa pinlerini belirt
  LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);

  if (!LoRa.begin(LORA_FREQ)) {
    Serial.println("LoRa baslatilamadi!");
    while (1) { delay(1000); }
  }

  // Fiziksel katman ayarları (menzil için daha yavaş ama daha güvenilir)
  LoRa.setSpreadingFactor(12);       // 7..12 (yüksek = daha uzak/az veri)
  LoRa.setSignalBandwidth(125E3);    // 125 kHz tipik
  LoRa.setCodingRate4(5);            // 5..8 (yüksek = daha fazla FEC)
  LoRa.setTxPower(17);               // dBm (modüle göre 2..20)
  LoRa.setSyncWord(0x12);
  LoRa.enableCrc();

  Serial.println("Verici hazir");
}

void loop() {
  // Butonlar GND'ye çekiliyor (pull-up aktif). Basılınca LOW olur.
  if (digitalRead(BTN_ON) == LOW) {
    if (sendCommand(CMD_ON)) {
      Serial.println("AC komutu GONDERILDI ve ACK ALINDI");
      digitalWrite(LED_STAT, HIGH);
    } else {
      Serial.println("AC komutu ACK ALINAMADI");
      digitalWrite(LED_STAT, LOW);
    }
    delay(300); // basma debouncing
  }

  if (digitalRead(BTN_OFF) == LOW) {
    if (sendCommand(CMD_OFF)) {
      Serial.println("KAPA komutu GONDERILDI ve ACK ALINDI");
      digitalWrite(LED_STAT, LOW);
    } else {
      Serial.println("KAPA komutu ACK ALINAMADI");
    }
    delay(300);
  }
}

bool sendCommand(byte cmd, int retries, unsigned long ackTimeoutMs) {
  byte pkt[4];
  buildPacket(pkt, cmd);

  for (int attempt = 0; attempt < retries; attempt++) {
    // Gönder
    LoRa.beginPacket();
    // Basit XOR "şifreleme"
    byte tmp[4];
    memcpy(tmp, pkt, 4);
    xorCodec(tmp, 4);
    LoRa.write(tmp, 4);
    LoRa.endPacket();

    unsigned long t0 = millis();
    while (millis() - t0 < ackTimeoutMs) {
      int len = LoRa.parsePacket();
      if (len > 0) {
        if (len >= 4) {
          byte rcv[4];
          for (int i = 0; i < 4; i++) rcv[i] = LoRa.read();
          xorCodec(rcv, 4);
          // versiyon, nodeId, seq, cmd
          if (rcv[0] == PKT_VER && rcv[1] == NODE_RX && rcv[2] == seq && rcv[3] == CMD_ACK) {
            // Bir sonraki paket için seq artır
            seq++;
            return true;
          }
        } else {
          while (LoRa.available()) LoRa.read(); // çöp temizle
        }
      }
    }

    // Zaman aşımı — tekrar dene
    Serial.print("ACK bekleniyor, deneme: ");
    Serial.println(attempt + 1);
    delay(200); // duty cycle'a saygı + kanal boşalsın
  }

  // Başarısız
  seq++; // yine de ilerlet ki eski seq'te takılı kalmasın
  return false;
}

void buildPacket(byte *buf, byte cmd) {
  buf[0] = PKT_VER;
  buf[1] = NODE_TX;
  buf[2] = seq;
  buf[3] = cmd;
}

void xorCodec(byte *buf, int len) {
  for (int i = 0; i < len; i++) buf[i] ^= XOR_KEY;
}

6) Alıcı Kodu (Arduino)

#include <SPI.h>
#include <LoRa.h>

// --- Donanım pinleri (UNO/Nano) ---
const int PIN_SS   = 10;
const int PIN_RST  = 9;
const int PIN_DIO0 = 2;

// --- Uygulama pinleri ---
const int RELAY_PIN = 5;   // Role/LED çıkışı
const int LED_STAT  = 6;   // durum LED'i

// --- LoRa ayarları ---
const long LORA_FREQ = 868E6;

// Paket alanları
const byte PKT_VER   = 0x01;
const byte NODE_TX   = 0xA1;  // verici kimliği
const byte NODE_RX   = 0xB1;  // alıcı kimliği
const byte CMD_ON    = 0x01;
const byte CMD_OFF   = 0x00;
const byte CMD_ACK   = 0xAA;

const byte XOR_KEY   = 0x5C;  // vericiyle aynı

void xorCodec(byte *buf, int len);
void sendAck(byte seq);

void setup() {
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(LED_STAT, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);
  digitalWrite(LED_STAT, LOW);

  Serial.begin(9600);
  while (!Serial) {}

  LoRa.setPins(PIN_SS, PIN_RST, PIN_DIO0);
  if (!LoRa.begin(LORA_FREQ)) {
    Serial.println("LoRa baslatilamadi!");
    while (1) { delay(1000); }
  }

  LoRa.setSpreadingFactor(12);
  LoRa.setSignalBandwidth(125E3);
  LoRa.setCodingRate4(5);
  LoRa.setTxPower(17);
  LoRa.setSyncWord(0x12);
  LoRa.enableCrc();

  Serial.println("Alici hazir");
}

void loop() {
  int packetSize = LoRa.parsePacket();
  if (packetSize > 0) {
    if (packetSize >= 4) {
      byte rcv[4];
      for (int i = 0; i < 4; i++) rcv[i] = LoRa.read();
      xorCodec(rcv, 4);

      byte ver = rcv[0];
      byte node = rcv[1];
      byte seq  = rcv[2];
      byte cmd  = rcv[3];

      if (ver == PKT_VER && node == NODE_TX) {
        // Komutu uygula
        if (cmd == CMD_ON) {
          digitalWrite(RELAY_PIN, HIGH);
          digitalWrite(LED_STAT, HIGH);
          Serial.println("Komut: AC");
        } else if (cmd == CMD_OFF) {
          digitalWrite(RELAY_PIN, LOW);
          digitalWrite(LED_STAT, LOW);
          Serial.println("Komut: KAPA");
        }

        // ACK gönder
        sendAck(seq);
      }
    } else {
      // Paket kısa ise boşalt
      while (LoRa.available()) LoRa.read();
    }
  }
}

void xorCodec(byte *buf, int len) {
  for (int i = 0; i < len; i++) buf[i] ^= XOR_KEY;
}

void sendAck(byte seq) {
  byte ack[4];
  ack[0] = PKT_VER;
  ack[1] = NODE_RX;
  ack[2] = seq;
  ack[3] = CMD_ACK;

  byte tmp[4];
  memcpy(tmp, ack, 4);
  xorCodec(tmp, 4);

  LoRa.beginPacket();
  LoRa.write(tmp, 4);
  LoRa.endPacket();
}

7) Menzil ve Sağlamlık İpuçları

  • Anten çok kritik: 868 MHz’e uygun çeyrek dalga (~8.2 cm) tel anten bile mucizeler yaratır. Ters lehim/uygunsuz anten menzili bitirir.

  • Güç / Topraklama: Modüle yeterli akım verin, kısa ve kalın GND kullanın.

  • Yüksek SF (11–12): Daha düşük veri hızı ama çok daha iyi menzil.

  • Düşük bant genişliği (125 kHz): Gürültüye dayanımı artırır.

  • Yükseklik ve görüş hattı: Açık alanda menzil çarpan etkisi gösterir.

  • Paket sürekliliği: Yasal duty cycle sınırlarını geçmeyin (ör. her komut sonrası kısa bekleme).


8) Güvenlik (Opsiyonel)

Yukarıdaki örnekte gösterim amaçlı XOR kullanıldı. Gerçek projede AES-128 gibi blok şifreleri tercih edin:

  • Arduino için: TinyAES veya AESLib

  • Paketi 16 bayta tamamlayıp (padding) şifreleyin; alıcıda çözün.

  • Ayrıca syncWord, nodeId ve basit beyaz liste (izinli gönderenler) kullanın.


9) Sık Karşılaşılan Sorunlar

  • LoRa.begin başarısız: Pinler yanlış, modül 3.3 V istiyor ama 5 V verilmiş olabilir; ya da SPI kabloları uzun.

  • Hiç paket gelmiyor: DIO0 bağlanmadıysa parsePacket() çalışsa da RX hazır kesmesi kaçabilir. Frekans/syncWord taraflar arasında aynı olmalı.

  • Menzil düşük: Anten, SF, BW ayarlarını gözden geçirin; açık alanda test yapın.

  • Role tetiklenmiyor: Role modülü aktif-seviye LOW olabilir; kartınıza göre HIGH/LOW lojiklerini ters çevirin.


10) Geliştirme Fikirleri

  • Komut setini artırın (ör. hız, mod, PWM değeri — payload’ı 1 bayttan 2–8 bayta çıkarın).

  • Çoklu alıcılar için nodeId’yi hedef adres yapın (yayın/broadcast = 0xFF).

  • Pil ile çalışacaksa uyku modları: vericide butona interrupt, LoRa/MCU uyku.

  • RSSI/SNR telemetri bildirimi (ACK içine 1–2 bayt ek).

  • CRC’ye ek olarak uygulama katmanı HMAC.




Arduino Projelerinde Dikkat Edilmesi Gerekenler

  • Doğru Bağlantılar: Bileşenlerinizi bağlarken pin numaralarına dikkat edin.
  • Güç Kaynağı: Yüksek güçlü bileşenler için harici güç kaynağı kullanın.
  • Kod Optimizasyonu: Gereksiz delay() kullanımından kaçının.

Sonuç

Arduino ile yapılabilecek projeler hayal gücünüzle sınırlıdır. LED yakıp söndürmekten otonom robotlara kadar her seviyeye uygun bir fikir bulabilirsiniz. Bu yazıda sunduğumuz 10 proje ile başlayarak kendinizi geliştirebilir, daha karmaşık sistemlere geçiş yapabilirsiniz.

Siz hangi projeyi denemek isterdiniz? Yorumlarda bizimle paylaşın!

Arduino proje fikirleri, Arduino ile robot yapımı, Arduino sensör projeleri