Taşınabilir, pille çalışan Arduino projelerinde ekranların sürekli açık kalması pilleri çok hızlı tüketir. HX1230 ekranı doğrudan Arduino pinlerinden beslediğimiz için (Ters Pin Dizilimi avantajıyla), sadece yazılımsal komutlarla hem ekran panelini derin uykuya alabilir hem de arka ışığı tamamen kapatarak çekilen akımı mikroamper (μA) seviyelerine indirebiliriz.
Aşağıdaki fonksiyonlar, Port Manipülasyonu mimarimize tam uyumlu şekilde arka ışığı (Gece Modu) kontrol etmenizi ve tüm sistemi derin uykuya (Power Down) sokup tek komutla uyandırmanızı sağlar.
Mevcut projenize ekleyebileceğiniz güç tasarrufu fonksiyonları ve bunları test eden dinamik loop() örneği:
// 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ı
#define BIT_BL 6 // PORTD6 (Arka Işık Pini)
// 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++;
}
}
/**
* Arka Işık Kontrolü (Gece Modu)
* @param durum: true ise arka ışık açılır, false ise kapanır.
*/
void hx1230_arkaIsik(bool durum) {
if (durum) {
PORTD |= (1 << BIT_BL); // BL -> HIGH (Işık Açık)
} else {
PORTD &= ~(1 << BIT_BL); // BL -> LOW (Işık Kapalı)
}
}
/**
* Ekranı Derin Uyku Moduna Sokar (Power Down)
* Bu modda ekran paneli kapanır, dahili voltaj pompası durur ve akım tüketimi minimuma iner.
*/
void hx1230_uykuModu() {
hx1230_arkaIsik(false); // Önce arka ışığı söndür (En çok akımı o çeker)
hx1230_komutYaz(0xAE); // Display OFF (Ekranı kapatır)
hx1230_komutYaz(0x28); // Voltas Pompasını Kapat (Internal Power OFF)
}
/**
* Ekranı Uykudan Uyandırır (Wake Up)
* Orijinal init ayarlarını koruyarak ekranı saniyeler içinde eski haline döndürür.
*/
void hx1230_uyandir() {
hx1230_komutYaz(0x2F); // Voltaj Pompasını Yeniden Aç (Power Control ON)
hx1230_komutYaz(0xAF); // Display ON (Ekran Panelini Aç)
hx1230_arkaIsik(true); // Arka ışığı tekrar yak
}
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() {
// 1. EKRAN AKTİF: Yazıları yaz ve 5 saniye bekle
hx1230_uyandir();
hx1230_ekranTemizle();
hx1230_yaziYaz(2, 20, "SISTEM AKTIF");
hx1230_yaziYaz(4, 16, "AKIM: 15-20mA");
delay(5000);
// 2. GECE MODU TESTİ: Arka ışığı kapat ama yazılar ekranda kalsın (Gündüz/Işıklı ortam modu)
hx1230_ekranTemizle();
hx1230_yaziYaz(2, 14, "ARKA ISIK KAPALI");
hx1230_yaziYaz(4, 22, "AKIM: ~1-2mA");
hx1230_arkaIsik(false);
delay(4000);
// 3. DERIN UYKU MODU: Ekranı tamamen kapat ve pilden tasarruf et
// Ekran bu aşamada neredeyse 0mA (birkaç mikroamper) çeker.
hx1230_uykuModu();
delay(4000); // 4 saniye boyunca sistem uyku modunda kalır
}
Yaptığımız optimizasyonlar neticesinde ekranın farklı senaryolarda harcadığı yaklaşık güç değerleri şu şekildedir:
| Çalışma Modu | Arka Işık Durumu | Ekran Paneli Durumu | Ortalama Akım Tüketimi |
|---|---|---|---|
| Tam Performans | AÇIK (HIGH) | AÇIK (0xAF) | 15 mA - 25 mA (Arka ışık ledine bağlı) |
| Eko / Gündüz Modu | KAPALI (LOW) | AÇIK (0xAF) | 800 μA - 1.5 mA (Sadece çip akımı) |
| Derin Uyku (Deep Sleep) | KAPALI (LOW) | KAPALI (0xAE) | < 10 μA (Mikroamper seviyesi) |
Henüz yorum yapılmamış. İlk yorumu siz yapın!