Arduino'da 1602 grafik ekranla çalışma. Winstar'dan LCD WH1602B. I2C veri yolu üzerinden LCD ekran kontrolü

Varmıştı Arduino Nano'su, bir devre tahtası ve bir LCD ekran içeren bir kit geldi. Karttaki ekranda - 1602A, altında - QAPASS yazıyor. İlk cihazı şekillendirmeye başladım ve elbette LED'lerin yanıp sönmesini değil, ekranda bilgilerin görüntülenmesini istedim.

Google yardımcı oldu ve bana bunun bir karakter gösterimi olduğunu söyledi; Eğer onu bozmazsanız, büyük olasılıkla ASCII karakterleri mevcuttur - sayılar, Latince, bazı temel karakterler.

Aşağıdaki materyaller ekranın başlatılmasına yardımcı oldu: Bir PC yazıcı bağlantı noktasından karakter tipi bir LCD'nin çalıştırılması; Arduino'yu karakter LCD'sine nasıl bağlarım; Pwm Servo Sürücü Motor Kontrolü PDF.

Ekran oldukça yaygındır ve bunun için kalkanlar zaten icat edilmiştir - SPI ve/veya I2C gibi seçenekler vardır ve İnternet bu durumlar için tariflerle doludur. Ancak elimde yalnızca orijinal 16x2 ekran ve onu eklemek istediğim Arduino vardı.

Ekranın her biri 4 bitlik yarım baytlık veri iletimi ve çalışma modu vardır, veriyolunun düşük dereceli bitleri kullanılmaz. Veri yolunun yalnızca yarısının bağlanması birçok yerde anlatılıyor ve ekranı nasıl bağlayacağımı ve 8 hat üzerinden onunla nasıl çalışacağımı anlamadım. Çalışma şeklinden oldukça memnunum.

Gösterimlerin iyi açıklaması bu türden Burada buldum - http://greathard.ucoz.com/44780_rus.pdf. Ve burada (http://arduino.ru/forum/programmirovanie/lcd-i2c-partizanit#comment-40748) bir karakter oluşturucuyu belirtmenin bir örneğidir.

Bağlantı

Ekranım lehimlenmemiş kontaklarla geldi. Baştan beri kabloyu lehimleyip dupontlarla 16 adet kabloyu kesip temizlemek istiyordum. Sonra balinayı kazdım ve tahtaya lehimlemek için bir DuPont tarağı buldum. Oradan 16 kontağı koparıp lehimledim.
Ekranım şuna benziyordu (kontakları lehimlemeden önce):

Öncelikle pin 15 (A)'yı +5V'a, 16 (K)'yı ise toprağa bağladım ve arka ışığın çalıştığından emin oldum. Genel olarak katodu 220 Ohm'luk bir dirençle toprağa bağlamak doğrudur, ben de öyle yaptım.

Daha sonra toprağı (1) ve gücü (2) bağladım. Arduino, USB'den, stabilize edilmiş 5V voltajdan ve dengesiz 6-12V voltajdan beslenebilir, en yüksek voltaj otomatik olarak seçilir. Artık Arduino USB'den güç alıyor ve 5 Volt'u nereden alacağımı merak ediyordum. Harici stabilize 5V'un bağlandığı Arduino pininde 5V olduğu ortaya çıktı. Daha doğrusu 4.7V çıktı ama bu benim için yeterliydi.

Gücü bağladıktan sonra, her şey yolundaysa, üst sıra tanıdık düz dikdörtgenlerle aydınlanır.

Daha sonra kontrast potansiyometresini (pin 3 V0) bağlarız. Potansiyometrenin uç terminallerinden birini yere, ikincisini +5V'a, ortadakini ise ekranın 3 numaralı pinine atıyoruz. 10K potansiyometre tavsiye edilir. Balinadan 50 binim vardı, ilk ben kullandım. Ayarlama tek kenardaydı, istenilen kontrastın çok ince bir şekilde yakalanması gerekiyordu. Daha sonra benzerini 5K'da başka bir balinada buldum ve kurdum. Ayar bir kenardan yarım dönüşe kadar uzanıyordu. Görünüşe göre daha da küçük bir potansiyometre alabilirsiniz. Devrenin daha az tüketmesi için muhtemelen 10K önerilir. Evet biraz lehimlemem gerekiyordu, potansiyometrelerin terminallerine dupontlu kabloları lehimledim.

Test taslağı

Test taslağını Arduino Studio'daki örneklerden alıyoruz - "C:\Program Files (x86)\Arduino\libraries\LiquidCrystal\ex amples\HelloWorld\HelloWorld.ino", sadece kişileri bizimkiyle değiştirmeniz gerekiyor - LiquidCrystal lcd( 7, 6, 5, 4, 3, 2);

Prensip olarak bu taslak aynı zamanda neyin nereye bağlanacağına dair bir açıklama da içerir. Orada belirtildiği gibi bağlayabilirsiniz, o zaman hiçbir şeyi değiştirmenize gerek yoktur.

// kütüphane kodunu ekleyin: #include // kitaplığı arayüz pinlerinin numaraları ile başlat LiquidCrystal lcd(7, 6, 5, 4, 3, 2); void setup() ( // LCD'nin sütun ve satır sayısını ayarlayın: lcd.begin(16, 2); // LCD'ye bir mesaj yazdırın. lcd.print("merhaba, dünya!"); ) void loop() ( // imleci 0. sütun, 1. satıra ayarlayın // (not: sayma 0 ile başladığı için 1. satır ikinci satırdır): lcd.setCursor(0, 1); // sayısını yazdır sıfırlamadan bu yana geçen saniye: lcd.print(millis() / 1000); )

Bunun gibi bir şey ortaya çıkıyor:

Bu arada elime geçen ekran arka aydınlatma olmadan çalışmıyor. Yani işe yarıyor ama pek bir şey göremiyorsun.

1602A Ekran Kontakları

# temas etmek İsim Nasıl bağlanılır
1 VSS GND
2 VDD +5V
3 V0 Kontrast - potansiyometrenin orta terminaline
4 RS (Kayıt seçimi) D7Arduino
5 R/W (Okuma veya yazma) GND
6 E (Sinyali etkinleştir) D6Arduino
7-14 D0-D7 D0-D3 - bağlı değil; D4-D7 - Arduino'nun D5-D2 pinlerine bağlı
15 A Arka ışık anotu, +5V'a bağlı
16 k 220 Ohm'luk bir dirençle toprağa bağlanan arka ışık katodu

Makale, bir LCD'nin Arduino'ya nasıl düzgün şekilde bağlanacağından bahsediyor, LCD 1602 ve LCD i2c'yi bağlamak hakkında bilmeniz gereken her şey ele alınıyor.

HD44780 denetleyici temelinde oluşturulan 1602 boyutlu LCD ekranlar, bugün hala her türlü elektronik cihazın geliştirilmesi için en uygun fiyatlı, basit ve talep gören ekranlardan biri olmaya devam ediyor.

Hem kelimenin tam anlamıyla diz üzerine monte edilmiş basit ünitelerde hem de kahve makineleri gibi daha ciddi endüstriyel ünitelerde görülmeleri şaşırtıcı değildir. Arduino ile ilgili en popüler modüller ve ekranlar, örneğin LCD I2C modülü ve LCD Tuş Takımı Kalkanı bu ekranla birleştirilir.

Aşağıdaki adımlarda LCD'yi Arduino'ya nasıl bağlayacağınızı ve gerekli bilgilerin ekranda nasıl görüntüleneceğini görsellerle detaylı olarak anlatacağız.

Adım 2. Arduino için LCD 1602

1602 ekranları iki farklı tasarıma sahiptir:

  • siyah harflerle sarı arka ışık
  • veya (bu çok daha sık olur) beyaz olanlarla mavi arka ışık.

HD44780 denetleyicideki ekranların boyutu büyük ölçüde farklılık gösterir ancak aynı şekilde kontrol edilirler. En yaygın boyutlar 16 x 02 (yani iki satırda 16 karakter) veya 20 x 04'tür. Karakterlerin çözünürlüğü 5 x 8 pikseldir.

Çoğu ekran Kiril alfabesini desteklemez (CTK işaretli ekranlar hariç). Ancak bu sorun kısmen çözülebilir ve makalede bunun nasıl yapılacağı ayrıntılı olarak açıklanmaktadır.

Ekranda bağlantı için 16 PIN'li bir konektör bulunur. Pimler kartın arkasında işaretlenmiştir, aşağıdaki gibidir:

  • 1 (VSS) – denetleyici için negatif güç kaynağı.
  • 2 (VDD) – denetleyici için pozitif güç kaynağı.
  • 3 (VO) – kontrast kontrolü ayarları.
  • 4 (RS) – kayıt seçimi.
  • 5 (R/W) – okuma ve yazma, özellikle toprağa bağlandığında yazma.
  • 6 (E) – etkinleştirme (etkinleştirme).
  • 7–10 (DB0-DB3) – sekiz bitlik arayüzden düşük dereceli bitler.
  • 11–14 (DB4-DB7) – arayüzdeki en önemli bitler
  • 15 (A) – arka ışık güç kaynağı için pozitif anot.
  • 16 (K) – arka ışık güç kaynağı için negatif katot.

3. Adım. LCD ekranı bağlayın

Ekranı bağlamadan ve ona bilgi aktarmadan önce işlevselliğini kontrol etmeye değer. Öncelikle VSS ve VDD denetleyicisine voltaj uygulayın, arka ışığı açın (A, K), ardından kontrastı ayarlayın.

Bu tür ayarlar için 10 kOhm'luk bir potansiyometre uygundur, şekli önemli değildir. Dış bacaklara +5V ve GND beslenir, ortadaki bacak ise VO pinine bağlanır.

Devreye güç verildiğinde gerekli kontrastı elde etmeniz gerekir, yanlış ayarlanırsa ekrandaki görüntü görünmeyecektir. Kontrastı ayarlamak için potansiyometreyle "oynamanız" gerekir. Devre doğru şekilde kurulduğunda ve kontrast doğru ayarlandığında ekranın üst satırı dikdörtgenlerle doldurulmalıdır.

Ekranın çalışması için Arduino IDE ortamında yerleşik özel bir kütüphane olan LiquidCrystal.h'yi aşağıda yazacağım. 8 bit ve 4 bit modunda çalışabilir. İlk seçenekte yalnızca en az anlamlı ve en anlamlı bitler kullanılır ( BB0-DB7), ikincisinde – yalnızca daha genç olanlar ( BB4-DB7).

Ancak bu ekranda 8 bit modunu kullanmak yanlış bir karar; yenileme hızı her zaman saniyede 10 kerenin altında olduğundan hız avantajı neredeyse yok. Metni görüntülemek için DB7, DB6, DB5, DB4, E ve RS pinlerini denetleyici pinlerine bağlamanız gerekir. Herhangi bir Arduino pinine bağlanabilirler, asıl önemli olan koddaki doğru sırayı ayarlamaktır.

Gerekli sembol henüz kontrol cihazının hafızasında değilse, bunu manüel olarak tanımlayabilirsiniz (toplamda yedi sembole kadar). Söz konusu ekranlardaki hücrenin beşe sekiz piksellik bir uzantısı vardır. Bir sembol oluşturmanın görevi, bir bit maskesi yazmak ve noktaların yanması gereken yerlere birleri, yanmaması gereken yerlere ise sıfırları yerleştirmektir. Arduino'da en az altı dijital çıkış kullanıldığından yukarıda tartışılan bağlantı şeması her zaman iyi değildir.

Adım 4. Baypas şeması

Bu sorunu aşmak ve yalnızca iki taneyle yetinmek için bir seçenek keşfedelim. LCD'den IIC/I2C'ye ek bir dönüştürücü modüle ihtiyacımız var. Ekrana nasıl lehimlendiği ve Arduino'ya nasıl bağlandığı aşağıdaki resimlerde görülebilir.

Ancak bu bağlantı seçeneği yalnızca LiquidCrystal_I2C1602V1 adlı özel bir kitaplıkla çalışır, ancak bunu internette bulmak ve yüklemek kolaydır, ardından sorunsuzca kullanabilirsiniz.

Adım 4: LiquidCrystal.h Kütüphanesi

LiquidCrystal.h kütüphanesi, bu sayfadaki web sitemizin Kütüphaneler bölümünden veya arduino.cc resmi kaynağından indirilebilir. Ancak aşağıdaki bağlantılardan da indirebilirsiniz:

Adım 5. Taslak (program kodu)

Arşivi indirdikten sonra Arduino kurulum dizininizin kütüphaneler klasöründeki LiquidCrystal klasörünü değiştirin.

Örnek taslağı şu adreste görebilirsiniz:

Dosya -> Örnekler -> LiquidCrystal -> HelloWorld_SPI

Veya İngilizce bir menünüz varsa:

Dosya -> Örnekler -> LiquidCrystal -> HelloWorld_SPI

Bu bir sonraki dersimizi tamamlıyor. Size kaliteli projeler diliyoruz!

LCD ekran– Arduino projelerinin sık sık misafiri. Ancak karmaşık devrelerde çok sayıda pini olan bir shield bağlama ihtiyacından dolayı Arduino portlarının eksikliği sorunu yaşayabiliriz. Bu durumda çözüm şu olabilir I2C/IIC Neredeyse standart bir Arduino 1602 kalkanını yalnızca 4 pin kullanarak Uno, Nano veya Mega kartlara bağlayan bir adaptör. Bu yazımızda bir LCD ekranı I2C arayüzüne nasıl bağlayabileceğinize, hangi kütüphaneleri kullanabileceğinize, kısa bir örnek taslak yazacağınıza ve sık karşılaşılan hatalara bakacağız.

Sıvı kristal ekran LCD 1602 dır-dir iyi seçimçeşitli projelerde karakter dizelerinin çıktısını almak için. Ucuzdur, farklı arka ışık renklerine sahip çeşitli modifikasyonlar vardır, Arduino eskizleri için hazır kütüphaneleri kolayca indirebilirsiniz. Ancak bu ekranın en büyük dezavantajı ekranın 16 dijital pine sahip olması ve en az 6 tanesinin gerekli olmasıdır.Dolayısıyla bu LCD ekranın i2c olmadan kullanılması Arduino Uno veya Nano kartlar için ciddi kısıtlamalar getirir. Yeterli kişi yoksa, bir Arduino Mega kartı satın almanız veya ekranı i2c aracılığıyla bağlamak da dahil olmak üzere kişileri kaydetmeniz gerekecektir.

LCD 1602 pinlerinin kısa açıklaması

LCD1602 pinlerine daha yakından bakalım:

Pimlerin her birinin kendi amacı vardır:

  1. Toprak GND'si;
  2. Güç kaynağı 5 V;
  3. Monitör kontrastını ayarlama;
  4. Komut, veri;
  5. Veri yazma ve okuma;
  6. Olanak vermek;

7-14. Veri hatları;

  1. Ayrıca arka ışık;
  2. Eksi arka ışık.

Ekran Özellikleri:

  • Karakter görüntüleme tipi, sembolleri yüklemek mümkündür;
  • LED ışıklar;
  • Denetleyici HD44780;
  • Besleme gerilimi 5V;
  • 16x2 karakter biçimlendirin;
  • Çalışma sıcaklığı aralığı -20C ila +70C, depolama sıcaklığı aralığı -30C ila +80C;
  • Görüş açısı 180 derece.

LCD'nin i2C olmadan Arduino kartına bağlantı şeması

Bir monitörü I2C olmadan doğrudan bir Arduino mikro denetleyicisine bağlamak için standart şema aşağıdaki gibidir.

Çok sayıda bağlı kontak nedeniyle gerekli elemanları bağlamak için yeterli alan olmayabilir. I2C'nin kullanılması kablo sayısını 4'e ve dolu pinleri 2'ye azaltır.

Arduino için LCD ekranlar ve kalkanlar nereden satın alınır?

LCD ekran 1602 (ve sürüm 2004) oldukça popülerdir, bu nedenle hem yerli çevrimiçi mağazalarda hem de yabancı sitelerde kolayca bulabilirsiniz. En uygun seçeneklere bazı bağlantılar şunlardır:

LCD1602+I2C Mavi Ekran Modülü, Arduino Uyumlu Basit bir LCD1602 ekran (yeşil arka ışık) 80 rubleden daha ucuz Arduino için I2C HD44780'li geniş LCD2004 ekran (mavi ve yeşil arka ışık)
IIC adaptörlü ve mavi arka ışıklı 1602 ekran Lehimli I2C modüllü LCD1602'nin başka bir versiyonu 1602 shield için Port IIC/I2C/TWI/SPI adaptör modülü, Arduino ile uyumlu
RGB arkadan aydınlatmalı ekran! LCD 16×2 + tuş takımı +Arduino için Buzzer Shield Arduino için düğmeler ve ekran ile kalkan LCD1602 LCD 1602 3D yazıcı için LCD ekran (RAMPS 1.4 için Smart Controller, Text LCD 20×4), SD ve MicroSD kart okuyucu modülü

I2C protokolünün açıklaması

Ekranın Arduino'ya i2c adaptörü aracılığıyla bağlanmasını tartışmadan önce kısaca i2C protokolünün kendisinden bahsedelim.

I2C/IIC(Entegre Devreler Arası) başlangıçta iletişim için oluşturulmuş bir protokoldür Entegre devreler içeri elektronik cihaz. Geliştirme Philips'e aittir. i2c protokolü, kontrol elektroniklerindeki blokları iletişim kurmak için gerekli olan 8 bitlik bir veri yolunun ve aynı kablolar üzerinden birden fazla cihazla iletişim kurabileceğiniz bir adresleme sisteminin kullanımına dayanmaktadır. İstenilen öğenin tanımlayıcısını veri paketlerine ekleyerek verileri bir veya başka bir cihaza aktarıyoruz.

En çok basit devre I2C, bir ana cihaz (çoğunlukla bir Arduino mikrodenetleyicisi) ve birkaç yardımcı cihaz (örneğin bir LCD ekran) içerebilir. Her cihazın 7 ila 127 aralığında bir adresi vardır. Aynı devrede aynı adrese sahip iki cihaz olmamalıdır.

Arduino kartı donanım olarak i2c'yi destekler. Bu protokolü kullanarak cihazları bağlamak için A4 ve A5 pinlerini kullanabilirsiniz.

I2C işleminin çeşitli avantajları vardır:

  • İşlem yalnızca 2 hat gerektirir - SDA (veri hattı) ve SCL (senkronizasyon hattı).
  • Çok sayıda önde gelen cihazın bağlanması.
  • Azaltılmış geliştirme süresi.
  • Tüm cihaz setini kontrol etmek için yalnızca bir mikro denetleyici gereklidir.
  • Bir veriyoluna bağlı olası mikro devre sayısı yalnızca maksimum kapasiteyle sınırlıdır.
  • Devrelere yerleştirilmiş özel bir aşırı gerilim önleme filtresi sayesinde yüksek derecede veri güvenliği.
  • Ortaya çıkan arızaları teşhis etmek ve arızaları hızlı bir şekilde ayıklamak için basit bir prosedür.
  • Veri yolu zaten Arduino'nun kendisine entegre edilmiştir, dolayısıyla ek bir veri yolu arayüzü geliştirmeye gerek yoktur.

Kusurlar:

  • Hatta 400 pF'lik bir kapasitif sınır vardır.
  • Veri yolu üzerinde birkaç farklı cihaz varsa, bir I2C kontrol cihazını programlamak zordur.
  • Çok sayıda cihaz varken, bunlardan birinin yanlışlıkla düşük seviyeye düşmesi durumunda arızayı izole etmek zorlaşır.

LCD 1602 Arduino için i2c modülü

Arduino'da i2c ekranı kullanmanın en hızlı ve rahat yolu, yerleşik protokol desteğine sahip hazır bir ekran satın almaktır. Ancak bu ekranlardan çok fazla bulunmuyor ve ucuz da değiller. Ancak çok sayıda farklı standart ekran zaten üretildi. Bu nedenle, bugün en uygun fiyatlı ve popüler seçenek, ayrı bir I2C modülü (buna benzeyen bir adaptör) satın almak ve kullanmaktır:

Modülün bir tarafında i2c pinlerini görüyoruz - toprak, güç ve veri aktarımı için 2. Diğer adaptörde harici güç konektörlerini görüyoruz. Ve elbette, kartın, modülün standart ekran pinlerine lehimlendiği birçok pini var.


i2c çıkışları Arduino kartına bağlanmak için kullanılır. Gerekirse arka aydınlatma için harici güç bağlarız. Dahili düzeltici ile özel kontrast değerleri J ayarlayabiliriz

Piyasada halihazırda lehimlenmiş adaptörlere sahip LCD 1602 modüllerini bulabilirsiniz, kullanımları mümkün olduğunca basitleştirilmiştir. Ayrı bir adaptör satın aldıysanız, önce onu modüle lehimlemeniz gerekecektir.

LCD ekranı I2C aracılığıyla Arduino'ya bağlama

Bağlanmak için Arduino kartının kendisine, bir ekrana, bir devre tahtasına, bağlantı kablolarına ve bir potansiyometreye ihtiyacınız vardır.

Özel ayrı bir i2c adaptörü kullanıyorsanız öncelikle bunu ekran modülüne lehimlemeniz gerekir. Orada hata yapmak zor, bu şemayı takip edebilirsiniz.


i2c destekli bir LCD monitör, karta dört kablo kullanılarak bağlanır - iki kablo veri için, iki kablo güç için.

  • GND pini karttaki GND'ye bağlanır.
  • VCC pini 5V'tadır.
  • SCL, A5 pinine bağlanır.
  • SDA pin A'ya bağlanır.

Ve hepsi bu! Dolaşması çok kolay olan tel ağları yoktur. Aynı zamanda, i2C protokolünü uygulamanın tüm karmaşıklığını kütüphanelere emanet edebiliriz.

i2c LCD ekranla çalışmaya yönelik kitaplıklar

Arduino ve LCD 1602 ile I2C veri yolu üzerinden etkileşim kurmak için en az iki kütüphaneye ihtiyacınız olacak:

  • I2C ile çalışmaya yönelik Wire.h kütüphanesi standartta zaten mevcuttur Arduino programı IDE.
  • Monitörü I2C veri yolu aracılığıyla kontrol etmek için çok çeşitli komutlar içeren LiquidCrystal_I2C.h kitaplığı, taslağı daha basit ve daha kısa hale getirmenize olanak tanır. Ek olarak kitaplığı yüklemeniz gerekir. Ekranı bağladıktan sonra ek olarak LiquidCrystal_I2C.h kitaplığını yüklemeniz gerekir.

Gerekli tüm kütüphaneleri taslağa bağladıktan sonra bir nesne oluşturuyoruz ve onun tüm fonksiyonlarını kullanabiliyoruz. Test için aşağıdaki standart örnek çizimi yükleyelim.

#katmak #katmak // Kütüphane dahil //#include // Alternatif bir kitaplığın bağlanması LiquidCrystal_I2C lcd(0x27,16,2); // I2C adresini (en yaygın değer) ve ekran parametrelerini belirtin (LCD 1602 durumunda - her biri 16 karakterden oluşan 2 satır //LiquidCrystal_PCF8574 lcd(0x27); // PCF8574 kitaplığı geçersiz kurulumu seçeneği( ) ( lcd.init (); // Ekranın başlatılması lcd.backlight(); // Arka ışığın bağlanması lcd.setCursor(0,0); // İmleci ilk satırın başına ayarlama lcd.print(" Merhaba"); // Metni ilk satıra yazıyoruz lcd.setCursor(0,1); // İmleci ikinci satırın başına ayarlıyoruz lcd.print("ArduinoMaster"); // Metni ikinci satıra yazıyoruz ) geçersiz döngü() ( )

LiquidCrystal_I2C kütüphanesinin fonksiyonlarının ve yöntemlerinin açıklaması:

  • home() ve clear() - ilk işlev imleci ekranın başına döndürmenize olanak tanır, ikincisi de aynısını yapar, ancak aynı zamanda daha önce monitörde bulunan her şeyi siler.
  • write(ch) – ekrana tek karakterli bir ch yazdırmanızı sağlar.
  • Cursor() ve noCursor() – imleci ekranda gösterir/gizler.
  • Blink() ve noBlink() – imleç yanıp söner/yanıp sönmez (ekranı daha önce etkinleştirildiyse).
  • display() ve noDisplay() – ekranı bağlamanıza/devre dışı bırakmanıza olanak tanır.
  • ScrollDisplayLeft() ve ScrollDisplayRight() – ekranı bir karakter sola/sağa kaydırır.
  • autoscroll() ve noAutoscroll() – otomatik kaydırma modunu etkinleştirmenizi/devre dışı bırakmanızı sağlar. Bu modda, her yeni karakter aynı yere yazılır ve ekranda daha önce yazılanlar değiştirilir.
  • leftToRight() ve rightToLeft() – Görüntülenen metnin yönünü ayarlama – soldan sağa veya sağdan sola.
  • createChar(ch, bitmap) – siyah beyaz noktalar oluşturmak için bir dizi bitmap bitmap kullanarak ch (0 – 7) kodlu bir karakter oluşturur.

i2c ekranıyla çalışmak için alternatif kitaplık

Bazı durumlarda, belirtilen kitaplığın PCF8574 denetleyicilerle donatılmış cihazlarla kullanılması sırasında hatalar meydana gelebilir. Bu durumda LiquidCrystal_PCF8574.h kütüphanesi alternatif olarak önerilebilir. LiquidCrystal_I2C'yi genişletir, dolayısıyla kullanımında herhangi bir sorun yaşanmayacaktır.

i2c lcd ekranı bağlama sorunları

Çizimi yükledikten sonra ekranda herhangi bir mesaj göremezseniz aşağıdaki adımları deneyin.

Öncelikle monitörün kontrastını artırabilir veya azaltabilirsiniz. Kontrast ve arka ışık modu nedeniyle genellikle karakterler görünmez.

Bu işe yaramazsa, kontakların doğru bağlanıp bağlanmadığını ve arka ışık gücünün bağlı olup olmadığını kontrol edin. Ayrı bir i2c adaptörü kullandıysanız, kontakların lehimleme kalitesini tekrar kontrol edin.

Ekrandaki eksik metnin diğer bir yaygın nedeni yanlış i2c adresi olabilir. Öncelikle çizimdeki cihaz adresini 0x27 0x20'den 0x3F'ye değiştirmeyi deneyin. Farklı üreticilerin programlanmış farklı varsayılan adresleri olabilir. Bu işe yaramazsa, bağlı tüm cihazları tarayan ve kaba kuvvet kullanarak adreslerini belirleyen i2c tarayıcı taslağını çalıştırabilirsiniz. Bir i2c tarayıcı çizimi örneği.

Ekran hala çalışmıyorsa adaptörün lehimini çıkarmayı ve LCD'yi her zamanki gibi bağlamayı deneyin.

Çözüm

Bu yazıda, kartta serbest pinleri kaydetmemiz gerektiğinde, karmaşık Arduino projelerinde LCD ekran kullanmanın ana konularına baktık. Basit ve ucuz bir i2c adaptörü, yalnızca 2 analog pini kaplayan bir 1602 LCD ekranı bağlamanıza olanak tanır. Birçok durumda bu çok önemli olabilir. Kolaylık sağlamanın bedeli, ek bir modül (dönüştürücü ve kitaplık) kullanma ihtiyacıdır. Bize göre bu, kolaylık sağlamak için ödenecek yüksek bir bedel değil ve bu özelliğin projelerde kullanılmasını şiddetle tavsiye ediyoruz.

Çok sayıda elektronik cihazın ayrılmaz bir parçası nedir? Tabii ki, verilerin gösterge ve grafiksel çıktısı anlamına gelir. “Akıllı kutu” sonucunun görsel olarak görülebilmesi kullanıcı için her zaman daha kullanışlı ve keyiflidir. Bu nedenle bugün STM32'ye metin ve sayıları görüntülemek için bir ekran bağlayacağız. Deneylerimizin kahramanı Winstar'ın oldukça popüler bir sergisi olacak. Bu arada yorumlarda metodolojinin temel olarak tüm ekranlar için aynı olduğu yönünde önemli bir açıklama ortaya çıktı. HD44780.Önemli ekleme için JekaKey'e teşekkürler)

Öncelikle ekranın denetleyiciye bağlanması gerekir. Veri sayfasını indirin ve WH1602 pin çıkışını arayın. Buraya bak:

Bildiğiniz gibi, WH1602'yi görüntüle 16 pin bulunmaktadır. Her birine ayrı ayrı bakalım...

Vss, Vdd ve K pinlerinin toprağa ve güce bağlanması gerekiyor, yani tam olarak tabloda belirtildiği gibi, sürpriz yok ve tartışılacak bir şey yok)

Kontrastı ayarlamak için 3 numaralı pin kullanılıyor - oraya +5V uygularsak kesinlikle hiçbir şey görmeyeceğiz, pini toprağa kısa devre yaparsak iki sıra siyah kareye hayran kalacağız 😉 Doğal olarak bu bize yakışmıyor kontrastı ayarlamak için oraya değişken dirençli bir potansiyometre (direnç) asmamız gerekiyor. Karakterlerin en iyi görünürlüğü, bu ekran pinindeki 0,5-0,7 V voltajla sağlanır.

RS pini zaten mikrodenetleyici kullanarak kontrol edeceğimiz bir pin. Bu pinin düşük voltaj seviyesi (0) artık bir komutun takip edeceği, yüksek seviye (1) ise ekran belleğine yazılacak verinin olacağı anlamına gelir.

Pin R/W - burada belli, ya veriyi okuruz (örneğin meşgul bayrağını gösteririz), bu durumda bu pinte 1 olur, ya da komutu/veriyi ekrana yazarız, sonra burada 0 olur.

DB7 – DB0 – veri yolu ve bu her şeyi anlatıyor)

Pin E, sözde Etkinleştirme sinyalidir. Bunun için ona ihtiyaç var. Ekranla çalışmak - verileri kaydetmek veya bir komut vermek - için bu pime pozitif bir darbe vermemiz gerekir. Yani prosedür şöyle görünecek:

  1. RS, R/W, DB7 - DB0 pinlerinde komutumuza karşılık gelen gerekli sinyaller.
  2. E pinine bir tane sağlıyoruz.
  3. Zhdems (veri sayfasına göre – en az 150 ns)
  4. E pinine düşük seviye (0) uyguluyoruz.

Ekran arka ışığını çalıştırmak için A/Vee ayağına 4,2 V uygulamanız gerekir.

WH1602 ekranıyla iletişim bu şekilde gerçekleşir.

WH1602'yi bağlamayı çözdük ancak örneğe geçmeden önce ekranımızın genel olarak hangi komutları anladığına bakalım. Bunu yapmak için veri sayfasına gidiyoruz ve ilginç bir tablo buluyoruz:

Her özel komut için WH1602'nin ilgili pinlerinde olması gereken tüm komutlar ve sinyaller burada açıklanmaktadır. Örneğin ekranı temizlemek istiyoruz, tabloya bakıyoruz ve işte ihtiyacımız olan komut! Ekranı Temizle!

RS, R/W, DB7, DB6, DB5, DB4, DB3, DB2, DB1 pinlerine sıfır ve DB0 pinine bir uyguluyoruz. Bitti! Sırada ne var? Aynen öyle, bir tanesi E pinine, sonra bir süre bekleyin ve E'yi tekrar sıfıra indirin. İşte bu, ekran temizlendi 😉 Bir sonraki komutu çalıştırmadan hemen önce, her komutun veri sayfasında belirtilen şekilde duraklatmanız gerekir. Meşgul bayrağını yoklamak daha etkili olacaktır; 0'a sıfırlandıktan sonra çalışmaya devam edebilirsiniz. Bu bayrağın okunması için de özel bir komut var, yani bununla ilgili her şey açık) Devam edelim...

Ve aslında her şey teoride, zaten bir şeyler yazmayı deneyebilirsiniz. Ekranla çalışmayı kolaylaştırmak için küçük bir kitaplık yaptım, şimdi bunun nasıl kullanılabileceğini görelim. Öncelikle indirin

Elimizde 2 dosya var, MT_WH1602.c ve MT_WH1602.h. İkincisini yırtıyoruz, burada kullanılan pinleri ve kontrol cihazını seçmemiz gerekiyor.

Bu arada ekranım şu şekilde bağlı:

RS-PC2
Oku/Yaz – PB10
E–PB14
DB7–PD2
DB6–PC12
DB5–PA8
DB4–PA10
DB3–PA15
DB2–PD11
DB1–PA3
DB0–PA5

MT_WH1602.h dosyasını açın:

#define PLATFORM (STM32F10x)

Daha sonra ekranın bağlı olduğu mikro denetleyici pinlerini seçin. Öncelikle hangi portları kullandığımızı ayarlayalım. Bağlandığımda GPIOA, GPIOB, GPIOC ve GPIOD kullanıyorum, şunu yazıyoruz:

Benzer şekilde diğer mikrodenetleyici ayakları için.

Kurulumu tamamladık, devam edelim) Yazının başında verilen komutları çağırmak için MT_WH1602.c dosyasında aşağıdaki fonksiyonlar bulunmaktadır (bunlar komutların isimlerinden sonra isimlendirilmiştir, dolayısıyla burada her şey açık sanırım) ):

void MT_WH1602_ClearDisplay(geçersiz) ; void MT_WH1602_ReturnHome(geçersiz) ; void MT_WH1602_EntryModeSet (bool IDaddress, bool kaydırma) ; void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ; void MT_WH1602_CursorOrDisplayShift (bool SCbit, bool RLbit) ; void MT_WH1602_FunctionSet (bool DLbit, bool Nbit, bool Fbit) ; void MT_WH1602_SetCGRAMAddress (uint8_t adresi) ; void MT_WH1602_SetDDRAMAddress (uint8_t adresi) ; bool MT_WH1602_ReadBusy(geçersiz) ; void MT_WH1602_WriteData(uint8_t veri) ;

Bazı komutlar için fonksiyona parametre aktarmamız gerekir, örneğin:

void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ;

Komut tablosuna bakalım:

Display ON/OFF komutunun sadece ekranı açıp kapatmakla kalmayıp aynı zamanda imleç ve imleç yanıp sönmesini de etkinleştirip/devre dışı bıraktığını görüyoruz. Veri sayfasında bu komut bitleri D, C ve B olarak belirtilir ve bunları fonksiyona parametre olarak aktarırız. Ekranı ve imleci açmamız ancak imlecin yanıp sönmesini devre dışı bırakmamız gerekiyorsa komutu şu şekilde çağırırız:

MT_WH1602_DisplayOnOff(1, 1, 0);

Genel olarak her şey basit 😉

Kısacası biz yaratıyoruz yeni proje, WH1602 ekranıyla çalışmak için bir kitaplık ekleyin, boş bir .c dosyası oluşturun ve onu kodla doldurmaya başlayın:

// Kütüphane dosyasını dahil et#include "MT_WH1602.h" /*******************************************************************/ int ana(geçersiz) ( // Başlatma fonksiyonunu çağırın, onsuz yapamayız =)() ; // Şimdi ilk ekran konfigürasyonunu yapmamız gerekiyor // Dokümantasyon ve İnternet bunu yapmanızı önerir;) MT_WH1602_FunctionSet(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_FunctionSet(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_FunctionSet(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_FunctionSet(1, 1, 1); MT_WH1602_Delay(1000) ; MT_WH1602_DisplayOnOff(1, 0, 0); MT_WH1602_Delay(1000) ; MT_WH1602_ClearDisplay() ; MT_WH1602_Delay(2000) ; // Mesela aklıma ilk gelen gecikme değerlerini aldım) // Genel olarak ekran meşgul bayrağını kontrol etmeniz gerekir // Şimdi sitemizin adı gibi bir şeyi görüntüleyelim MT_WH1602_WriteData(0x6D) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x69) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x72) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x6F) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x74) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x65) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x68) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x6E) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x69) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x73) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x2E) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x72) ; MT_WH1602_Delay(100) ; MT_WH1602_WriteData(0x75) ; MT_WH1602_Delay(100) ; while (1 ) ( __NOP() ; )) /*******************************************************************/

Bitti, kontrol edelim)


Gördüğünüz gibi her şey doğru çalışıyor)

Bu arada, şu veya bu karakteri görüntülemek için ekrana ne yazmam gerektiği sorusunu bir şekilde gözden kaçırdım. İşte veri sayfasındaki plaka:

Yani ekran hafızasına hangi değerin yazılacağını belirlemek için belirli bir sembol için bu tabloda üstte ve solda yazılan sayıları almanız gerekir. Örneğin “A” sembolü. Bakalım - bu sembol 0100 sütununa (0x4) ve 0001 (0x1) satırına karşılık geliyor. “A” sembolünü görüntülemek için ekrana 0x41 değerini yazmanız gerektiği ortaya çıktı.

İşte bu kadar =) WH1602 ekranın bağlantısını ve çalışmasını çözdük, yakında görüşürüz!

Not: Kütüphaneyle çalışırken meşgul bayrağını okuma işlevini test etmedim, bu nedenle aniden bir şey olması gerektiği gibi çalışmazsa yazın, çözeceğiz)

Bazen Arduino'dan dış dünyaya çeşitli bilgiler çıkarma sorunuyla karşı karşıya kalıyoruz. Çoğu zaman seri bağlantı noktası kullanmak imkansızdır, zahmetlidir ve kârsızdır.

Karakter ekranı, kodlanmış karakterleri saklayan kendi mikro denetleyicisine sahip olduğundan, bilgiyi görüntülemenin en basit ve en ucuz yollarından biridir. Bu sistem, bu ekranların kullanımını basitleştirir ancak aynı zamanda bunların kullanımını yalnızca çıktıyla sınırlandırır. metin bilgisi grafik gösterimlerin aksine.

Örnekte hd44780 denetleyicide en yaygın ekranlardan biri olan Winstar wh1602l1 ekranına bakacağız. Ayrıca LCD 2004 ve benzeri olanları da bağlayabilirsiniz.
İlk iki rakam satır başına karakter sayısını, ikincisi ise satır sayısını gösterir, böylece seçilen ekranda 16 karakterlik 2 satır bulunur.
Bu bağlantı yöntemi, Arduino mikro denetleyicisinin en az 6 bağlantı noktasının kullanılmasını içerir. Gerekirse 1602 metin ekranını I2C arayüzü (2 port) üzerinden bağlayabilirsiniz.

İhtiyacımız olan ek unsurlardan değişken direnç kontrastı kontrol etmek için. Aksi takdirde her şey şemaya göre, veri sayfasına ve programdaki seçilen Arduino çıkışlarına göre bağlanır.

Ekrandaki 15 ve 16 numaralı pinler arka ışıktan sorumludur; Arduino'ya parlaklık sensörü olarak bir foto direnç bağlandığında kapatılabilir veya parlaklık otomatik olarak ayarlanabilir.

Örneğimizde seri porttan veri okuyacağız ve ekranda görüntüleyeceğiz:

#katmak // Karakter ekranlarıyla çalışmak için kitaplığı bağlayın LiquidCrystal lcd(13, 11, 5, 4, 3, 2); // (RS, E, D4, D5, D6, D7) ekrana veri yazacağımız ve void setup()'ı okumayacağımız için ekran çıkışlarını R/W – GND sırasına göre bağlayın ( lcd.begin( 16, 2); // LCD 1602'yi başlat // lcd.begin(20, 4); // LCD 2004'ü başlat Serial.begin(9600); // Seri bağlantı noktasını başlat ) void loop() ( if (Serial.available) ()) // Porttan veri geliyorsa... ( gecikme(100); lcd.clear(); // (Serial.available() > 0) iken ekranı tamamen temizleyin // Veri porttan geliyorsa port 0'dan büyükse ... ( lcd.write(Serial.read()); // Seri porttan değerleri okuyun ve ekranda gösterin )) )

Kodu karmaşıklaştırabilir ve Arduino'daki DS1307 gerçek zamanlı saatini LCD1602'nize gönderebilirsiniz.

Şimdi kütüphanedeki tüm fonksiyonlara daha yakından bakalım Likit kristal:

İlk ve en önemli şey, bu kütüphaneyi kullanarak, ekranın hafızasında bu karakterler olsa bile Rusça harfleri görüntüleyememenizdir. Bu sorun ya diğer kütüphaneler tarafından ya da onaltılık kod kullanılarak değerler yazılarak çözülebilir.

lcd.print();- bilgileri görüntülemek için kullanılan en basit ve en sık kullanılanıdır.

lcd. temizlemek(); - ekranı temizlemek için kullanılır.

lcd.setCursor(X, sen); - imleci belirli bir yere yerleştirir.

X – hattaki konum değişikliği

Y – çizgi değişikliği

Örneğin, lcd.setCursor(0, 0); burası sol üst hücre.

lcd.home(); - imleci 0, 0 konumuna yerleştirir

lcd.home(); = lcd.setCursor(0, 0);

lcd. kaydırmaEkranSol(); - sola kay

lcd. kaydırmaEkranSağ(); - sağa kaydır

Lcd.createChar(İsim, sıralamak); - kendi tabelanızı yaratmak.

Örneğin derece işareti şuna benzer:

Celc = (B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000 );




Tepe