Tentang menghubungkan dan bekerja dengan teks OLED Winstar display

Tampilan garis (atau teks) dimaksudkan untuk pengiriman informasi teks dalam bentuk garis. Mereka terdiri dari beberapa jenis (terutama LCD atau OLED bercahaya sendiri), dan biasanya dalam penandaannya terdapat angka 1202, 1602, 1204 atau serupa, yang menunjukkan jumlah garis (dalam contoh 2 atau 4) dan karakter di setiap baris (12 dan 16) . Ada tampilan garis tunggal jenis ini, tetapi dalam presentasi berikut ini kami fokus pada tampilan dua baris yang lebih umum digunakan.

Sebagian besar layar ini kompatibel dengan pengontrol HD44780 (Hitachi). Pajangan yang paling populer (setidaknya di negara kami) dari varietas ini diproduksi oleh Winstar. Selain itu, varietas LCD (nama dimulai dengan huruf WH, misalnya, WH1602) adalah satu-satu yang kompatibel dengan sistem perintah HD44780, dan tipe OLED (nama dimulai dengan WEH, misalnya, WEH001602) memiliki pengontrol WS0010 yang ditingkatkan. Sayangnya, atau untungnya, kita akan berurusan sekarang.

Berbeda dengan tampilan grafik yang kami periksa sebelumnya berdasarkan pada pengontrol ks0108, generator karakter di layar huruf kecil adalah built-in. Selain itu, bagi kami, perbedaan utama antara WS0010 dan HD44780 standar adalah adanya beberapa (empat) tabel kode untuk menampilkan teks multibahasa. HD44780 hanya memiliki satu meja seperti itu, itulah sebabnya perusahaan harus menjual jenis tampilan terpisah di setiap wilayah. Tampilan OLED berbasis WS0010 tidak memerlukan kerusakan regional, yang jauh lebih nyaman. Tetapi tidak untuk pengguna: secara default, tabel ENGLISH_JAPANESE dihidupkan dalam tampilan WEH, dan untuk mengaktifkan karakter Rusia, Anda harus mengubahnya ke ENGLISH_RUSSIAN.

Pelajari lebih lanjut tentang tabel ENGLISH_RUSSIAN.
: (. ) , . , , — - -8, (. 19768-93). -, , , EBCDIC, , ( 127 ) ASCII. , , , ASCII .

Pustaka LiquidCrystal standar (disertakan dengan Arduino IDE), tentu saja, tidak tahu apa-apa tentang empat tabel, dan karena itu memerlukan pelurusan, setidaknya dalam hal ini. Tetapi tidak hanya: pada akhirnya, akan mungkin dilakukan dengan bahasa Inggris. Namun, prosedur inisialisasi terasa berbeda untuk WS0010, dan jika tidak diperbaiki, tampilan akan menunjukkan bahwa setiap kali dimulai.

Fitur lainnya
, OLED- Winstar , ( , ). , , . , , WEH SPI (, « SPI»), , , ( 3) — . : , . , I2C (. , ).

Untuk beberapa alasan, tampilan Winstar memiliki defisit besar dalam hal dokumentasi yang dapat dipahami (seperti yang mungkin Anda perhatikan, ini umumnya merupakan fitur karakteristik produk China). Perlu ditunjukkan di mana Anda dapat mengunduh dokumentasi yang kurang lebih lengkap tanpa kesalahan: di sini di LCD (WH1602) dengan pengontrol HD44780, di sini di layar OLED (WEH1602), di sini di pengontrol WS0010 secara terpisah (kami akan merujuknya nanti) . Dan di sini, jika Anda tertarik, ada penjelasan rinci tentang pengontrol HD44780 dalam bahasa Rusia.

Leveling perpustakaan LiquidCrystal


Untuk mengontrol tampilan huruf kecil pada HD44780 dan analognya, pustaka LiquidCrystal standar, yang secara tradisional disertakan dalam IDE Arduino dari semua versi, sangat cocok. Untuk menampilkan teks Rusia, ada versi LiquidCrystalRus , yang secara mengejutkan bekerja dengan baik di semua versi modern dari Arduino IDE (dikatakan bahwa penulis dengan benar mendekati konversi karakter UTF-8). Tetapi untuk beradaptasi dengan tampilan OLED pada pengontrol WS0010, Anda masih perlu melakukan koreksi. Di masa depan, kami akan mengejek perpustakaan ini dan oleh karena itu kami akan mengganti namanya menjadi LiquidCrystalRus_OLED, agar tidak menjadi bingung dengan yang biasa. Untuk menyederhanakan tugas, kami tidak akan mengganti nama fungsi, karena inisialisasi akan sama dengan LiquidCrystalRus asli.

Perubahannya adalah sebagai berikut:

1. Sejaktabel Rusia-Inggris di WS0010 (lihat halaman 9 untuk lembar data pada WS0010 menggunakan tautan di atas) adalah nomor 2, maka untuk beralih ke itu Anda perlu mengatur dua bit paling tidak signifikan FT1 dan FT0 dalam perintah SET FUNCTION untuk mengaturnya ke status 10 (0x02). (Dalam LCD dengan satu tabel kode, bit ini, omong-omong, tidak digunakan sama sekali). Untuk melakukan ini, dalam file LiquidCrystalRus_OLED.cpp , cari tempat (baris 96 file) di mana nilai variabel _displayfunction diatur . Di kedua baris inisialisasi (baris 97 dan 99) tambahkan append " | = 0x02 ".

2. Selanjutnya, Anda perlu memperbaiki penundaan inisialisasi setelah menyalakan daya. Untuk HD44780, seharusnya tidak lebih dari 40 ms (lihat dokumentasi pada tautan di atas). Perpustakaan menggunakan fungsi untuk ini.delayMicroseconds (50000) (baris 120 dari file LiquidCrystalRus_OLED.cpp ). Untuk pengontrol WS0010, Anda harus memiliki penundaan sepuluh kali lebih lama - setidaknya 500 ms (lihat halaman terakhir lembar data di tautan di atas). Persyaratan ini disembunyikan dengan sangat hati-hati (file dengan dokumentasi berbahasa Inggris di Winstar menampilkan “kehilangan font” di bagian ini), sehingga tampaknya hanya sedikit orang yang memikirkannya sampai sekarang. Oleh karena itu, kami mengganti baris ini dengan 32 pengulangan keterlambatan masing-masing 16 ms:

for (int i = 0; i <=31; i++) delayMicroseconds(16000);

3. Selain ini (lihat juga halaman terakhir lembar data ini), setelah penundaan ini, saat menghidupkan empat kawat, Anda harus mengirim perintah kosong lima kali berturut-turut (0x00). Karena Arduino secara signifikan lebih cepat daripada pengontrol tampilan, perintah harus diberikan dengan jeda menengah. Mereka perlu dimasukkan sedikit lebih jauh ke dalam teks fungsi begin, di mana ia secara spesifik tentang inklusi 4-bit (baris 147 dari file LiquidCrystalRus_OLED.cpp ).

4. Tapi ini bukan akhir. Tabel ENGLISH_RUSSIAN asli memiliki ikon gelar(kode 0xEF). Opsi ini dieksekusi sangat tidak berhasil secara grafis (terlalu besar), jadi alih-alih saya lebih suka menggunakan titik atas yang tebal (kode 0xDF) - ini jauh lebih mirip gelar dalam gaya yang biasa. Itu bisa dimasukkan dalam bentuk kode (lebih baik daripada oktal "\ 337"), tetapi masalahnya adalah - mencoba menyederhanakan fungsi mengganti kode huruf Rusia dengan kode di tabel generator karakter, penulis perpustakaan, berdasarkan pengkodean UTF-8 (lihat artikel sebelumnya ), memperkenalkan kondisi penggantian untuk kode apa pun yang lebih besar dari 0x80 (fungsi LiquidCrystalRus :: write ). Karena 0xDF kami jelas lebih besar dari 0x80, ketika Anda menentukan karakter "\ 337" di baris kode, maka ruang kosong akan ditampilkan, karena itu tidak sesuai dengan huruf Rusia.

Sayangnya, fungsi createChar () standarketika saya mencoba menggunakannya untuk membuat ikon gelar saya sendiri, saya memasuki layar dengan sangat pingsan, yang hanya bisa dihapus dengan memuat ulang program. Apa yang perlu saya tangani juga dan saya akan berterima kasih jika seseorang memberi tahu saya ada apa. Jadi generator karakter tidak dapat diedit dalam kemampuan kami, tetapi kami dapat mengecualikan karakter 0xDF yang kami butuhkan dari kondisi tersebut. Untuk melakukan ini, ganti kondisi yang ada (lihat teks dari fungsi tulis ) dengan yang berikut ini:

if ((value>=0x80)&&(value!=0xdf))

5. Akhirnya, nol dicoret pada tampilan ini tidak begitu mencolok seperti pada layar LCD grafis. Namun demikian, dalam fungsi tulis yang sama, saya memperkenalkan penggantian kode nol (0x30) dengan kode huruf "O" (0x4f). Mereka yang ingin dapat mengembalikan nol dicoret kembali hanya dengan menghapus atau mengomentari garis pengganti (baris 308 dari file LiquidCrystalRus_OLED.cpp yang dimodifikasi ).
Perpustakaan yang diperbarui dapat diunduh dari tautan di akhir artikel.

Koneksi


Sekarang semuanya tampaknya di-tweak, Anda dapat terhubung. Koneksi tampilan WEH001602BG (16 karakter, panjang layar 100 mm) ke Arduino ditunjukkan pada gambar berikut:

gambar

Pin Arduino yang terhubung dengan pin display RS, E, DB4-DB7 harus ditunjukkan ketika layar diinisialisasi:

// RS, E, DB4, DB5, DB6, DB7
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);

Jika diinginkan, Anda dapat menghubungkan dua atau lebih tampilan di opsi antarmuka apa saja (delapan atau empat kabel). Dalam hal ini, jalur data dan RS dapat dibagi. Pilihan antara tampilan dalam hal ini dilakukan melalui terminal E, yang untuk tampilan berbeda terhubung ke terminal Arduino yang berbeda (garis koneksi layar kedua ditampilkan dalam warna abu-abu pada diagram, terminal E layar kedua di sini terhubung ke pin 6 dari Arduino). Tentu saja, dalam hal ini, Anda perlu membuat dua salinan perpustakaan (misalnya, OLED1 dan OLED2), di mana semua outputnya sama, kecuali untuk E. Selain itu, display dapat dari berbagai konfigurasi dan ukuran (8x2, 16x2, 12x2, 12x4, dll. .). Ini juga berlaku untuk tampilan LCD konvensional pada HD44780.

Dan mengapa ada relay untuk daya? Kelemahan utama dari WS0010 adalah kurangnya perangkat keras "rezet". Dalam HD44780, rezet bawaan dapat dibenarkan - penulis tidak memiliki cukup pengalaman dengan layar LCD untuk mengatakan dengan pasti. Tetapi Winstar, yang mencoba mengikuti standar dalam pengembangannya, jelas tidak dapat mengatasi tugas ini. Mem-boot ulang pengontrol tanpa mematikan daya akan menyebabkan tampilan kekeruhan apa pun pada layar, dan Anda dapat menghilangkannya hanya dengan menyulap kekuatan seluruh rangkaian dan menginisialisasi layar dari awal.

Selain itu, tampilan saat mematikan / menghidupkan daya dapat membingungkan garis di tempat. Orang-orang mengklaim bahwa inklusi 8-bit penuh (bukannya 4-bit) membantu, tetapi itu bekerja lebih buruk bagi saya. Mereka juga bersikeras bahwa dalam “batch baru” hipotetis semua ini sudah diperbaiki, tetapi sulit untuk percaya (batch “baru” seperti apa yang sedang kita bicarakan ketika Winstar telah merilis display OLED sejak 2008 , dan saya memiliki display 13 dan 14 tahun lepaskan?).

Menyampaikan dan mengatur untuk mengatur ulang tampilan secara artifisial saat me-reboot Arduino tanpa mematikan daya. Ini andal menghilangkan sampah di layar. Kekuatan tampilan (atau tampilan) dihidupkan secara terpisah melalui relai ini, yang dinyalakan dari pin Arduino gratis (dalam hal ini, pin 4) pada awal prosedur pengaturan, ketika controller sudah beroperasi dengan stabil. Dan sebelum menyalakan relai, ada baiknya memberikan penundaan tambahan 1000 ms (lihat sketsa di bawah). Relai yang ditunjukkan EDR202A05 adalah relai buluh, arus belitan adalah 10 mA, oleh karena itu ia dikendalikan secara diam-diam dari keluaran Arduino.

Adapun kebingungan antara garis ketika dihidupkan, di samping perubahan di atas dalam prosedur inisialisasi, efek ini dengan sempurna mengurangi kekuatan seluruh rangkaian dari sumber eksternal yang cukup kuat (setidaknya 1-2 A) dengan tegangan stabil di bawah beban setidaknya 7,5 volt. Ketergantungan pada nutrisi ini, jelas, merupakan sumber ketidaksesuaian dalam banyak publikasi, di mana banyak penulis mengklaim bahwa semuanya berjalan baik untuk mereka. Dalam hal ini, display (atau display) dapat dihubungkan melalui stabilisator internal Arduino (pin 5V papan), atau mereka dapat dihubungkan melalui stabilizer terpisah, tetapi yang utama adalah bahwa tegangan input stabilizer harus cukup stabil terlepas dari lonjakan daya pada saat diaktifkan.

Periksa


Untuk memeriksanya, saya mengirim sketsa demo, Proba_Rus_Liquid_Crystal_OLED , mensimulasikan tampilan jam kalender dengan sensor suhu eksternal:

Contoh tampilan WEH1602
#include <LiquidCrystalRus_OLED.h>

// initialize the library with the numbers of the interface pins
// RS, E, DB4, DB5, DB6, DB7
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
#define RelayPin 4 // 4 -  

void setup() {
delay (1000);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH); //  
delay (500);
  OLED1.begin(16,2); //16  2 
  OLED1.clear();
  OLED1.setCursor(0,0); // ,  
  OLED1.print("-22,3\337C"); //10  
  OLED1.setCursor(11,0); // , 11 
  OLED1.print("10:22"); //
  OLED1.setCursor(0,1); //   
  OLED1.print("16.01.17 "); // 16  
  OLED1.setCursor(13,0); // , 13  ":"
  OLED1.blink(); // 
   delay(1000);
}

void loop() {
/*        
        13,0 
    blink
*/
}


Semua perubahan karakteristik di perpustakaan yang disebutkan di atas diterapkan di sini. Program ini juga menunjukkan cara membuat titik dua berkedip dalam beberapa jam: menit menggunakan fungsi blink () . Perhatikan bahwa output baru di posisi yang sama menghancurkan kedekatan keakraban, dan ketika memperbaruinya, Anda harus melanjutkan lagi, setelah sebelumnya mengatur kursor tak terlihat ke posisi yang sama 13 di baris nol. Dengan pembaruan jam nyata, mungkin lebih mudah untuk memperbarui hanya angka-angka di posisi 11-12 dan 14-15, meninggalkan usus besar yang berkedip utuh.

Hasil output dari contoh ditunjukkan dalam foto:

gambar

Perlu dicatat bahwa foto tersebut tidak menampilkan cahaya layar OLED hijau (dalam hal ini). Bahkan, itu adalah warna hijau tua, dengan panjang gelombang lebih pendek dari layar LED 568 nm yang biasa (tujuh segmen atau matriks). Mengapa yang terakhir dengan latar belakang OLED tampak "pudar", dan aplikasi gabungan mereka sulit.

WS0010 memiliki mode grafis, dan tampilan OLED grafis Winstar (seperti WEG010016) juga memiliki pengontrol ini. Seseorang memperhatikan bahwa mereka bahkan memiliki matriks yang sama. Menurut pendapat saya, mencoba menerapkan mode grafis pada tampilan garis teks agak tidak ada gunanya: tampilan garis memiliki ruang-ruang gelap yang diatur oleh perangkat keras antara karakter dan garis yang membuat gambar sangat tidak estetis (lihat berbagai contoh upaya tersebut).

Satu catatan terakhir: pada daya tahan Winstar OLEDs. Dalam lembar data, waktunya ditunjukkan 100.000 jam, yaitu, 11 tahun. Namun demikian, salah satu tampilan tahun ke-13 rilis (cahaya kuning) hingga saat ini (musim dingin tanggal 16) telah kehilangan kecerahan dalam diri saya. Sangat lucu bahwa sisanya dari partai yang sama (hijau) dan kemudian (kuning dan hijau 14 tahun) tidak menunjukkan tanda-tanda sekarat. Oleh karena itu, dengan pasti, saya tidak berani mengatakan apa-apa, tetapi untuk berjaga-jaga, saya menyarankan Anda untuk tidak menyolder display ke papan, tetapi untuk menginstalnya pada konektor, sehingga dalam kasus yang dapat diganti tanpa masalah.

Anda dapat mengunduh arsip dengan perpustakaan gratis dan contoh dari sini .

UPD: ada solusi untuk masalah permulaan yang stabil tanpa memanipulasi kekuatan:
https://geektimes.ru/post/287234/

Source: https://habr.com/ru/post/id400833/


All Articles