“`html
Genel Bakış
U8g2, gömülü cihazlar için bir monokrom grafik kütüphanesidir. Olikraus tarafından sağlanmıştır
“`

- Desteklenen Ekran Kontrolcüleri: SSD1305, SSD1306, SSD1309, SSD1322, SSD1325, SSD1327, SSD1329, SSD1606, SSD1607, SH1106, SH1107, SH1108, SH1122, T6963, RA8835, LC7981, PCD8544, PCF8812, HX1230, UC1601, UC1604, UC1608, UC1610, UC1611, UC1701, ST7565, ST7567, ST7588, ST75256, NT7534, IST3020, ST7920, LD7032, KS0108, SED1520, SBN1661, IL3820, MAX7219 (tam liste için buraya bakın)
U8g2 ayrıca U8x8 kütüphanesini de içerir. U8g2 ve U8x8 için özellikler:
- U8g2
Tüm grafik prosedürlerini (çizgi/kutu/daire çizimi) içerir.
Birçok yazı tipini destekler. (Neredeyse) yazı tipi yüksekliği üzerinde kısıtlama yoktur.
Ekranı görüntülemek için mikrodenetleyicide biraz bellek gerektirir. - U8x8
Sadece metin çıktısı veren (karakter) cihazıdır.
Sadece sabit boyutlu karakterler için yazı tiplerine izin verilir (8×8 piksel).
Ekrana doğrudan yazar. Mikrodenetleyicide tampon gerektirmez.
Bir tane daha sınıf/alt kütüphane “U8log” vardır, bu bir çıkış terminalini taklit eder (Arduino seri monitörü gibi): U8log Referans Kılavuzu
U8g2’yi Kurun
Arduino kütüphanesi U8g2, Arduino IDE’nin kütüphane yöneticisinden kurulabilir.
- Arduino IDE’yi açın
- Kütüphane Yöneticisini açın (Sketch > Kütüphane Ekle > Kütüphaneleri yönet…)

- Arama alanına “u8g2” yazın
- En son sürümü seçin
- “Kur” butonuna tıklayın

En son U8g2 kütüphanesini kullanmak istiyorsanız, bağlantıya tıklayın: U8g2_Arduino
- Arduino IDE’yi açın
- Kütüphane Yöneticisini açın (Sketch > Kütüphane Ekle > .ZIP Kütüphanesi Ekle…).
- En son indirilen U8g2 kütüphanesini seçin.

U8g2 kütüphanesi başarılı bir şekilde kurulduktan sonra Örnekler’de görülebilir

U8g2 Kütüphanesine bir ekran nasıl bağlanır?
Ekranı tanımlayın
Ekranınızın kontrolcüsünü ve boyutunu bilmeniz gerekiyor (Not: “Kontrolsüz” ekranlar U8g2 tarafından desteklenmez). Bu örnekte, bir Seeed_128x128 128×64 ekran ve kontrolcü olarak K210 Pi kullanacağız.
U8g2 için ekranın doğru başlatılması için uygun bir yapıcı seçmelisiniz. Bu sayfadan bir yapıcı seçin: C++ Kurulum/Arduino Yapıcı Listesi.
Fiziksel bir veri yolu seçin
Grafik bilgileri ekrana gönderilmelidir. Bu bilgiler, bir fiziksel veri yolu (genellikle iki veya daha fazla veri hattı), bir iletişim protokolü ve bir komut dizisi aracılığıyla ekran kontrolcüsü tarafından alınır. Genellikle bir ekran birden fazla fiziksel veri yolunu destekler. Doğru veri yolunu seçip ayarlamalısınız. Tipik olarak veri yolları şunlardır:
- 3SPI, 3-telli SPI: Üç sinyal ile Seri Peripheral Arayüzü: Saat, Veri ve Çip Seçimi.
- 4SPI, 4-Telli SPI: 3SPI ile aynı, ancak komutlar ve veriler için bir ek hat ile (genellikle D/C, RS veya A0 olarak etiketlenir)
- I2C, IIC veya TWI: İki sinyal ile Entegre Devreler Arası Veri Yolu: Saat (SCL) ve Veri (SDA).
- 8080: 8 veri hattı, çip seçimi ve bir yazma darbe sinyali gerektiren 8-Bit veri yolu.
- 6800: Farklı bir protokole sahip başka bir 8-Bit veri yolu.
Seeed_128X128 ekran I2C’yi fiziksel veri yolu olarak kullandığı için OLED ekranı K210 PI ile I2C üzerinden bağlıyoruz.
U8g2 başlatma
U8g2, hangi çıkış pininin ekranın hangi girişine bağlı olduğunu bilmelidir: Pin numaraları U8g2 yapıcısına argüman listesi olarak sağlanır. Listede konum önemlidir ve pinin işlevini/görevini gösterir.
Buradaki tablodan, yapıcının aşağıdaki şablona sahip olduğunu görebilirsiniz:
U8G2_SH1107_SEEED_128X128_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);xxxxxxxxxxU8G2_SH1107_SEEED_128X128_F_SW_I2C u8g2(U8G2_R0, /* saat=*/ SCL, /* veri=*/ SDA, /* reset=*/ U8X8_PIN_NONE);İlk parametre döndürme seçeneğidir, yapıcı saat hattı (SCL) ve veri hattı (SDA) için pin numarasını bekler. Reset hattı isteğe bağlı olarak sağlanabilir. Donanım I2C kullanıyorsanız, SCL ve SDA’yı belirtmenize gerek yoktur.
Daha Fazla Bilgi Alın: U8g2 Kurulumu
Tam bir örnek şöyle görünecektir:
x#include <Arduino.h>#include <U8g2lib.h>#include <Wire.h>U8G2_SH1107_SEEED_128X128_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //donanım I2C'yi kullanın.void setup(void) {u8g2.begin();}void loop(void) {u8g2.clearBuffer(); // dahili belleği temizleu8g2.setFont(u8g2_font_ncenB08_tr); // uygun bir yazı tipi seçinu8g2.drawStr(0,10,"Merhaba Dünya!"); // dahili belleğe bir şey yazınu8g2.sendBuffer(); // dahili belleği ekrana aktardelay(1000);}K210 PI üzerinde bir U8g2 Arduino projesi başlatın
K210 PI’nin U8g2 kütüphanesini çalıştırabilmesi için en son K210 PI kütüphanesini ve U8g2 kütüphanesini indirmeniz gerekir.
Ayrıca, derleme sırasında “Komut satırı çok uzun” hatası alabilirsiniz. Bu sorunu, \src\clib dizinindeki .c dosyasını silerek ve yalnızca mevcut ekran dosyasını tutarak çözebilirsiniz.
- Ekran yapılandırma dosyasının formatı: u8x8_d_ekran_boyut.c.
Kalın kısım, belirli ekran modeli ve boyutudur.
Örneğin, bu sefer kullandığımız ekran yapılandırma dosyası: u8x8_d_sh1107.c.
API Referansı
U8g2 kütüphanesi, kullanıcıların kullanması için çok sayıda API sağlar. Aşağıdaki tablo, en yaygın kullanılan API’leri ve açıklamalarını göstermektedir.
| API | Açıklama |
|---|---|
| begin | bir ekran başlatır. |
| clear | Ekrandaki tüm pikselleri ve tamponu temizler. |
| initDisplay | Ekranı sıfırlar ve yapılandırır. |
| sendBuffer | Bellek çerçeve tamponunun içeriğini ekrana gönderir. |
| clearBuffer | Bellek çerçeve tamponundaki tüm pikselleri temizler. |
| clearDisplay | Dahili tampondaki ve bağlı ekrandaki tüm pikselleri temizler. |
| drawPixel | Belirtilen x/y konumunda bir piksel çizer. |
| drawLine | İki nokta arasında bir çizgi çizer. |
| drawBox | x/y konumunda (sol üst köşe) bir kutu (doldurulmuş çerçeve) çizer. |
| drawCircle | x0, y0 konumunda radüs rad olan bir daire çizer. |
| drawDisc | x0, y0 konumunda radüs rad olan doldurulmuş bir daire çizer. |
| drawEllipse | x0, y0 konumunda rx ve ‘ry’ radüslerine sahip bir elips çizer. |
| drawFilledEllipse | x0, y0 konumunda rx ve ‘ry’ radüslerine sahip doldurulmuş bir elips çizer. |
| drawFrame | x/y konumunda (boş kutu) bir çerçeve çizer. |
| drawTriangle | x/y konumunda (sol üst köşe) bir üçgen (doldurulmuş çokgen) çizer. |
| setFont | Glyph ve dize çizim fonksiyonları için bir u8g2 yazı tipi tanımlar. |
| drawGlyph | Tek bir karakter çizer. |
| drawStr | Bir dize çizer. İlk karakter x ve y konumuna yerleştirilir. |
| Belirtilen x/y konumunda (bitmap’ın sol üst köşesi) bir bitmap çizer. ==kullanımdan kaldırıldı== | |
| drawXBM | Bir XBM Bitmap çizer. (x,y) konumu bitmap’ın sol üst köşesidir. |
| firstPage | Bu komut, ekranın içeriğini işleyen (resim) döngüsünün bir parçasıdır. |
| nextPage | Bu komut, ekranın içeriğini işleyen (resim) döngüsünün bir parçasıdır. |
| setBitmapMode | Bitmap’ı şeffaf veya katı olarak ayarlar. |
| setCursor | Yazdırma fonksiyonu için imleci tanımlar. Yazdırma fonksiyonunun çıktısı bu konumda başlar. |
| setDisplayRotation | Ekran döndürmesini değiştirir. |
U8g2 API’si hakkında daha fazla bilgi burada bulunabilir.
Demonstrasyon
Temel
Aşağıda U8g2 tarafından sağlanan temel çizim fonksiyonlarının nasıl kullanılacağı ve görüntüleneceği gösterilmektedir.
src
xxxxxxxxxx
U8G2_SH1107_SEEED_128X128_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8g2.begin(); // bir ekran başlat.
}
//
void drawPixels()
{
u8g2.clearBuffer(); // iç belleği temizle
for(int i = 0; i < 100; i++){
// 100 noktayı rastgele oluştur
u8g2.drawPixel(random(128), random(128));
u8g2.sendBuffer();
delay(5);
}
}
void drawLines()
{
u8g2.clearBuffer(); // iç belleği temizle
u8g2.drawLine(0,0, u8g2.getDisplayWidth(), u8g2.getDisplayHeight());
u8g2.sendBuffer();
delay(1000);
u8g2.drawLine(u8g2.getDisplayWidth(),0, 0, u8g2.getDisplayHeight());
u8g2.sendBuffer();
delay(1000);
u8g2.drawLine(0, u8g2.getDisplayHeight()/2, u8g2.getDisplayWidth(), u8g2.getDisplayHeight()/2);
u8g2.sendBuffer();
delay(1000);
u8g2.drawBoxes()
{
u8g2.clearBuffer(); // iç belleği temizle
u8g2.drawBox(0, 0, u8g2.getDisplayWidth()/2-5,u8g2.getDisplayHeight()/2-5);
u8g2.sendBuffer();
delay(1000);
u8g2.drawBox(0, u8g2.getDisplayHeight()/2+5, u8g2.getDisplayWidth()/2-5,u8g2.getDisplayHeight());
u8g2.sendBuffer();
delay(1000);
u8g2.drawBox(u8g2.getDisplayWidth()/2+5, 0, u8g2.getDisplayWidth(),u8g2.getDisplayHeight()/2-5);
u8g2.sendBuffer();
}
void drawFrames()
{
u8g2.clearBuffer(); // iç belleği temizle
u8g2.drawFrame(u8g2.getDisplayWidth()/2-10, u8g2.getDisplayHeight()/2-10, 20, 20);
u8g2.sendBuffer();
delay(1000);
u8g2.drawFrame(u8g2.getDisplayWidth()/2-20, u8g2.getDisplayHeight()/2-20, 40, 40);
u8g2.sendBuffer();
delay(1000);
u8g2.drawFrame(u8g2.getDisplayWidth()/2-30, u8g2.getDisplayHeight()/2-30, 60, 60);
u8g2.sendBuffer();
delay(1000);
u8g2.drawFrame(u8g2.getDisplayWidth()/2-40, u8g2.getDisplayHeight()/2-40, 80, 80);
u8g2.sendBuffer();
delay(1000);
u8g2.drawFrame(u8g2.getDisplayWidth()/2-50, u8g2.getDisplayHeight()/2-50, 100, 100);
u8g2.sendBuffer();
}
void drawCircles()
{
u8g2.clearBuffer(); // iç belleği temizle
u8g2.drawCircle(u8g2.getDisplayWidth()/2, u8g2.getDisplayHeight()/2, 30, U8G2_DRAW_UPPER_RIGHT);
u8g2.sendBuffer();
delay(1000);
u8g2.drawCircle(u8g2.getDisplayWidth()/2, u8g2.getDisplayHeight()/2, 30, U8G2_DRAW_UPPER_LEFT);
u8g2.sendBuffer();
delay(1000);
u8g2.drawCircle(u8g2.getDisplayWidth()/2, u8g2.getDisplayHeight()/2, 30, U8G2_DRAW_LOWER_LEFT);
u8g2.sendBuffer();
delay(1000);
u8g2.drawCircle(u8g2.getDisplayWidth()/2, u8g2.getDisplayHeight()/2, 50, U8G2_DRAW_ALL);
u8g2.sendBuffer();
}
void loop(void) {
drawPixels();
delay(2000);
drawLines();
delay(2000);
drawFrames();
delay(2000);
drawCircles();
delay(2000);
drawBoxes();
delay(2000);
}
demo
String
U8g2, güçlü metin çıktı yetenekleri sunar, yalnızca çıktı metninin boyutunu değiştirmekle kalmaz, aynı zamanda yazı tipi formatını da değiştirebilir.
- setFont(const uint8_t *font). daha fazla
- drawStr(u8g2_uint_t x, u8g2_uint_t y, const char *s). daha fazla
src
xxxxxxxxxx
U8G2_SH1107_SEEED_128X128_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.clearBuffer(); // iç bellek temizleniyor
u8g2.setFont(u8g2_font_ncenB08_tr); // uygun bir yazı tipi seçin
u8g2.drawStr(0,10,"Hello World!"); // iç belleğe bir şey yazın
u8g2.setFont(u8g2_font_ncenB18_tr); // uygun bir yazı tipi seçin
u8g2.drawStr(0,40,"Hello World!"); // iç belleğe bir şey yazın
u8g2.setFont(u8g2_font_pieceofcake_mel_tr); // uygun bir yazı tipi seçin
u8g2.drawStr(0,60,"Hello World!"); // iç belleğe bir şey yazın
u8g2.setCursor(40, 80);
u8g2.setFont(u8g2_font_ncenB08_tr); // uygun bir yazı tipi seçin
u8g2.print("Hello World!");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(40, 100, 0x2603);
u8g2.sendBuffer(); // iç belleği ekrana aktarın
delay(1000);
}
demo

Görüntü
U8g2 kütüphanesi, görüntüleri görüntülemek için iki fonksiyon sağlar.
drawBitmap()(kullanımdan kaldırıldı).- drawXBM().
Monokrom OLED’de görüntüyü göstermek için, görüntüyü XBM formatına dönüştürmemiz gerekiyor. Bunu çevrimiçi olarak WEB üzerinden veya bildiğiniz herhangi bir araçla dönüştürebilirsiniz.

xxxxxxxxxx
static const unsigned char logo_2018_horizontal_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x02, 0x00, 0xC0, 0x40, 0x00,
0x00, 0x80, 0x02, 0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x38, 0x00,
0x00, 0x00, 0x80, 0x00, 0x00, 0xE0, 0x0F, 0xF8, 0x07, 0xF8, 0x07, 0xF8,
0x07, 0xF0, 0x39, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0xF0, 0x3F, 0xFC,
0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x3B, 0x00, 0x00, 0x20, 0x80, 0x02,
0x00, 0x38, 0x18, 0x3E, 0x1E, 0x3E, 0x1E, 0x3E, 0x1F, 0xFE, 0x3F, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0E, 0x3C, 0x0F, 0x3C, 0x0F,
0x3C, 0x1F, 0x3F, 0x00, 0x00, 0x10, 0x00, 0x01, 0x04, 0x78, 0x00, 0x0F,
0x38, 0x0F, 0x38, 0x0F, 0x38, 0x0F, 0x3C, 0x00, 0x00, 0x28, 0x00, 0x06,
0x00, 0xF8, 0x07, 0xEF, 0x3F, 0xDF, 0x3F, 0xF7, 0x3F, 0x07, 0x3C, 0x02,
0x10, 0x28, 0x00, 0x04, 0x04, 0xF0, 0x1F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF,
0xBF, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xC0, 0x3F, 0xFF,
0x7F, 0xFF, 0x7F, 0xFF, 0xBF, 0x07, 0x3C, 0x08, 0x18, 0x10, 0x00, 0x06,
0x02, 0x00, 0x38, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x3C, 0x00,
0x00, 0x28, 0x00, 0x00, 0x04, 0x00, 0x78, 0x0F, 0x00, 0x0F, 0x00, 0x0F,
0x00, 0x0F, 0x3C, 0x00, 0x20, 0x10, 0x00, 0x06, 0x04, 0x38, 0x38, 0x1E,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x1F, 0x3F, 0x04, 0x18, 0x28, 0x00, 0x01,
0x01, 0xF8, 0x3F, 0xFC, 0x1F, 0xFC, 0x1F, 0xFC, 0x1F, 0xFE, 0x3F, 0x00,
0x00, 0x20, 0x00, 0x04, 0x02, 0xF8, 0x1F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8,
0x1F, 0xFC, 0x3B, 0x01, 0x60, 0x10, 0x00, 0x82, 0x02, 0xC0, 0x07, 0xE0,
0x03, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x39, 0x00, 0x40, 0x20, 0x00, 0x42,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xA0, 0x60, 0x80, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x80, 0xB0,
0x00, 0x58, 0x80, 0x60, 0x10, 0x40, 0x00, 0x00, 0x03, 0x88, 0x00, 0x00,
0x00, 0x02, 0x00, 0x48, 0x00, 0xD8, 0x88, 0x64, 0x14, 0x40, 0x00, 0x10,
0x21, 0x88, 0x00, 0x00, 0x00, 0x09, 0x20, 0x28, 0x00, 0x98, 0x95, 0x2A,
0xDE, 0x7D, 0xDD, 0x2E, 0x7B, 0xBB, 0x36, 0x00, 0x00, 0x04, 0x00, 0x04,
0x00, 0x50, 0x9F, 0x2A, 0xD6, 0x57, 0xAD, 0x3A, 0x91, 0xAB, 0x17, 0x00,
0x00, 0x50, 0x80, 0x02, 0x00, 0x50, 0x99, 0x6E, 0xD4, 0x75, 0xEF, 0x1A,
0xAF, 0xBB, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
src
xxxxxxxxxx
void setup(void) {
u8g2.begin();
Serial.begin(115200);
}
void loop(void) {
u8g2.clearBuffer(); // clear the internal memory
u8g2.drawXBM(0,0, 128, 32, logo_2018_horizontal_bits);
u8g2.sendBuffer(); // transfer internal memory to the display
//Serial.println(sizeof(ironman_bits));
Serial.println("work");
delay(1000);
}
demo

Performans
Kendryte K210 veri sayfasına göre, I2C aşağıdaki modlarda çalışabilir:
- Standart mod (0’dan 100Kb/s’ye).
- Hızlı mod (<= 400Kb/s).
U8g2 örnekleri, performans testinin bir örneğini içerir.
- Örneği açın: FPS (Dosya > Örnekler > U8g2 > full_buffer > FPS).
- İlgili yapıcı satırını yorumdan çıkarın.
xxxxxxxxxx
U8G2_SH1107_SEEED_128X128_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
- İlk u8g2.begin() çağrısından önce u8g2.setBusClock() çağrısını yapın.
xxxxxxxxxx
u8g2.setBusClock(100000); //I2C'nin saat frekansını 100Khz olarak ayarlayın
- Sonuçları görmek için derleyin ve çalıştırın.
demo
FPS’nin yaklaşık 15 civarında olduğunu görebiliriz, bu da birçok uygulama senaryosunu karşılayabilir.
xxxxxxxxxx
u8g2.setBusClock(400000); //I2C'nin saat frekansını 400Khz olarak ayarlayın.
demo
I2C’nin çalışma frekansı 400Khz modunda olduğunda, FPS yaklaşık 25’e ulaşır. Pratikte, I2C frekansları daha hızlı olabilir, ancak CPU kararsız olabilir, bu yüzden dikkatli kullanın.
Bu makale, U8g2 kütüphanesinin en yaygın özelliklerinden bazılarını göstermektedir. Daha fazla bilgi için buraya tıklayın.

