İçindekiler:

OLED Ekran ve Arduino İle Eğlence: 12 Adım (Resimlerle)
OLED Ekran ve Arduino İle Eğlence: 12 Adım (Resimlerle)

Video: OLED Ekran ve Arduino İle Eğlence: 12 Adım (Resimlerle)

Video: OLED Ekran ve Arduino İle Eğlence: 12 Adım (Resimlerle)
Video: Trendyol da ki satıcının çakallığı 2024, Temmuz
Anonim
OLED Ekran ve Arduino ile Eğlence
OLED Ekran ve Arduino ile Eğlence

OLED ekran teknolojisini kesinlikle duymuşsunuzdur eminim. Nispeten yenidir ve eski LCD teknolojisinden daha iyi bir kalite sunar. Bu öğreticide, piyasada bulunan en yaygın tek renkli OLED ekran modüllerinden birinde verileri görüntülemek için gereken adımları gözden geçirmek istiyoruz. Bu modüldeki verileri görüntülemek için ilgili Adafruit kütüphanesinin sağladığı işlevleri açıklamaya çalışacağım.

Adım 1: Hangi OLED Modüllerini Kullanacağız?

Hangi OLED Modüllerini Kullanacağız?
Hangi OLED Modüllerini Kullanacağız?
Hangi OLED Modüllerini Kullanacağız?
Hangi OLED Modüllerini Kullanacağız?
Hangi OLED Modüllerini Kullanacağız?
Hangi OLED Modüllerini Kullanacağız?

OLED modülleri çok çeşitli boyut ve özelliklerde mevcuttur. Bu eğitimde kullanacağımız tek renkli 128x64 OLED modülüdür. Bu modül tipi aşağıdaki boyutlarda mevcuttur (Resimlerde gördüğünüz sırayla):

  • 128x64
  • 128x32
  • 96x16
  • 64x48
  • 64x32

Tüm bu modüller bir iletişim aracı olarak I2C protokolünü desteklediğinden, hepsinin kodu ve kablolaması birebir aynıdır. Tek fark, görüntüleyeceğiniz içeriğin buna tam olarak uyması için kodunuzdaki ekranın boyutunu dikkate almanız gerektiğidir.

Adım 2: Kısaca I2C

Özetle I2C
Özetle I2C

Philips tarafından 80'lerde bir cihazın merkezi işlem birimi (CPU) veya mikrodenetleyici birimi (MCU) ve periferik çipler. Temelde TV uygulaması için hedeflendi. Basitliği nedeniyle o kadar popüler hale geldi ki, bir süre sonra CPU'lar ve MCU'lar ve aynı PCB kartının gerekli bir parçası olmayan ve kabloyla (örn. sensörler, sensörler, vb.) ekran modülleri, vb.).

I2C, bir ana ve birkaç bağımlı cihaz arasında çift yönlü veri aktarımını destekleyen iki kablodan oluşan bir iletişim veri yolundan oluşur. Tipik olarak ana düğüm, veri yolunun kontrolünden sorumludur – bu aslında seri saat hattında (SCL) bir senkronizasyon sinyali üreterek yapılır. Bu, aktarım sırasında master tarafından sürekli olarak gönderilecek bir sinyaldir ve veri yoluna bağlı diğer tüm düğümler, iletişimlerini senkronize etmek ve veri yolunun hızını tespit etmek için bunu kullanır. Veriler, bir seri veri (SDA) hattı aracılığıyla master ve slave arasında aktarılır. İletim hızı 3.4 Mbps'ye kadar olabilir. I2C üzerinden veri aktarımı yapmak isteyen tüm cihazlar benzersiz bir adrese sahip olmalıdır ve cihazın işlevine bağlı olarak verici veya alıcı olarak çalışabilir. Örneğin, bir OLED ekran modülü, bazı verileri kabul eden ve bunları görüntüleyen bir alıcı iken, bir sıcaklık sensörü, yakalanan sıcaklığı I2C veri yolu aracılığıyla gönderen bir alıcı-vericidir. Normalde bir ana cihaz, veri yolu üzerinde bir veri aktarımını başlatan ve aktarıma izin vermek için saat sinyallerini üreten aygıttır. Bu aktarım sırasında, bu master tarafından adreslenen herhangi bir cihaz bağımlı olarak kabul edilir ve bu verileri okur.

Bir düğüm bir miktar veri göndermek istediğinde, verinin ilk baytı alıcının adresi olmalıdır ve ardından gerçek veri daha sonra gelir. Bu, I2C (örn.

I2C veriyolu ile ilgili detaylar ve teoriler hakkında daha fazla bilgi edinmek istiyorsanız, aşağıdaki referansları kullanabilirsiniz:

www.i2c-bus.org

learn.sparkfun.com/tutorials/i2c

Adım 3: Gerekli Modüller ve Bileşenler

Gerekli Modüller ve Bileşenler
Gerekli Modüller ve Bileşenler
Gerekli Modüller ve Bileşenler
Gerekli Modüller ve Bileşenler
Gerekli Modüller ve Bileşenler
Gerekli Modüller ve Bileşenler

Bu öğreticiyi tamamlamak için ihtiyaç duyacağınız bileşenlerin listesini burada bulabilirsiniz:

eBay bağlantıları:

  • 1 x Arduino Uno:
  • 1 x OLED modülü 128x64:
  • 4 x Dupont kablosu:
  • 1 x Mini lehimsiz devre tahtası:

Amazon.com bağlantıları:

  • 1 x Arduino Uno:
  • 1 x OLED modülü 128x64:
  • 4 x Dupont kablosu:
  • 1 x Mini lehimsiz devre tahtası:

Adım 4: OLED Ekran Modülünü Arduino'ya Bağlama

OLED Ekran Modülünü Arduino'ya Kablolama
OLED Ekran Modülünü Arduino'ya Kablolama
OLED Ekran Modülünü Arduino'ya Kablolama
OLED Ekran Modülünü Arduino'ya Kablolama
OLED Ekran Modülünü Arduino'ya Kablolama
OLED Ekran Modülünü Arduino'ya Kablolama
OLED Ekran Modülünü Arduino'ya Kablolama
OLED Ekran Modülünü Arduino'ya Kablolama

I2C özellikli cihazlarla ilgili önemli bir not, onları Arduino'ya bağlama şeklinizin hepsinin aynı olmasıdır. Bunun nedeni, Arduino'nun I2C iletişimini yalnızca belirli pinlerde çalıştırmasıdır. Bu derste Arduino Uno kullanıyorum. Arduino Uno, SCK olarak A5 ve SDA olarak A4 pinini kullanır. Böylece OLED ekran modülünü şematik görünümde gösterildiği gibi Arduino Uno'ya bağlayabiliriz. OLED ekran modülümden çektiğim resimde de fark edebileceğiniz gibi, VCC ve GND konektörü şematik görünümden farklı. Doğru şekilde bağladığınızdan emin olmak için modüllerinizdeki pinlerin etiketlerini kontrol etmeyi unutmayın.

Aşağıdaki gibi bağlanması gereken sadece 4 pime ihtiyacımız var:

Arduino VCC -> OLED Modülü VCC

Arduino GND -> OLED Modülü GND

Arduino 4 -> OLED Modül SDA

Arduino 5 -> OLED Modülü SCK

Adım 5: Ekran Modülünün Adresini Bulma

Ekran Modülünün Adresini Bulma
Ekran Modülünün Adresini Bulma

I2C özellikli bir cihaza bağlanmanın ilk adımı olarak modülün adresine sahip olmanız gerekir. Bunu yapmak için, modülü Arduino'nuza bağladıktan sonra, ekli kodu Arduino'nuza yüklemeniz yeterlidir. Bu kod, Arduino IDE'de bulunan ve I2C iletişimini yöneten bir kitaplık olan Wire kitaplığını içerir. Bağlı I2C cihazlarını taramaya çalışır ve adreslerini seri port üzerinden bilgisayarınıza gönderir. Böylece çıktısına Arduino IDE'deki Seri Monitör aracı ile erişebilirsiniz. Orijinal versiyon Arduino Playground'da mevcuttur). Ayrıca çevrimiçi Arduino Editörümde daha okunaklı bir şekilde görüntüleyebilirsiniz. Bu kod çalışırken ekranda hiçbir şeyin görüntülenmesini beklemeyin.

Resimde gördüğünüz gibi modülüm 0x3C adresine bağlı. Normalde belirli bir ürün hattındaki tüm cihazlar (örneğin tüm 128x64 OLED modülleri) aynı adrese sahiptir.

I2C cihazlarının adresleri 1'den 126'ya kadar sınırlıdır. Bu kod, her cihaza sırayla (herhangi bir veri iletmeden) bağlanmaya çalışır ve ardından sağlanan adrese bağlanırken temel kitaplık tarafından bildirilen herhangi bir hata olup olmadığını kontrol eder. Hata yoksa, adresi bağlanmak için uygun bir modül olarak yazdırır. Ayrıca ilk 15 adresin rezerve edildiğine dikkat edilmelidir, bu yüzden üzerlerinden atlar ve sadece bu aralığın üzerindekileri yazdırır. Bu I2C modüllerinin adresinin cihaz üzerinde sabit kodlu olduğunu ve değiştirilemeyeceğini unutmayın. Bu nedenle, bir dahaki sefere tarayıcı kodunu çalıştırmaya gerek kalmaması için, onu laboratuvar rafınıza geri koyacağınız zaman bir yere yazmak veya modülün üzerine bir etiket yapıştırmak iyi bir fikir olacaktır. Ancak bu karmaşık bir prosedür değil;)

Adım 6: OLED Modülünde Verileri Görüntülemek için Gerekli Kitaplıkları Yükleme

OLED Modülünde Verileri Görüntülemek için Gerekli Kitaplıkları Yükleme
OLED Modülünde Verileri Görüntülemek için Gerekli Kitaplıkları Yükleme
OLED Modülünde Verileri Görüntülemek için Gerekli Kitaplıkları Yükleme
OLED Modülünde Verileri Görüntülemek için Gerekli Kitaplıkları Yükleme

Wire kitaplığı, I2C cihazlarıyla düşük seviyeli iletişimi yönetebilir. Belirli bir cihazdan veri okumak/yazmak için belirli bir cihaza bağlanmak istediğinizde, normalde bu modülü orijinal olarak oluşturan şirket tarafından sağlanan bir kitaplık kullanırsınız. Bu kütüphane, verilen modül ile tüm I2C iletişim detaylarını ele alır ve bu durumda verileri istediğimiz şekilde görüntüleyen işimize daha fazla konsantre olmamızı sağlar.

Bu tür ekran modüllerinin orijinal versiyonunu üreten şirket olan Adafruit, bu monokrom ekranlardaki verileri görüntülemek için Adafruit SSD1306 adlı bir kitaplık sağlıyor. Bu yüzden kodlamaya başlamadan önce, bu kütüphaneyi Arduino IDE'deki Library Manager (Sket > Include Library > Manage Libraries… menüsünden erişilebilir) aracılığıyla kurmamız gerekiyor. Ayrıca daha düşük seviyeli grafik öğeleri işleyen ve Adafruit SSD1306 tarafından dahili olarak kullanılan Adafruit GFX Kütüphanesi adında başka bir kütüphane daha var. Resimlerde de göreceğiniz gibi her ikisinin de Arduino IDE'nizde kurulu olması gerekiyor.

7. Adım: Ekran Modülünü Başlatma

Ekran Modülünü Başlatma
Ekran Modülünü Başlatma

Ekran modülünde çizim, Adafruit_SSD1306 adlı bir sınıfa sarılır. Bu sınıfın tanımı Adafruit kütüphanesindedir, bu yüzden önce o kütüphaneyi dahil etmemiz gerekiyor. O zaman önce bu sınıfın bir örneğini başlatmalıyız. Bu sınıfın yapıcısı, pin 4 (SCK'ye bağlı) olan ekranın sıfırlanabileceği port numarasını alır. Kodun bu kısmı dosyanın başında yer almalıdır (kurulum() ve döngü() işlevlerinin dışında).

#Dahil etmek

Adafruit_SSD1306 ekranı(4);

Şimdi setup() işlevinin içinde, aşağıdaki gibi I2C adresimizi ileterek görüntüleme nesnesinin başlama işlevini çağırmalıyız (SSD1306_SWITCHCAPVCC, kitaplığa giden güç kaynağının türünü belirten sabit bir değerdir):

geçersiz kurulum() {

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); } void loop() {} // loop şimdilik boş olabilir

Artık görüntüleme nesnesi hazırdır ve işlevlerini çağırabiliriz (örn. display.write(), display.drawLine, vb.). Önemli not, görüntüleme nesnemizi çağırarak bir şey çizdiğimizde, asıl çizimin donanım seviyesinde gerçekleşmesi için display.display() işlevini çağırmamız gerektiğidir. Bunun temel nedeni, dediğimiz çizim işlevlerinin performans nedenleriyle ekranın "bellekteki" gösterimini güncellemesidir. Aslında değişiklikleri bellekte önbelleğe alır. Bu yüzden ekranda bir şey çizmeyi bitirdiğimizde her zaman display() fonksiyonunu çağırmayı unutmamalıyız.

display.write(…); // hafızada güncellemeye devam ediyor

display.drawLine(…); // hafızada güncellemeye devam eder. display.display(); // ekran donanımındaki tüm değişiklikleri temizler

Bu adımda kodunuzu yüklemeye çalışırsanız, Adafruit Industries logosunun görüntüleneceğini fark edeceksiniz. Bunu çizmesini kimin istediğini merak edebilirsiniz! Aslında Adafruit kütüphanesinin yaptığı da budur. Modülün belleğini (ekran donanımının bellekteki temsili) bu şirketin logosuyla başlatır. Başlatma sırasında bunu görmek istemiyorsanız, kurulum işlevinizde display.display() işlevini çağırmadan hemen önce display.clearDisplay() işlevini çağırmayı deneyebilirsiniz. Bu fonksiyon adından da anlaşılacağı gibi ekranı tamamen siler.

#Dahil etmek

Adafruit_SSD1306 ekranı(4); geçersiz kurulum() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); } boşluk döngüsü() { }

Adafruit_SSD1306 kitaplığının belgelerine dayanarak, ekranda çizim yapmak veya üzerindeki pikselleri doğrudan değiştirmek için bu sınıf tarafından sağlanan farklı işlevleri kullanabilirsiniz. Sonraki bölümlerde, nasıl çalıştığı hakkında fikir sahibi olmanız için her biri için birer örnek sunmaya çalışacağız. Bu örneklerin çoğu sadece basit bir statik içerik gösterecektir, bu yüzden onları setup() fonksiyonumuzun içine koyabiliriz (başlatma kodundan sonra). Bunu yaparak yalnızca bir kez çalıştırılır ve orada kalır.

8. Adım: Basit Bir Metin Görüntüleyin

Basit Bir Metin Görüntüle
Basit Bir Metin Görüntüle
Basit Bir Metin Görüntüle
Basit Bir Metin Görüntüle
Basit Bir Metin Görüntüle
Basit Bir Metin Görüntüle

Bir metni görüntülemek için kütüphanenin basit display.println() fonksiyonunu kullanabiliriz. Metni bir dize olarak kabul eder ve görüntülemeye çalışır. Metni ekranda nerede sunacağımızı kütüphaneye söylememiz gerektiğini bilmek önemlidir. Ekrandaki her pikselin X ve Y ile belirtilen bir koordinatı vardır. X soldan sağa doğru artar ve Y yukarıdan aşağıya doğru artar. Ekranın sol üst köşesi (X=0, Y=0) ve sağ alt köşesi (X=127, Y=63) şeklindedir. Köşelerin koordinatlarını ilk resimde not ettim. Metni ekranda nerede görüntüleyeceğimizi belirtmek için display.setCursor() işlevini kullanabiliriz.

Metnin bir diğer özelliği de rengidir. Rengi aşağıdaki örnekte gösterildiği gibi display.setTextColor() kullanarak belirtebiliriz.

display.clearDisplay();

display.setTextColor(BEYAZ); display.setCursor(35, 30); display.println("Merhaba Dünya!"); display.display();

Tek bir karakteri görüntülemek için display.write() işlevini de kullanabiliriz. Bir karakter kodunu uint8_t türü olarak kabul eder ve bu koda karşılık gelen karakteri dizede görüntüler. Örnek olarak, bu işlevi kullanarak aynı dizeyi görüntülemek istiyorsak aşağıdaki parçacığı kullanabiliriz:

display.clearDisplay();

display.setTextColor(BEYAZ); display.setCursor(35, 30); display.write(72); display.write(101); display.write(108); display.write(108); display.write(111); display.write(32); display.write(87); display.write(111); display.write(114); display.write(108); display.write(100); display.write(33); display.display();

Beyaz bir arka plana sahip siyah renkli metinler çizmek de mümkündür. Bunun için display.setTextColor fonksiyonunu aşağıdaki gibi çağırmanız gerekir:

display.clearDisplay();

// Beyaz bir arka plan ile rengi siyah olarak ayarlar display.setTextColor(BLACK, WHITE); display.setCursor(25, 30); display.println("Ters çevrilmiş metin!"); display.display();

Ayrıca display.setTextSize() işlevini kullanarak metnin boyutunu ayarlama seçeneğiniz de vardır. Boyut olarak bir tamsayı kabul eder. Sayı ne kadar büyük olursa, metin o kadar büyük olur. En küçük boyut, metinlerin varsayılan boyutu olan 1'dir. Aşağıdaki kod "A" harfini 6 farklı boyutta yazmaya çalışır:

display.clearDisplay();

display.setTextColor(BEYAZ); display.setCursor(0, 0); display.setTextSize(1); display.print("A"); display.setTextSize(2); display.print("A"); display.setTextSize(3); display.print("A"); display.setTextSize(4); display.print("A"); display.setTextSize(5); display.print("A"); display.setTextSize(6); display.print("A"); display.display();

Adım 9: Temel Şekilleri Çizme

Temel Şekiller Çizimi
Temel Şekiller Çizimi
Temel Şekiller Çizimi
Temel Şekiller Çizimi
Temel Şekiller Çizimi
Temel Şekiller Çizimi

Dikdörtgen, daire, üçgen, çizgi veya nokta gibi temel şekilleri çizmek çok kolaydır ve her biri için özel bir işlev vardır.

Çizgi çizme

Bir çizgi çizmek için display.drawLine(startX, startY, endX, endY, color) öğesini çağırabilirsiniz. Örneğin, aşağıdaki kod, ekranda büyük bir X oluşturacak şekilde çapraz çizgiler çizer:

display.clearDisplay();

display.drawLine(0, 0, display.width() - 1, display.height() - 1, BEYAZ); display.drawLine(display.width() - 1, 0, 0, display.height() - 1, BEYAZ); display.display();

display.width() ve display.height() fonksiyonlarını kullanarak ekranın genişliğine ve yüksekliğine erişebilirsiniz. Bunu yaparak kodunuz ekran boyutundan bağımsız olacaktır.

Dikdörtgen çizimi

Dikdörtgen çizme işlevi display.drawRect(upperLeftX, üstLeftY, genişlik, yükseklik, renk) işlevidir. İşte bazı rastgele yerlere üç dikdörtgen çizen kod:

display.clearDisplay();

display.drawRect(100, 10, 20, 20, BEYAZ); display.fillRect(10, 10, 45, 15, BEYAZ); display.drawRoundRect(60, 20, 35, 35, 8, BEYAZ); display.display();

display.fillRect(upperLeftX, üstLeftY, genişlik, yükseklik, BEYAZ) öğesini çağırarak, belirtilen renkle doldurulmuş bir dikdörtgen çizebilirsiniz. Ayrıca bu örnekteki üçüncü fonksiyon display.drawRoundRect(upperLeftX, üstLeftY, width, height, cornerRadius, color) işlevidir ve resimde gördüğünüz gibi köşeleri yuvarlak olan bir dikdörtgen çizmek için kullanılır. Renkten önce, köşe yarıçapını gösteren bir tam sayı olan fazladan bir parametre kabul eder. Değer ne kadar büyük olursa, köşe o kadar yuvarlak olur. Ayrıca ne yaptığını tahmin edebileceğinizi düşündüğüm display.drawFillRoundRect adında karşılık gelen bir doldurma işlevi var.

daire çizmek

İşlev, display.drawCircle(centerX, centerY, yarıçap, renk) işlevidir. İşte gülen yüz benzeri bir şekil çizen bir örnek:

display.drawCircle(60, 30, 30, BEYAZ);

display.fillCircle(50, 20, 5, BEYAZ); display.fillCircle(70, 20, 5, BEYAZ);

Dikdörtgenler gibi, verilen renkle dolu bir daire çizmek için display.fillCircle işlevini kullanabilirsiniz.

Çizim üçgeni

Ahh, yine display.drawTriangle(poin1X, point1Y, point2X, point2Y, point3X, point3Y, color) adında bir fonksiyon ve içi dolu bir üçgen çizen ilgili display.fillTriangle.

display.drawTriangle(24, 1, 3, 55, 45, 55, BEYAZ);

display.fillTriangle(104, 62, 125, 9, 83, 9, BEYAZ);

bir nokta çiz

Ayrıca display.drawPixel(pixelX, pixelY, color) fonksiyonu ile ekrandaki belirli bir noktayı (piksel olarak adlandırılır) renklendirebilirsiniz.

display.drawPixel(20, 35, BEYAZ);

display.drawPixel(45, 12, BEYAZ); display.drawPixel(120, 59, BEYAZ); display.drawPixel(97, 20, BEYAZ); display.drawPixel(35, 36, BEYAZ); display.drawPixel(72, 19, BEYAZ); display.drawPixel(90, 7, BEYAZ); display.drawPixel(11, 29, BEYAZ); display.drawPixel(57, 42, BEYAZ); display.drawPixel(69, 34, BEYAZ); display.drawPixel(108, 12, BEYAZ);

Adım 10: Resim Çizimi

Resim Çizimi
Resim Çizimi
Resim Çizimi
Resim Çizimi

Bir resim çizmek farklı ve biraz karmaşıktır. Görüntüleme modülü tek renkli olduğundan, önce resmimizi tek renkli bitmap (siyah beyaz olarak da adlandırılır) adı verilen bir biçime dönüştürmemiz gerekir. Böyle bir formatta, görüntünün her pikseli 0 veya 1 ile sunulur. 1'ler rengin varlığını temsil eder ve 0'lar boş bir alan anlamına gelir. Bu bölümün üstünde bu formatta Arduino logosunun bir örneğini görebilirsiniz. Bir bitmap görüntüsü çizme işlevi, display.drawBitmap(topLeftX, topLeftY, imageData, width, height, color) işlevidir. imageData parametresi, bayt cinsinden bir sayı dizisidir. Her baytın 8 biti vardır, bu nedenle her bayt görüntünün 8 pikselinin verilerini içerir. Resmin genişliğini ve yüksekliğini belirterek, drawBitmap işlevi, sonraki piksel sırasının hangi bitten başladığını bilecektir.

Resmimi bu biçime dönüştürmek için seçtiğim çözüm, resmimi bir dizi ASCII karakterine dönüştürmek için önce çevrimiçi "görüntüden ASCII'ye dönüştürücülerden" birini (örn. https://my.asciiart.club) kullanmak ve ardından değiştirmekti. boşluk için 0 ve diğerleri 1 ile kullanılan karakterler. Aşağıda gördüğünüz budur. Her 0 ve 1'i ekranda bir piksel olarak düşünebilirsiniz. Bu yüzden resmin boyutu 128x64 olan ekran boyutumuzu geçmemelidir.

Not: Bu ASCII tekniğinin kullanılması önerilen bir yaklaşım değildir çünkü karakterlerin en boy oranı nedeniyle görüntünüz deforme olacaktır (karakterler kare değildir). Bu tekniği, görüntüyü gerekli biçime dönüştürmeyi kolaylaştırdığı için denedim. Aksi takdirde, bu metnin tamamen dışında kalan bazı programlama veya bazı yardımcı uygulamaları kullanarak en iyi sonucu elde etmek mümkün olacaktır.

00000000000000000000011111111111111111111110000000000000000000000000000000000000011111111111111111111111111111100000000000000000 0000000000000111111111111111111111111111111111111110000000000000 0000000000011111111111111111111111111111111111111111100000000000 0000000001111111111111111111111111111111111111111111111000000000 0000000111111111111111111111111111111111111111111111111110000000 0000011111111111111111111111111111111111111111111111111111100000 0000111111111111111111111111111111111111111111111111111111110000 0001111111111111111111111111111111111111111111111111111111111000 0011111111111111111111111111111111111111111111111111111111111100 0111111111111111000000011111111111111111100000001111111111111110 0111111111110000000000000001111111111000000000000000111111111110 1111111111000000001111000000001111000000001111000000001111111111 1111111110000011111111111100000110000011111111111100000111111111 1111111100000111111111111111000000001111111001111110000011111111 1111111100001111100000011111100000011111100000011111000011111111 1111111100001111100000011111100000011111100000011111000011111111 1111111100000111111111111111000000001111111001111110000011111111 1111111110000011111111111100000110000011111111111100000111111111 1111111111000000001111000000001111000000001111100000001111111111 0111111111110000000000000000111111110000000000000000111111111110 0111111111111111000000001111111111111111000000001111111111111110 0011111111111111111111111111111111111111111111111111111111111100 0001111111111111111111111111111111111111111111111111111111111000 0000111111111111111111111111111111111111111111111111111111110000 0000011111111111111111111111111111111111111111111111111111100000 0000000111111111111111111111111111111111111111111111111110000000 0000000011111111111111111111111111111111111111111111111100000000 0000000000011111111111111111111111111111111111111111100000000000 0000000000000111111111111111111111111111111111111110000000000000 0000000000000000111111111111111111111111111111110000000000000000 0000000000000000000001111111111111111111111000000000000000000000

Şimdi her satırı bir baytı temsil eden 8'e bölmeli ve aşağıdaki gibi bir dizide saklamalıyız:

static const unsigned char PROGMEM arduino_logo ={

B00000000, B00000000, B00000111, B11111111, B11111111, B11100000, B00000000, B00000000, B00000000, B00000000, B01111111, B11111111, B11111111, B11111110, B00000000, B00000000, … // resmin sonuna kadar devam edin };

Ardından drawBitmap işlevini çağırarak ekranda çizebiliriz.

display.drawBitmap(32, 16, arduino_logo, 64, 32, BEYAZ);

11. Adım: Sorun Giderme

Bu uzun bir eğitimdi ve bu nedenle bir şeylerin yanlış gitmesi çok muhtemel. İşte projeniz için OLED ekran modülünü kurarken karşılaşabileceğiniz bazı yaygın hataların listesi (bazıları bu eğitimi hazırlarken benim için oldu).

Hiçbir şey görüntülenmiyor

Bu birçok nedenden dolayı olabilir, bu yüzden projenizde oluşabilecek sırayla aşağıdaki listeyi kontrol etmenizi öneririm:

I2C adresi muhtemelen yanlış

Görüntüleme nesnenizi ayarlarken display.begin() işlevinde i2c-tarayıcı kodunda aldığınız adresi ayarladığınızdan emin olun.

SCL ve SDA yanlış bir şekilde bağlanmış

Bu aslında benim için oldu. Arduino Uno kullanıyorsanız, bağlantılarınızı benimkiyle aynı şekilde bağlı olduklarından emin olmak için tekrar kontrol etmeniz gerekir. Başka bir Arduino sürümü kullanıyorsanız (örneğin Mega, Leonardo, vb.), I2C'lerini başka pinlere ayarlamış olabileceklerini bilmelisiniz. Wire kütüphanesinin belgelerinde kontrol edebilirsiniz.

Görünür alandan bir şey çiziyorsunuz

Bu bir yazılım sorunudur. Bazı koordinatları yanlış hesaplamak için bir çizim işlevi kullanırken çok yaygındır ve bu nedenle çiziminiz deforme olur veya en kötü senaryoda tamamen sahne dışında olabilir. Hesaplamalarınızı gözden geçirin ve neler olduğunu görmek için adım adım çizim yapmaya çalışın.

Metin hiç görüntülenmiyor

Metnin rengini ayarlamayı unuttunuz veya yanlış bir değere ayarladınız

Metinleri çizmeden önce setTextColor'ı çağırmanız gerekir. Aksi takdirde hata almazsınız, ancak ekranda hiçbir şey görmezsiniz. Ayrıca metin rengini arka plan rengiyle aynı şekilde ayarlamış olabilirsiniz.

Çok büyük bir yazı tipi kullanıyorsunuz

Metin boyutunu çok büyük bir değere ayarlarsanız, karakterlerin görünür alandan tamamen çıkması mümkün olabilir.

Görüntü boyutu hakkında bir derleme hatası var

Bu benim için de oldu ve sanırım çoğunuz için de olurdu. Bunun nedeni, betiğimizin üstüne eklediğimiz Adafruit_SSD1306.h başlık dosyasında tanımlanan görüntüleme boyutu sabit değerleridir. Bu dosya {proje-klasörünüz}\libraries\Adafruit_SSD1306\Adafruit_SSD1306.h konumunda bulunur. Bu dosyayı açarsanız, yalnızca OLED ekran modülünüzün boyutunu temsil eden sabitin yorumunu kaldırmanız gerektiğini açıklayan aşağıdaki gibi bir yorum bölümü olduğunu fark edeceksiniz. 128x64 ekran modülleri için #define SSD1306_128_64 satırı yorumsuz olmalıdır.

/*=====================================================================

SSD1306 Ekranlar ------------------------------------------------ ---------------------- Sürücü birden çok ekranda kullanılıyor (128x64, 128x32, vb.). Uygun boyutta bir çerçeve arabelleği vb. oluşturmak için aşağıdan uygun ekranı seçin. SSD1306_128_64 128x64 piksel ekran SSD1306_128_32 128x32 piksel ekran SSD1306_96_16 --------------------------- --------------------------------------------*/ #define SSD1306_128_64 / / #define SSD1306_128_32 // #define SSD1306_96_16 /*======================================= ===============================*/

Adım 12: Sonra Ne Yapmalı?

Bir çıkış modülü olarak OLED ekran, hobi projelerinize profesyonel görünümlü bir arayüz sağlamak için size harika bir fırsat verebilir. Üzerinde anlamlı bir veri görüntülemek için bir başlangıç noktası olarak aşağıdaki fikirleri deneyebilir veya kullanıcının neler olup bittiğini veya bir şey yapması gerekip gerekmediğini bilmesine yardımcı olabilirsiniz. Bir kullanıcının bir projenin/cihazın durumunu bazı LED'ler aracılığıyla yorumlamaktansa ekranda bir mesajı okuması çok daha net olacaktır.

Başlangıç noktası olarak yapabilecekleriniz şunlar olabilir:

  • Bir sıcaklık sensörü değeri okuyun ve OLED modülünde görüntüleyin. Buna basınç veya nem sensörü ekleyebilir ve tamamen işlevsel bir meteoroloji istasyonu projesi oluşturabilirsiniz.
  • Giriş aygıtı olarak bir joystick modülünü kullanarak ekran modülüne bir şeyler çizmeyi deneyin.
  • Bir dizi çizim/geciktirme işlev çağrısı veya Arduino kesmesi ile ekranda bir animasyon çizmeye çalışın
  • Sistem başlangıcında özel logonuzu görüntüleyin (Adafruit Logosu yerine)

OLED ekran modülünü kullanarak ne yapardınız (veya zaten yaptınız) yorumlarda bana söylemeyi unutmayın.

Önerilen: