Skip to content

arazumut/wokwi_c_pi_LedControl

Repository files navigation

LED Control Project - Pure C Implementation

Bu proje, embedded systems öğrenmek için tasarlanmış bir LED kontrol sistemidir. Arduino IDE kullanmadan, saf C dili ile mikrocontroller programlama yapıyoruz.

🎯 Proje Hedefleri

  • Donanım I/O işlemlerini öğrenmek - GPIO kullanımı, pin konfigürasyonu
  • C dili ile embedded programming - Düşük seviye donanım kontrolü
  • Debouncing tekniklerini uygulamak - Yazılımsal buton zıplama önleme
  • Modüler kod yapısı - Farklı mikrocontroller'lar için taşınabilir kod

📁 Proje Yapısı

LedControl/
├── basic_version/
│   └── led_control.c           # Temel LED kontrol (1 buton, 1 LED)
├── advanced_version/
│   └── advanced_led_control.c  # Gelişmiş versiyon (2 buton, 3 LED)
├── circuit_diagrams/
├── libraries/
├── Makefile                    # Derleme konfigürasyonu
└── README.md

🔧 Desteklenen Donanımlar

STM32 Blue Pill (Önerilen)

  • MCU: STM32F103C8T6 (ARM Cortex-M3)
  • Frekans: 72 MHz
  • Flash: 64KB, RAM: 20KB
  • GPIO: 3.3V logic

Arduino Uno (AVR)

  • MCU: ATmega328P
  • Frekans: 16 MHz
  • Flash: 32KB, RAM: 2KB
  • GPIO: 5V logic

Raspberry Pi Pico

  • MCU: RP2040 (ARM Cortex-M0+)
  • Frekans: 133 MHz
  • Flash: 2MB, RAM: 264KB
  • GPIO: 3.3V logic

⚡ Temel Versiyon - Basic LED Control

Özellikler

  • 1 adet buton girişi
  • 1 adet LED çıkışı (+ built-in LED)
  • Yazılımsal debouncing (50ms)
  • Pull-up dirençli buton konfigürasyonu

Pin Bağlantıları (STM32)

LED     -> GPIOA Pin 5 (220Ω direnç ile)
Button  -> GPIOB Pin 0 (internal pull-up)
GND     -> Ortak toprak

Çalışma Mantığı

// Buton basılı -> LED yanar
// Buton serbest -> LED söner
if (button_pressed) {
    led_on();
} else {
    led_off();  
}

🚀 Gelişmiş Versiyon - Advanced LED Control

Özellikler

  • 2 adet buton girişi
  • 3 adet LED çıkışı (Kırmızı, Yeşil, Mavi)
  • Buton kombinasyonları
  • Özel durumlar için yanıp sönme efekti

Pin Bağlantıları (STM32)

LED1 (Kırmızı) -> GPIOA Pin 5
LED2 (Yeşil)   -> GPIOA Pin 6  
LED3 (Mavi)    -> GPIOA Pin 7
Button1        -> GPIOB Pin 0
Button2        -> GPIOB Pin 1

Buton Kombinasyonları

Buton1 Buton2 Sonuç
Tüm LED'ler KAPALI
KIRMIZI LED yanar
YEŞİL LED yanar
MAVİ LED yanıp söner

🛠️ Kurulum ve Derleme

Gereksinimler

STM32 için:

# ARM GCC toolchain
sudo apt install gcc-arm-none-eabi

# STM32 flash tool
sudo apt install stlink-tools

AVR için:

# AVR GCC toolchain  
sudo apt install gcc-avr avr-libc

# AVR flash tool
sudo apt install avrdude

Derleme Komutları

# STM32 için temel versiyon
make TARGET=stm32 basic

# STM32 için gelişmiş versiyon
make TARGET=stm32 advanced

# AVR için tüm versiyonlar
make TARGET=avr all

# Generic ARM için
make TARGET=generic all

Flash İşlemi

# STM32'ye yükleme
make flash-basic          # Temel versiyon
make flash-advanced       # Gelişmiş versiyon

# AVR'ye yükleme (Arduino Uno)
make flash-avr-basic      # Temel versiyon
make flash-avr-advanced   # Gelişmiş versiyon

🔌 Devre Bağlantıları

STM32 Blue Pill Devre Şeması

    STM32F103C8T6
    ┌─────────────────┐
    │              A5 ├─[220Ω]─┤>|─── GND (Kırmızı LED)
    │              A6 ├─[220Ω]─┤>|─── GND (Yeşil LED)  
    │              A7 ├─[220Ω]─┤>|─── GND (Mavi LED)
    │                 │
    │              B0 ├────┐
    │              B1 ├────┼───── Butonlar -> GND
    │             GND ├────┘
    │             3V3 ├───── Güç
    └─────────────────┘

Kritik Noktalar

  1. LED Akım Sınırlama: Her LED için 220Ω direnç kullanın
  2. Pull-up Dirençler: Internal pull-up kullanıldığı için harici direnç gerekmez
  3. Güç: STM32 için 3.3V, Arduino için 5V
  4. Ortak Toprak: Tüm bileşenler aynı GND'ye bağlı olmalı

📚 Kod Analizi

Debouncing Algoritması

bool button_read_debounced(button_t* btn, uint8_t pin) {
    bool reading = gpio_read_pin(port, pin);
    
    // Durum değişimi tespit et
    if (reading != btn->last_state) {
        btn->last_debounce_time = system_tick;
    }
    
    // Kararlı okuma için yeterli zaman geçmiş mi?
    if ((system_tick - btn->last_debounce_time) > DEBOUNCE_TIME_MS) {
        if (reading != btn->stable_state) {
            btn->stable_state = reading;
        }
    }
    
    btn->last_state = reading;
    return btn->stable_state;
}

GPIO Kontrolü

// Pin modu ayarlama (output/input)
void gpio_set_pin_mode(volatile uint32_t* port, uint8_t pin, uint8_t mode);

// Pin yazma (LED kontrol)
void gpio_write_pin(volatile uint32_t* port, uint8_t pin, bool state);

// Pin okuma (buton durumu)
bool gpio_read_pin(volatile uint32_t* port, uint8_t pin);

🧪 Test ve Debug

Serial Monitor ile Debug

// Sistem başlangıcında
Serial.println("LED Control System Started");

// Buton durumu değişiminde
Serial.println("Button PRESSED - LED ON");
Serial.println("Button RELEASED - LED OFF");

Hardware Debug Checklist

  • LED'ler doğru yönde bağlı mı? (Anot +, Katot -)
  • Akım sınırlama dirençleri takılı mı?
  • Butonlar GND'ye doğru bağlı mı?
  • Güç bağlantıları kontrol edildi mi?
  • Ortak toprak bağlantısı var mı?

🚨 Sorun Giderme

LED Yanmıyor

  1. Bağlantı kontrolü: LED polaritesi doğru mu?
  2. Direnç değeri: 220Ω direnç takılı mı?
  3. Kod kontrolü: GPIO pin modu output olarak ayarlandı mı?

Buton Çalışmıyor

  1. Pull-up: Internal pull-up etkin mi?
  2. Debounce: Zıplama süreleri uygun mu?
  3. Bağlantı: Buton GND'ye bağlı mı?

Derleme Hataları

  1. Toolchain: Doğru compiler kurulu mu?
  2. Target: Makefile'da doğru target seçildi mi?
  3. Paths: Include path'ler doğru mu?

📖 Öğrenilen Konular

GPIO (General Purpose Input/Output)

  • Pin konfigürasyonu (input/output/alternate)
  • Pull-up/pull-down dirençler
  • Digital okuma/yazma işlemleri

Debouncing Teknikleri

  • Yazılımsal debouncing algoritması
  • Zaman tabanlı kararlı durum tespiti
  • Buton zıplama probleminin çözümü

Embedded C Best Practices

  • Volatile anahtar kelimesi kullanımı
  • Register seviyesinde donanım kontrolü
  • Bellek optimizasyonu teknikleri
  • Modüler kod yapısı

Mikrocontroller Mimarisi

  • ARM Cortex-M vs AVR karşılaştırması
  • Clock sistemleri ve timing
  • Interrupt ve system tick kullanımı

🎓 İleri Seviye Geliştirmeler

  1. Timer Tabanlı PWM: LED parlaklık kontrolü
  2. Interrupt Driven: Buton kesmeleri ile işlem
  3. State Machine: Karmaşık LED pattern'leri
  4. Communication: UART, SPI, I2C entegrasyonu
  5. Power Management: Sleep mode'lar ve güç optimizasyonu

📝 Lisans

Bu proje eğitim amaçlı olarak hazırlanmış olup, açık kaynak kodludur. Ticari ve eğitim amaçlı kullanımda serbesttir.

🤝 Katkıda Bulunma

Proje geliştirmelerine katkıda bulunmak için:

  1. Fork yapın
  2. Feature branch oluşturun
  3. Değişikliklerinizi commit edin
  4. Pull request gönderin

Embedded Systems öğrenme yolculuğunuzda başarılar! 🚀

About

LED Control Project - Pure C Implementation

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published