Bu proje, embedded systems öğrenmek için tasarlanmış bir LED kontrol sistemidir. Arduino IDE kullanmadan, saf C dili ile mikrocontroller programlama yapıyoruz.
- 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
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
- MCU: STM32F103C8T6 (ARM Cortex-M3)
- Frekans: 72 MHz
- Flash: 64KB, RAM: 20KB
- GPIO: 3.3V logic
- MCU: ATmega328P
- Frekans: 16 MHz
- Flash: 32KB, RAM: 2KB
- GPIO: 5V logic
- MCU: RP2040 (ARM Cortex-M0+)
- Frekans: 133 MHz
- Flash: 2MB, RAM: 264KB
- GPIO: 3.3V logic
- 1 adet buton girişi
- 1 adet LED çıkışı (+ built-in LED)
- Yazılımsal debouncing (50ms)
- Pull-up dirençli buton konfigürasyonu
LED     -> GPIOA Pin 5 (220Ω direnç ile)
Button  -> GPIOB Pin 0 (internal pull-up)
GND     -> Ortak toprak
// Buton basılı -> LED yanar
// Buton serbest -> LED söner
if (button_pressed) {
    led_on();
} else {
    led_off();  
}- 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
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
| Buton1 | Buton2 | Sonuç | 
|---|---|---|
| ❌ | ❌ | Tüm LED'ler KAPALI | 
| ✅ | ❌ | KIRMIZI LED yanar | 
| ❌ | ✅ | YEŞİL LED yanar | 
| ✅ | ✅ | MAVİ LED yanıp söner | 
STM32 için:
# ARM GCC toolchain
sudo apt install gcc-arm-none-eabi
# STM32 flash tool
sudo apt install stlink-toolsAVR için:
# AVR GCC toolchain  
sudo apt install gcc-avr avr-libc
# AVR flash tool
sudo apt install avrdude# 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# 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    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üç
    └─────────────────┘
- LED Akım Sınırlama: Her LED için 220Ω direnç kullanın
- Pull-up Dirençler: Internal pull-up kullanıldığı için harici direnç gerekmez
- Güç: STM32 için 3.3V, Arduino için 5V
- Ortak Toprak: Tüm bileşenler aynı GND'ye bağlı olmalı
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;
}// 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);// 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");- 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ı?
- Bağlantı kontrolü: LED polaritesi doğru mu?
- Direnç değeri: 220Ω direnç takılı mı?
- Kod kontrolü: GPIO pin modu output olarak ayarlandı mı?
- Pull-up: Internal pull-up etkin mi?
- Debounce: Zıplama süreleri uygun mu?
- Bağlantı: Buton GND'ye bağlı mı?
- Toolchain: Doğru compiler kurulu mu?
- Target: Makefile'da doğru target seçildi mi?
- Paths: Include path'ler doğru mu?
- Pin konfigürasyonu (input/output/alternate)
- Pull-up/pull-down dirençler
- Digital okuma/yazma işlemleri
- Yazılımsal debouncing algoritması
- Zaman tabanlı kararlı durum tespiti
- Buton zıplama probleminin çözümü
- Volatile anahtar kelimesi kullanımı
- Register seviyesinde donanım kontrolü
- Bellek optimizasyonu teknikleri
- Modüler kod yapısı
- ARM Cortex-M vs AVR karşılaştırması
- Clock sistemleri ve timing
- Interrupt ve system tick kullanımı
- Timer Tabanlı PWM: LED parlaklık kontrolü
- Interrupt Driven: Buton kesmeleri ile işlem
- State Machine: Karmaşık LED pattern'leri
- Communication: UART, SPI, I2C entegrasyonu
- Power Management: Sleep mode'lar ve güç optimizasyonu
Bu proje eğitim amaçlı olarak hazırlanmış olup, açık kaynak kodludur. Ticari ve eğitim amaçlı kullanımda serbesttir.
Proje geliştirmelerine katkıda bulunmak için:
- Fork yapın
- Feature branch oluşturun
- Değişikliklerinizi commit edin
- Pull request gönderin
Embedded Systems öğrenme yolculuğunuzda başarılar! 🚀