ESP32 C3 MINI ile SSD1306 OLED Ekran Kullanımı
Bugün sizlere ESP-IDF Platform.io geliştirme ortamında ESP32 C3 MINI kartında SSD1306 OLED Ekran kullanımını göstereceğim.
ESP-IDF framework ile oluşturulan proje örneklerini internette bulmak arduino framework’u ile yapılan projelere nazaran bulmak daha zor. SSD1306 ekranını bu framework ile kullanmak istediğimde internette çok bir şey bulamadım. Bundan dolayı bu yazıyı yazmak istedim. ESP-IDF kullanılarak yapılan projelerde daha çok şey öğrenmeniz gerekebiliyor ama bunun karşılığında daha özgür ve daha profesyonel işler çıkarabiliyorsunuz. Arduino framework daha rahat olduğu için hızlı prototipleme yapabiliyorsun. Eğer bu prototiplemeyi daha ileriye götürmek istiyorsan birazcık hazır kütüphanelerin soyutlamasından uzak bir şekilde elini koda bulaştırman gerekiyor.
Bu yazımda kullandığım kart ve komponentleri paylaşacak olursam:
ESP32-C3 Mini WiFi Bluetooth Modülü
SSD1306 128x64 0.96” 4 Pin Oled Grafik Lcd Ekran
SSD1306 Ekranı kullanmak için nopnop2002 github reposunda bulunan kütüphaneyi kullanacağım.
Bu kütüphaneyi ekranı kullanmak için araştırırken buldum ve işimi haliyle karşıladı. Size de bunun türkçe bir dökümantasyonunu yapmış olacağım.
KÜTÜPHANE KURULUMU
İlk olarak visual studio code içerisinde platform.io extension ile bir esp32 projesi oluşturuyoruz.
oluşturduğumuz projenin .ini dosyası şu şekilde olmalıdır:
[env:esp32-c3-devkitm-1]
platform = espressif32
board = esp32-c3-devkitm-1
framework = espidf
monitor_speed = 115200
build_flags =
-I lib
-I include
esp32-c3-devkitm-1 kartını seçtiğimiz zaman ESP32 C3 MINI kartını doğru bir şekilde kullanabiliyorsunuz.
Daha sonra github reposunu zip olarak bilgisayara indirin. İndirdiğiniz repo’da components klasöründe kullanacağımız kütüphanenin dosyaları mevuttur.
Oluşturduğumuz platform.io projesinin lib klasörü içerisine ssd1306 adında bir klasör oluşturup, aşağıda vereceğim dosyaları içerisine atınız.
- CMakelists.txt
- Kconfig.projbuild
- ssd1306_i2c_legacy.c
- ssd1306_i2c_new.c
- ssd1306_spi.c
- ssd1306.c
- ssd1306.h
Oluşturduğumuz platform.io projesinin include klasörü içerisine components klasöründe olan font8x8_basic.h dosyasını taşıyın.
build_flags =
-I lib
-I include
platform.ini içerisinde yazdığımız build_flags’ler sayesinde bu klasörler içerisinde gerekli olan dosyalar derleme sırasında kullanılacaktır.
KÜTÜPHANENİN KULLANIMI
Kütüphanede işimize yarayacak birçok kullanışlı fonskiyon vardır. Ben bu fonskiyonlardan text yazdırma ve image yazdırma için gerekli olan fonskiyonların kullanımını açıklayacağım.
LCD EKRANA TEXT YAZDIRMA
İlk olarak LCD Ekranı başlatmak için bazı ayarlamalar yapmamız gereklidir.
Almış olduğum kartın sayfasında GPIO pinout’u gösteren şemaya bakmalıyız.
Görüldüğü gibi SDA ve SCL pini sırasyıla GPIO6 ve GPIO7’dir.
Şimdi bu bilgilere göre ekranın bazı initialize kodlarını yazmalıyız.
#define TAG "DISPLAY"
#define SDA_PIN 6
#define SCL_PIN 7
Bu define’larda GPIO I2C pinlerni ve log için TAG ismini verdik
SSD1306_t dev;
SSD1306_t struct’i ile bir adet ekran oluşturmuş olduk.
// I2C baslatildi
i2c_master_init(&dev, SDA_PIN, SCL_PIN, -1);
// 128x64 ekranı başlatma fonksiyonu
ssd1306_init(&dev, 128, 64);
// 3. Ekranı temizleme fonksiyonu
ssd1306_clear_screen(&dev, false);
Bu kodlar ile ekranı başlatmış olduk. İlk satır kodda i2c başlattık. Daha sonra ekranı initialize ettik. Bu fonksiyon ile i2c addresine göre i2c seçiliyor, sonra buffer için memory ayrılıyor
clear_screen ile tüm satırlar boş pixel ile sıfırlanır.
Bunları yaptıktan sonra text yazdırmak için gerekli olan kodlara geçebiliriz:
Tüm kodları da şuraya bırakayım:
#define TAG "DISPLAY"
#define SDA_PIN 6
#define SCL_PIN 7
void app_main() {
SSD1306_t dev;
// I2C baslatildi
i2c_master_init(&dev, SDA_PIN, SCL_PIN, -1);
// 128x64 ekranı başlatma fonksiyonu
ssd1306_init(&dev, 128, 64);
// 3. Ekranı temizleme fonksiyonu
ssd1306_clear_screen(&dev, false);
NORMAL METİN YAZDIRMA
void ssd1306_display_text(SSD1306_t *dev, int page, const char *text, int text_len, bool invert);
- dev : Ekran cihaz pointer’ı
- page : Satır numarası (0-7) - 128x64’te 8 satır, 128x32’de 4 satır
- text : Yazılacak metin (string)
- text_len : Metnin karakter uzunluğu
- invert : Renk ters çevirme (false=siyah zemin/beyaz yazı, true=beyaz zemin/siyah yazı)
// 0. satıra "Hello" yaz
ssd1306_display_text(&dev, 0, "Hello", 5, false);
// 2. satıra ters renkte yaz
ssd1306_display_text(&dev, 2, "Inverted", 8, true);
// bu da normal yazma işlemi
ssd1306_display_text(dev, 0, "Normal Text", 11, false);
Main fonksiyonu içerisinde bunları yazarsak çıktımız şu şekilde olacaktır:
3x BÜYÜK YAZDIRMA
ssd1306_display_text_x3(dev, 2, "BIG", 3, false);
INVERTED TEXT YAZDIRMA
// inverted text
ssd1306_display_text_x3(dev, 6, "HI !", 8, true);
}
Sondaki argümana false yerine true yazarsak ters renkte yazma işlemi yapmış oluruz.
BITMAP OLARAK IMAGE OLUŞTURMA
Resmimizi oled ekranın her bir pixeline değer vererek oluşturabiliriz. Bunun için image2cpp sayfasını kullanabilirsiniz !
void text_3(SSD1306_t *dev){
void ssd1306_bitmaps(SSD1306_t *dev, int xpos, int ypos, const uint8_t *bitmap, int width, int height, bool invert);
}
void text_3(SSD1306_t *dev){
ssd1306_bitmaps(dev,2,2,gordon, 128,64,false);
}
Buradaki parametrelerin anlamı şu şekildedir:
- dev = SSD1306 ekran cihazı
- 2 = Görseli soldan 2 piksel içeride başlat
- 2 = Görseli yukarıdan 2 piksel aşağıda başlat
- gordon = “gordon” adlı bitmap verisi
- 128 = Görsel 128 piksel genişliğinde
- 64 = Görsel 64 piksel yüksekliğinde
- false = Normal renk (siyah zemin, beyaz görsel)
KODLARININ İNDİRİLMESİ
bu yazıda bulunan tüm kodları bu github adresinde bulabilirsiniz.
Herkese kolay gelsin, iyi çalışmalar.