Arduino ile HX1230 Donanımsal Dimmer (Arka Işık Seviye Ayarı) Kontrolü

👤 Yazar: ozcan 📅 Tarih: 13.07.2026 08:06 👁️ Görüntüleme: 36

Donanımsal Dimmer (Arka Işık Seviye Ayarı) Kontrolü

Ekranı sadece açıp kapatmanın ötesinde, ortam ışığına göre parlaklığı kısmak ya da artırmak için bir Dimmer yapısına ihtiyaç duyarız. Ters pin dizilimimizde arka ışığa denk gelen D6 (pin_BL) pini, ATmega328P işlemcisinin donanımsal PWM (Sinyal Genişlik Modülasyonu) hattıdır. analogWrite() fonksiyonunu bir dimmer gibi kullanarak arka ışığın parlaklığını %0 ile %100 arasında hassas bir şekilde ölçeklendirebiliriz.


Dimmer Mantığı: Arka ışık akımını donanımsal PWM ile sınırlayarak pilden tasarruf edebilir ve gece kullanımlarında gözü yormayan loş bir ekran aydınlatması elde edebilirsiniz.

Dimmer Fonksiyonu ve Parlaklık Test Kod Bloğu

Projelerinizde parlaklığı doğrudan yüzde (%) veya 0-255 arası bir dimmer değeriyle kontrol etmenizi sağlayan güncel kod mimarisi:

// HX1230 Ekran D0'dan Başlayan Ters Pin Tanımlamaları
int pin_RESET = 0;  // 8. Pin: Sıfırlama Pini
int pin_CE    = 1;  // 7. Pin: Çip Seçimi
int pin_NC    = 2;  // 6. Pin: Boş Pin (Kullanılmıyor)
int pin_DIN   = 3;  // 5. Pin: Veri Girişi
int pin_CLK   = 4;  // 4. Pin: Saat Sinyali
int pin_VCC   = 5;  // 3. Pin: Ekran Güç Beslemesi
int pin_BL    = 6;  // 2. Pin: Arka Işık Kontrolü
int pin_GND   = 7;  // 1. Pin: Sanal Toprak Hattı

// 5x7 Standart ASCII Font Tablosu (Harfler, Rakamlar ve Temel Semboller)
const uint8_t PROGMEM font_haritasi[][5] = {
  {0x00, 0x00, 0x00, 0x00, 0x00}, // Boşluk
  {0x00, 0x00, 0x5f, 0x00, 0x00}, // !
  {0x00, 0x07, 0x00, 0x07, 0x00}, // "
  {0x14, 0x7f, 0x14, 0x7f, 0x14}, // #
  {0x24, 0x2a, 0x7f, 0x2a, 0x12}, // $
  {0x23, 0x13, 0x08, 0x64, 0x62}, // %
  {0x36, 0x49, 0x55, 0x22, 0x50}, // &
  {0x00, 0x05, 0x03, 0x00, 0x00}, // '
  {0x00, 0x1c, 0x22, 0x41, 0x00}, // (
  {0x00, 0x41, 0x22, 0x1c, 0x00}, // )
  {0x14, 0x08, 0x3e, 0x08, 0x14}, // *
  {0x08, 0x08, 0x3e, 0x08, 0x08}, // +
  {0x00, 0x50, 0x30, 0x00, 0x00}, // ,
  {0x08, 0x08, 0x08, 0x08, 0x08}, // -
  {0x00, 0x60, 0x60, 0x00, 0x00}, // .
  {0x20, 0x10, 0x08, 0x04, 0x02}, // /
  {0x3e, 0x51, 0x49, 0x45, 0x3e}, // 0
  {0x00, 0x42, 0x7f, 0x40, 0x00}, // 1
  {0x42, 0x61, 0x51, 0x49, 0x46}, // 2
  {0x21, 0x41, 0x45, 0x4b, 0x31}, // 3
  {0x18, 0x14, 0x12, 0x7f, 0x10}, // 4
  {0x27, 0x45, 0x45, 0x45, 0x39}, // 5
  {0x3c, 0x4a, 0x49, 0x49, 0x30}, // 6
  {0x01, 0x71, 0x09, 0x05, 0x03}, // 7
  {0x36, 0x49, 0x49, 0x49, 0x36}, // 8
  {0x06, 0x49, 0x49, 0x29, 0x1e}, // 9
  {0x00, 0x36, 0x36, 0x00, 0x00}, // :
  {0x00, 0x56, 0x36, 0x00, 0x00}, // ;
  {0x08, 0x14, 0x22, 0x41, 0x00}, // <
  {0x14, 0x14, 0x14, 0x14, 0x14}, // =
  {0x00, 0x41, 0x22, 0x14, 0x08}, // >
  {0x02, 0x01, 0x51, 0x09, 0x06}, // ?
  {0x32, 0x49, 0x79, 0x41, 0x3e}, // @
  {0x7e, 0x11, 0x11, 0x11, 0x7e}, // A
  {0x7f, 0x49, 0x49, 0x49, 0x36}, // B
  {0x3e, 0x41, 0x41, 0x41, 0x22}, // C
  {0x7f, 0x41, 0x41, 0x22, 0x1c}, // D
  {0x7f, 0x49, 0x49, 0x49, 0x41}, // E
  {0x7f, 0x09, 0x09, 0x09, 0x01}, // F
  {0x3e, 0x41, 0x49, 0x49, 0x7a}, // G
  {0x7f, 0x08, 0x08, 0x08, 0x7f}, // H
  {0x00, 0x41, 0x7f, 0x41, 0x00}, // I
  {0x20, 0x40, 0x41, 0x3f, 0x01}, // J
  {0x7f, 0x08, 0x14, 0x22, 0x41}, // K
  {0x7f, 0x40, 0x40, 0x40, 0x40}, // L
  {0x7f, 0x02, 0x0c, 0x02, 0x7f}, // M
  {0x7f, 0x04, 0x08, 0x10, 0x7f}, // N
  {0x3e, 0x41, 0x41, 0x41, 0x3e}, // O
  {0x7f, 0x09, 0x09, 0x09, 0x06}, // P
  {0x3e, 0x41, 0x51, 0x21, 0x5e}, // Q
  {0x7f, 0x09, 0x19, 0x29, 0x46}, // R
  {0x46, 0x49, 0x49, 0x49, 0x31}, // S
  {0x01, 0x01, 0x7f, 0x01, 0x01}, // T
  {0x3f, 0x40, 0x40, 0x40, 0x3f}, // U
  {0x1f, 0x20, 0x40, 0x20, 0x1f}, // V
  {0x3f, 0x40, 0x38, 0x40, 0x3f}, // W
  {0x63, 0x14, 0x08, 0x14, 0x63}, // X
  {0x07, 0x08, 0x70, 0x08, 0x07}, // Y
  {0x61, 0x51, 0x49, 0x45, 0x43}  // Z
};

// Hassas 9-Bit Zamanlamalı Seri İletişim Fonksiyonu
void hx1230_byteYaz(uint8_t veri, uint8_t is_veri) {
  digitalWrite(pin_CE, LOW);
  
  // İlk bit: D/C (0: Komut, 1: Veri)
  digitalWrite(pin_CLK, LOW);
  digitalWrite(pin_DIN, is_veri);
  digitalWrite(pin_CLK, HIGH);
  
  // Geri kalan 8 bitlik veri bloğu
  for (int i = 7; i >= 0; i--) {
    digitalWrite(pin_CLK, LOW);
    digitalWrite(pin_DIN, (veri >> i) & 0x01);
    digitalWrite(pin_CLK, HIGH);
  }
  digitalWrite(pin_CE, HIGH);
}

void hx1230_komutYaz(uint8_t komut) {
  hx1230_byteYaz(komut, LOW);
}

void hx1230_veriYaz(uint8_t veri) {
  hx1230_byteYaz(veri, HIGH);
}

// Orijinal Komut Setine Uyarlanmış Yeni Kontrast Fonksiyonu
void hx1230_kontrastAyarla(uint8_t seviye) {
  // Bu sürücü tipinde kontrast 0x80 (En açık) ile 0x9F (En koyu) arasındadır.
  // Giriş değerini 0 ile 31 (0x1F) arasında sınırlandırıp komut tabanına ekliyoruz.
  if (seviye > 31) seviye = 31;
  hx1230_komutYaz(0x81 | seviye);
}

void hx1230_init() {
  digitalWrite(pin_RESET, LOW);
  delay(5);
  digitalWrite(pin_RESET, HIGH);
  delay(5);
  
  hx1230_komutYaz(0xE2); 
  delay(2);
  hx1230_komutYaz(0x2F); 
  hx1230_komutYaz(0xA4); 
  hx1230_komutYaz(0xA6); 
  hx1230_komutYaz(0xA0); 
  hx1230_komutYaz(0xC0); 
  hx1230_komutYaz(0x40); 
  
  // EĞER KONTRAST DEĞİŞMİYORSA BU KOMUTU EKLE:
  //hx1230_komutYaz(0x24); // Dahili voltaj katsayısını kalibre et (1:4 Bias)
  delay(2);
  hx1230_komutYaz(0xAF|1); 
  hx1230_komutYaz(0x81); // Kontrast Ayarı
 
  delay(10);
}

void hx1230_ekranTemizle() {
  for (int sayfa = 0; sayfa < 9; sayfa++) {
    hx1230_komutYaz(0xB0 + sayfa);
    hx1230_komutYaz(0x00);
    hx1230_komutYaz(0x10);
    for (int sutun = 0; sutun < 96; sutun++) {
      hx1230_veriYaz(0x00);
    }
  }
}

void hx1230_yaziYaz(int satir, int sutun, const char* metin) {
  hx1230_komutYaz(0xB0 + satir);
  hx1230_komutYaz(sutun & 0x0F);
  hx1230_komutYaz(0x10 | ((sutun >> 4) & 0x0F));

  while (*metin) {
    char karakter = *metin;
    if (karakter >= 'a' && karakter <= 'z') karakter -= 32;
    int idx = karakter - 32;
    if (idx >= 0 && idx < (sizeof(font_haritasi) / 5)) {
      for (int i = 0; i < 5; i++) {
        uint8_t piksel_kolonu = pgm_read_byte(&(font_haritasi[idx][i]));
        hx1230_veriYaz(piksel_kolonu);
      }
      hx1230_veriYaz(0x00); // Harfler arası 1 piksel boşluk
    }
    metin++;
  }
}

void setup() {
  pinMode(pin_RESET, OUTPUT);
  pinMode(pin_CE, OUTPUT);
  pinMode(pin_NC, OUTPUT);
  pinMode(pin_DIN, OUTPUT);
  pinMode(pin_CLK, OUTPUT);
  pinMode(pin_VCC, OUTPUT);
  pinMode(pin_BL, OUTPUT);
  pinMode(pin_GND, OUTPUT);

  // Güç Hatlarını Başlatma
  digitalWrite(pin_GND, LOW);   
  digitalWrite(pin_NC, LOW);    
  digitalWrite(pin_VCC, HIGH);  
  digitalWrite(pin_BL, HIGH);   
  delay(100);                  
  
  hx1230_init();         
  hx1230_ekranTemizle(); 
  
  // Yeni eklenen kontrast fonksiyonunu test etmek isterseniz (0-31 arası):
   hx1230_kontrastAyarla(0x81); // Varsayılan 0x8B değerine denk gelir.
  
  // Metin Testi
  hx1230_yaziYaz(2, 16, "HX1230 LCD");
  hx1230_yaziYaz(4, 14, "DIMMER MODU");
   //hx1230_komutYaz(0xA7);
   //hx1230_komutYaz(0x9F);
}

void loop() {
  // Ekran ışığını yavaşça açalım
  for (int parlaklik = 0; parlaklik <= 255; parlaklik += 5) {
    analogWrite(pin_BL, parlaklik);
    delay(50); // Değişimi görebilmek için kısa bir bekleme
  }

  // Ekran ışığını yavaşça kısalım
  for (int parlaklik = 255; parlaklik >= 0; parlaklik -= 5) {
    analogWrite(pin_BL, parlaklik);
    delay(50);
  }
  
  delay(1000); // 1 saniye karanlıkta bekle ve tekrarla
}

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
↑ Sayfa Başı
📞 İletişim ✉ E-Posta Gönder 🟥 YouTube
© 2026 Yenidir.com
Yenidir CMS V0.1