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! 🚀