Lcd nokia 5110 sambungan. Faedah menggunakan Arduino Uno. Lakaran dalam tindakan

Mungkin, saya, seperti semua pembina Arduino, mempunyai beberapa jenis idea gila dalam kepala saya. Saya memesan semua bahagian yang diperlukan dari China. Kami terpaksa menunggu lama, tetapi kemudian klon papan Arduino Uno dan paparan LCD Nokia 5110 dihantar lebih awal daripada jadual. Memandangkan saya tidak biasa dengan elektronik dan pengaturcaraan sebelum ini, saya memutuskan untuk tidak membuang masa dan mula belajar cara memaparkan maklumat mengenai modul ini.

Perkara pertama yang saya lakukan ialah Google dan menemui penerbitan "Arduino, modul LCD Nokia 5110 dan abjad Cyrillic" daripada pengarang. Dan kemudian saya menyedari bahawa semua yang saya telah rancangkan sebelum ini tidak akan begitu mudah untuk dilakukan.

Saya mengetahui abjad Cyrillic, semuanya mudah di sana, saya tidak akan menyalin-tampal jawatan terakhir, tetapi ada masalah sebenar dengan gambar. Tugasnya ialah: anda perlu melukis gambar dan memuat naiknya ke paparan. Menghadapi masalah pertama, log masuk pada hari Rabu pengaturcaraan Arduino Saya melihat bahawa tidak ada perkara seperti "Sisipkan - Imej", tetapi anda perlu menulis gambar dengan kod tertentu dalam sistem nombor hex. Saya menemui beberapa editor, tetapi itu tidak berlaku. Gambar tidak dipaparkan dengan secukupnya. Saya mula mencari masalah yang mungkin.

Melalui sekumpulan eksperimen, percubaan dan ujian, saya menghasilkan algoritma yang akan saya kongsikan dengan anda:

1) Anda perlu mendapatkan gambar itu sendiri, dalam format .bmp hitam dan putih dengan sambungan 84 x 48 piksel.
Ini boleh dilakukan dalam banyak cara untuk hampir semua orang. penyunting grafik Terdapat fungsi "Simpan sebagai" di mana kami menentukan parameter yang diperlukan.
Saya melakukannya dalam corelDRAW. Kami mendapat sesuatu yang serupa. Adalah perlu untuk menjelaskan bahawa nama imej mesti disimpan susun atur Latin papan kekunci, kerana program seterusnya tidak akan dapat membukanya.

2) Jika perlu, anda boleh mengedit gambar dalam cat; anehnya, terdapat beberapa alat yang mudah dan menarik di sana.

3) Menggunakan ini kita mendapat kod hex imej.

4) Masukkan kod ini V kod program Arduino dan muat naik ke papan:

// SCK - Pin 8 // MOSI - Pin 9 // DC - Pin 10 // RST - Pin 11 // CS - Pin 12 // #include LCD5110 myGLCD(8,9,10,11,12); luaran uint8_t OKO; terapung y; uint8_t* bm; ruang int; persediaan void() ( myGLCD.InitLCD(); ) gelung void() ( myGLCD.clrScr(); myGLCD.drawBitmap(0, 0, OKO, 84, 48); myGLCD.update(); delay(2000); )

#termasuk const uint8_t OKO PROGMEM=( //Menyalin kod hex alat GLCD );

Apabila memasang peranti pada Arduino, kita sering berhadapan dengan keperluan untuk output maklumat autonomi. Dan, seperti biasa, saya mahu penyelesaiannya murah. Dan di sini ternyata pilihan peranti murah tidak begitu kaya.

Jika terdapat sedikit maklumat yang dipaparkan, adalah mudah untuk menggunakan penunjuk tujuh segmen. Mereka sangat terang dan kontras. Pembaris setinggi 4 digit 0.36 inci pada TM1637 dijual pada harga 70 sen dan dikawal oleh hanya 2 pin. Seperti yang anda mungkin rasa, ia direka terutamanya untuk memaparkan masa, walaupun ia boleh memaparkan dengan mudah, contohnya, suhu, tekanan dan parameter lain, yang mana 4 digit sudah mencukupi.

Tetapi jika terdapat banyak maklumat output, mereka tidak akan berfungsi. Dalam kes sedemikian, paparan LCD 1602 "rakyat" paling kerap digunakan, yang mempunyai keupayaan untuk memaparkan 2 baris 16 aksara dengan harga satu setengah dolar. Dengan cara ini anda boleh memaparkan lebih banyak maklumat.

Saudara 4 barisnya yang lebih maju akan memaparkan lebih banyak maklumat, tetapi kosnya lebih ketara, kira-kira 5 dolar, dan saiznya sudah agak besar.

Semua peranti ini mempunyai kebaikan dan keburukan mereka. Kelemahan utama termasuk kekurangan sokongan untuk bahasa Rusia, kerana jadual kod dipasang dengan ketat ke dalam cip, dan ketidakupayaan untuk memaparkan grafik. Tegasnya, adalah mungkin untuk mempunyai perisian tegar Cyrillic dalam peranti sedemikian, tetapi ini dijual terutamanya di Rusia dan pada harga yang tidak munasabah.
Jika kelemahan ini penting untuk digunakan dalam peranti yang dibuat dan resolusi 84x48 piksel dalam grafik hitam putih sesuai dengan anda, maka anda harus memberi perhatian kepada paparan Nokia 5110. Pada suatu masa dahulu ada satu, tetapi ia sangat tidak lengkap , dan di tempat yang ketinggalan zaman. Khususnya, dinyatakan di sana bahawa adalah mustahil untuk memaparkan abjad Cyrillic. Hari ini tiada masalah seperti itu.

Wira ulasan kami, berharga kurang daripada beberapa dolar, datang kepada saya dalam kotak kadbod tahan lama dengan filem pelindung pada skrin, yang banyak terima kasih kepada penjual. Peranti ini mempunyai saiz papan litar bercetak 45x45 mm PCB merah dan skrin LCD dengan resolusi 84x48 piksel dan saiz 40x25 mm. Peranti ini mempunyai berat 15 g. Ia mempunyai lampu latar biru yang boleh dimatikan. Untuk Arduino, paparan ini akan menggigit 5 ​​pin digital, tidak mengira bekalan kuasa. Papan mempunyai 2 baris pin yang selari, jadi anda boleh menggunakan hanya satu baris. Daripada jumlah ini, 5 adalah untuk kawalan, 2 untuk kuasa dan satu untuk menghidupkan lampu latar. Untuk menghidupkan lampu latar, anda perlu memendekkan pin LIGHT ke tanah (terdapat versi lain paparan ini, seperti yang mereka katakan - pada papan biru, di mana pin ini disambungkan ke bekalan kuasa). Papan tidak dipateri, dua sikat disertakan dalam kit.
Jadi, kami menyambungkan pin SCLK, DIN, DC, CE dan RTS ke pin Arduino, contohnya, 3, 4, 5, 6, 7. Pin VCC kepada 3.3V (Tepat 3.3, bukan 5!), sambungkan tanah dan muat turun perpustakaan.
Fungsi daripada pustaka ini membolehkan anda memaparkan primitif grafik (garisan, bulatan, segi empat tepat, dll.), imej raster dan teks. Perpustakaan mengandungi contoh yang menunjukkan keupayaannya, saya menasihati anda untuk melihatnya. Tetapi untuk membolehkan teks dipaparkan dalam bahasa Rusia, anda perlu mengubah suai fon. Tetapi, nasib baik, orang baik telah melakukan segala-galanya untuk kita dan fail gantian boleh dimuat turun.
Saya akan memberikan contoh lakaran di bawah, dan hasil output teks dalam bahasa Rusia boleh dilihat di atas. Adalah mudah untuk mengira bahawa pada saiz fon terkecil (No. 1), anda boleh memaparkan 84 aksara (14 dalam 6 baris), yang cukup untuk memaparkan, sebagai contoh, mesej diagnostik yang luas. Fon #2 adalah dua kali lebih besar.
Resolusi skrin membolehkan anda memaparkan imej raster dua warna yang agak baik, yang boleh digunakan sebagai ikon dalam program.

Mencipta ikon sedemikian adalah sangat mudah. Di bawah spoiler saya akan menunjukkan kepada anda bagaimana ini dilakukan.

Cara cepat membuat imej raster menggunakan contoh logo laman web MYSKU

Mula-mula, mari ambil tangkapan skrin logo (kunci Skrin Cetak).
Lancarkan Paint dari program standard dan tekan Ctrl+V. Keseluruhan skrin dengan logo disediakan untuk kami.


Pilih serpihan yang dikehendaki dan tekan butang TRIM. Mari dapatkan serpihan kami.

Sekarang kita perlu menukar serpihan ini menjadi dua warna. Cat sendiri boleh menangani ini. Klik "Simpan Sebagai" dan pilih jenis "Gambar Monokrom (*.bmp)". Kami mengabaikan amaran editor dan klik OK dan lihat gambar berikut:

Sekarang kita perlu menukar set piksel ini menjadi pelbagai kod untuk Arduino. Saya dapati satu yang mengatasi tugas ini.
Dia perlu menyerahkan fail bmp sebagai input, tetapi ia mestilah 256 warna! Jadi kami akan mengklik "Simpan Sebagai" sekali lagi dan pilih jenis "seni bmp 256 warna". Sekarang mari kita ingat dimensi sisi fail yang dihasilkan, anda perlu menunjukkannya dalam lakaran (lihat sama ada dalam Cat di bahagian bawah dalam bar status atau dengan membuka File Properties -> tab Butiran) dan pergi ke penukar dalam talian .


Mari pilih fail kami, semak nombor perenambelasan dan klik TUKAR.
Mari dapatkan array yang kita perlukan:


Kami menyalin tatasusunan ini ke dalam lakaran, menyusunnya dan melihat apa yang berlaku.


Sekarang mari kita matikan lampu latar dan lihat bagaimana imej akan kelihatan tanpanya.


Seperti yang anda lihat, kedua-dua teks dan ikon boleh dibaca. Lebih-lebih lagi, lebih terang cahaya, lebih baik kebolehbacaan (oh, saya masih ingat betapa menyenangkannya menggunakan Nokia 1100 pada hari yang cerah, manakala orang ramai menyembunyikan telefon bimbit mereka dengan matriks warna di bawah naungan untuk mendail nombor). Secara umum, anda boleh menggunakan paparan dalam mod ini jika terdapat pencahayaan yang mencukupi atau lampu latar mengganggu, atau untuk menjimatkan kuasa bateri. Jika skrin seseorang sukar dilihat, mainkan kontras dalam lakaran. Kontras terbaik dengan dan tanpa lampu latar diperoleh pada nilai yang berbeza, ini mesti diambil kira.

Contoh lakaran untuk memaparkan teks dan gambar

#termasuk #termasuk // pin 3 - Keluar jam bersiri (SCLK) // pin 4 - Keluar data bersiri (DIN) // pin 5 - Pilih Data/Arahan (D/C) // pin 6 - Pilih cip LCD (CS) // pin 7 - Tetapan semula LCD (RST) Paparan Adafruit_PCD8544 = Adafruit_PCD8544(3, 4, 5, 6, 7); const statik unsigned char PROGMEM ku59x39 = ( 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfx, 0xff, 0xfx, 0xff, 0xfx ff ff, 0xff , 0xff, 0xff, 0xf0, 0xe0, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x3, 0xf0, 0xfc, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7 x0, 0x0 0x7f f, 0xff, 0xfe, 0x30, 0xff, 0xfc, 0x40, 0x3, 0xff, 0xff, 0xfc, 0x70, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff, 0xf8, 0xf, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x0 ff, 0xf0, 0xf0. c3, 0xf0, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x83, 0xf0, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x87, 0xf0, 0xff, 0x0, 0, ff, 0x0, 0x0, 0x0 f0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0x1f, 0x87, 0xf0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7 0, 0x ff, 0xff , 0xfc, 0x38, 0x0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xf0, 0xff, 0xff, 0xfe, 0x3x0, 0xfe, 0x3x0, 0x0 0xff, 0 xfe,0x0, 0x3f, 0xe1, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x3, 0xf0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfe, 0xf, 0x0, 0x, 0x0, 0x, 0x0, 0x 0xff, 0 xe,0x0, 0x3f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc, 0x3, 0xff, 0xe1, 0xf0, 0xff, 0xff, 0xff, 0x0, 0x1f, 0x0, 0x1f, 0x0, 0x0, 0x00 , 0x80 0x7f ff, 0xc3, 0xff 0xff 0x7f, 0xff 0xdf , 0xff, 0xff . xff, 0xf0 ); void setup() ( display.begin(); display.setContrast(50); display.setTextSize(1); display.setTextColor(BLACK); // tetapkan warna teks ) void loop() ( display.clearDisplay(); paparan .drawBitmap(10, 5, ku59x39, 59, 39, BLACK); display.display(); delay(2000); display.clearDisplay(); display.setCursor(0,0); display.print("SAM is mampu memukul bukan sahaja balistik, tetapi juga sasaran aerodinamik - kapal terbang"); display.display(); delay(2000); )


Nah, dan memandangkan Arduino (Processor+RAM+Bootloader-BIOS)+drive (EEPROM) + sistem input/output (IRDA Remote dan Nokia 5110) sebenarnya adalah komputer yang lengkap, maka mengapa tidak menulis sepenuhnya permainan untuk itu? Sudah tentu, komputer Arduino kami tidak akan dapat mengendalikan permainan seperti GTA, tetapi ia boleh mengendalikan mainan kasual yang ringkas dengan mudah! Mari kita menulis permainan sepanjang masa - Tetris.
Bagi mana-mana pengaturcara, ini seperti senaman pagi, senaman yang mudah untuk otak, jadi teruskan! Dan ia seperti ini tidak pernah berlaku sebelum ini pada muska. Dan permainan akan mendedahkan potensi subjek.
Sebagai sistem input, saya memutuskan untuk menggunakan alat kawalan jauh IRDA daripada SEBARANG peranti. Dengan penyelesaian ini, kami hanya memerlukan satu, dengan kos 4 rubel setiap satu. Dan alat kawalan jauh IR boleh didapati di mana-mana apartmen. Untuk lakonan suara, kami juga akan menggunakan tweeter piezo dari papan induk lama - ini akan menjadi analog bajet kami untuk multimedia)). Yang lebih sejuk akan datang kepada saya sekarang, tetapi ini sudah menaikkan harga superkomputer kami sebanyak satu dolar! Kami akan pergi buat masa ini. Ia akan bersamanya sudah.
Pada papan roti kami menyambungkan peranti output dan input dan "multimedia" kami. Ternyata begini:


Saya menggunakan Arduino Uno, kerana ia sudah mempunyai 3.3V yang kami perlukan, tetapi jika anda menggunakan Mini, anda perlu mendapatkan 3.3 yang diperlukan daripada 5 volt untuk skrin. Cara paling mudah dari internet ialah meletakkan dua diod silikon secara bersiri (pilih).
Untuk tidak melukis gambar rajah elektrik, saya hanya akan menunjukkan pin Arduino yang saya gunakan.
Menyambungkan paparan Nokia 5110:
pin 3 - Jam keluar bersiri (SCLK)
pin 4 - Data bersiri keluar (DIN)
pin 5 - Pilih Data/Arahan (D/C)
pin 6 - Pilih cip LCD (CS)
pin 7 - tetapan semula LCD (RST)
Untuk menerangi pin LIGHT pada paparan, kami membuangnya ke GND Arduino. (Hanya untuk papan merah!). Plus bekalan kuasa pada 3.3V. Tanah ke GND.
Sambungan Penerima IR:
pin 8 - IR (kawalan). Bekalan kuasa pada +5V dan GND masing-masing.
Menyambungkan tweeter piezo:
pin 9 - pembesar suara, Ground ke GND.
Selepas pemasangan, muat naik lakaran

Lakaran permainan Tetris

//// © Klop 2017 #include #termasuk #termasuk #termasuk #define rk 4 // lebar segi empat sama #define rz 5 // lebar tempat duduk #define smeX 1 #define smeY 1 #define MaxX 10 // bilangan kaca tempat duduk secara mendatar #define speaker 9 #define RECV_PIN 8 // foot pada penerima IRDA // pin 3 - Keluar jam bersiri (SCLK) // pin 4 - Keluar data bersiri (DIN) // pin 5 - Pilih Data/Arahan (D/C) // pin 6 - Pilih cip LCD (CS) // pin 7 - tetapan semula LCD (RST) Paparan Adafruit_PCD8544 = Adafruit_PCD8544(3, 4, 5, 6, 7); IRrecv irrecv(RECV_PIN); hasil decode_results; bait mstacan; bait Lst, SmeH, tengah, NumNext; bait MaxY; // bilangan kaca tempat secara menegak int dxx, dyy, FigX, FigY, Victory, myspeed,tempspeed; panjang tidak ditandatangani ok, kiri, pravo, vniz, rekod saya; flfirst panjang tidak ditandatangani=1234; // bait label pelancaran pertama fig= (((0,0,0,0), (0,0,0,0), (0,0,0,0), (0,0,0,0)) , ((0,1,0,0), (0,1,0,0), (0,1,0,0), (0,1,0,0)), ((0,0,0 ,0), (0,1,1,0), (0,1,1,0), (0,0,0,0)), ((0,1,0,0), (0,1 ,1,0), (0,0,1,0), (0,0,0,0)), ((0,1,0,0), (0,1,0,0), (0 ,1,1,0), (0,0,0,0)), ((0,1,0,0), (0,1,1,0), (0,1,0,0), (0,0,0,0)), ((0,0,1,0), (0,1,1,0), (0,1,0,0), (0,0,0,0 )), ((0,0,1,0), (0,0,1,0), (0,1,1,0), (0,0,0,0)), ((0,0) ,0,0), //8 (0,0,0,0), (0,0,0,0), (0,0,0,0)) ); //================================================ ============= void mybeep () // bunyi (analogWrite(speaker, 100); delay(100); analogWrite(speaker, 0); ) //======= ============================== ======================== void figmove(bait a, bait b) ( untuk (bait i=0;i<4;i++) for (byte j=0;j<4;j++) fig[a][i][j]=fig[b][i][j]; } //============================================== void figinit(byte a) { for (byte i=0;i<4;i++) for (byte j=0;j<4;j++) { fig[i][j]=fig[i][j]; if (fig[a][j][i]==1) // покажем след фигуру display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, BLACK); else display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, WHITE); } display.display(); NumNext=a; tempspeed=myspeed-(Victory/30)*50; // через каждые 30 линий увеличим скорость падения; dxx=0; for (byte i=0;i0) display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, BLACK); else display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, WHITE); ds(Kemenangan,1); display.display(); ) //============================================= ================= = void ds(int aa, int b) ( display.fillRect(55, 10, 29, 10, WHITE); display.setCursor(55,b* 10); display.println(aa); ) //=== ======================================== ========================== bool iffig(int dx , int dy) (int i,j; bool flag=benar; bool pov=false ; untuk (i=0;i MaxX-1) dx=-1;// cuba alihkannya dari dinding di sebelah kanan sebanyak 1 ) ) ) untuk (i=0;i<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) if (i+FigX+dx<0 || i+FigX+dx>MaxX-1 || FigY+j+dy>MaxY-1 || mstacan>0) (flag=false; break;) // menyemak koordinat baharu jika (flag) (FigX=FigX+dx; FigY=FigY+dy;byte k=0; for (i=0;i<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) {mstacan=1; dxx=0; } } // переместили фигуру на новые координаты else { if (pov) figmove(0,8); for (i=0;i<4;i++) // восстановили фигуру for (j=0;j<4;j++) if (fig[j][i]==1) mstacan=1; } return(flag); } //================================================ void clearstacan() { for (byte i=0;imyrecord) ( myrecord=Victory; EEPROM_write(16, myrecord); ) display.setCursor(5,0); display.print("Rekod"); display.setCursor(5,10); paparan.cetak(myrecord); display.display(); display.setCursor(5,20); kelewatan(2000);irrecv.resume(); display.println("Klik"); tb=getbutton("OK"); jika (tb!=ok) ( ok=tb; levo=getbutton("Kiri"); pravo=getbutton("Kanan"); vniz=getbutton("Ke Bawah"); EEPROM_write(0, ok); EEPROM_write(4, levo);EEPROM_write(8, pravo);EEPROM_write(12, vniz); ) display.fillRect(5, 0, (MaxX-1)*rz, 40, WHITE); myspeed=800; tempspeed=myspeed; Kemenangan=0; ) //============================================= ================= = void setup() ( unsigned long tr; word gg=0; randomSeed(analogRead(0)); irrecv.enableIRIn(); // Mulakan IRDA receiver display.begin(); display.setContrast(50); display.setTextSize (1); display.setTextColor(BLACK); // menetapkan warna teks display.clearDisplay(); Lst=rz*MaxX; // lebar kaca dalam piksel MaxY=display.height()/rz+4; // Ketinggian kaca dalam kiub SmeH=display.height()%rz; // offset atas dalam piksel untuk paparan rawak(7); EEPROM_read(0 , ok); EEPROM_read(4, levo); EEPROM_read(8, pravo); EEPROM_read(12, vniz); EEPROM_read(20, tr); jika (tr==flfirst) EEPROM_read(16, myrecord); else ( myrecord= 0; EEPROM_write(16, myrecord); EEPROM_write(20, flfirst); ) newgame(); ) //=========================== ======================================= void dvoiki() ( untuk (bait i=0; i
Dan anda boleh melawan. Permainan ini menyokong pengikatan pada mana-mana alat kawalan jauh. Untuk melakukan ini, pada permulaan permainan, apabila ditanya "Tekan OK," tekan butang pada alat kawalan jauh yang akan bertanggungjawab untuk memutar angka. Jika alat kawalan jauh permainan sudah biasa, permainan akan bermula serta-merta. Jika alat kawalan jauh baharu, maka kod untuk butang OK tidak akan sepadan dengan yang dihafal dan permainan akan memerlukan anda menekan butang “Kiri”, “Kanan” dan “Bawah” mengikut turutan. Butang ini akan direkodkan dalam memori tidak meruap Arduino dan seterusnya alat kawalan jauh ini akan dikenali serta-merta apabila menekan butang "OK".


Apabila anda "gagal" pada baris yang dikumpul, decitan akan dimainkan. Ia dilaksanakan berdasarkan beberapa pin Arduino (dalam kes kami 9) untuk menghasilkan PWM pada frekuensi tertentu.
Permainan ini menyokong semua sifat permainan biasa. Terdapat juga petunjuk untuk angka seterusnya dan skor semasa. Permainan menjejaki rekod. Nilai ini disimpan dalam memori tidak meruap Arduino. Untuk menetapkan semula rekod, cuma tukar nilai flfirst=1234 dalam lakaran kepada sebarang nilai lain. Permainan ini juga secara automatik meningkatkan kelajuan jatuh setiap 30 baris dihapuskan, jadi anda tidak akan dapat bermain selama-lamanya). Lakaran itu tidak dioptimumkan atau dijalankan dengan teliti, tetapi ditulis pada masa lapang untuk keseronokan. Jika sesiapa mendapati ralat, tulis. Mengenai ©. Anda dibenarkan untuk mengedit lakaran mengikut kehendak anda. Hanya apabila menerbitkan pilihan anda di suatu tempat, sila nyatakan pautan ke sumber asal).
Mengapa saya melakukannya - hujung minggu yang panjang + "untuk cinta seni." Jika anak perempuan saya masih kecil, saya mungkin akan menjadikannya mesin slot mini untuk bilik anak patungnya pada 8 Mac, tepat pada masanya. Saya akan menambah beberapa permainan seperti Snake dan Arkanoid, dan mungkin memotong badan daripada PCB. Hanya anak perempuan saya yang sudah mempertahankan ijazah kedoktorannya tahun ini, jadi ia merindui, tetapi mungkin idea ini akan berguna kepada orang lain).

Mari kita ringkaskan untuk paparan Nokia 5110:
kebaikan
+Kemungkinan memaparkan grafik;
+Tiada masalah dengan abjad Cyrillic;
+Berat rendah;
+Nisbah cemerlang dimensi/kuantiti maklumat yang dipaparkan;
+Kelebihan teknologi LCD yang digunakan ialah penggunaan kuasa yang rendah dan kebolehbacaan yang baik dalam cahaya terang;
+ Lampu latar boleh tukar;
+Harga.

Minus
-Lampu belakang tidak sekata;
-Imej adalah hitam dan putih (tiada warna);
-Keperluan untuk menjaga 3.3V, tidak setiap Arduino mempunyai voltan sedemikian.

Keputusan: Untuk wangnya, berdasarkan keseluruhan ciri-cirinya, ia dengan yakin menduduki nichenya; ia bukan tanpa sebab bahawa ia adalah hati yang panjang di kalangan peranti paparan untuk Arduino.

Saya bercadang untuk membeli +102 Tambahkan pada kegemaran Saya suka ulasan itu +148 +269

Ingat masa ketika telefon mudah alih "oak", mereka mempunyai papan kekunci butang tekan yang berasingan dan paparan kristal cecair monokrom kecil?

Kini pasaran ini dimiliki oleh semua jenis iPhone, Galaxy, dsb., tetapi paparan mencari kegunaan baharu: projek DIY!

Paparan hitam-putih 84x48 piksel yang akan kami pertimbangkan telah digunakan dalam telefon Nokia 3310. Kelebihan utamanya ialah kemudahan operasi. Paparan sedemikian akan sesuai dengan sempurna ke dalam projek anda untuk pertukaran maklumat interaktif dengan pengguna.

Dalam artikel ini kita akan melihat mengawal paparan grafik ini menggunakan Arduino. Semua ciri sambungan, ciri teknikal paparan dan program untuk Arduino dipertimbangkan.

Bahan-bahan yang diperlukan

  • Arduino atau klonnya.
  • Penyambung.
  • Papan litar.

Spesifikasi paparan Nokia 5110

Sebelum menyambungkan paparan dan pengaturcaraan Arduino, mari lihat beberapa maklumat umum mengenainya.

Pinout

Untuk menyambung dan menghantar data pada paparan, dua baris selari 8 penyambung digunakan. Setiap pin ditanda di belakang paparan.


Seperti yang telah disebutkan, pin disambungkan selari antara satu sama lain. Maklumat tentang tujuan setiap penyambung diberikan di bawah.


Pemakanan

Anda telah perasan bahawa paparan LCD 5110 mempunyai dua penyambung kuasa. Yang pertama adalah yang paling penting - menjanakan logik paparan. Lembaran data menyatakan bahawa ia harus dipilih dalam julat 2.7 - 3.3 V. Dalam operasi biasa, paparan akan menggunakan 6 hingga 7 mA.

Penyambung kuasa kedua adalah untuk lampu latar paparan. Jika anda mengeluarkan paparan itu sendiri dari papan (ini tidak perlu, anda hanya boleh melihat rajah di bawah), anda akan melihat bahawa lampu latar dilaksanakan dengan sangat mudah: empat LED putih, yang terletak di sudut papan. Sila ambil perhatian bahawa tiada perintang pengehad semasa.


Jadi anda perlu lebih berhati-hati dengan diet anda. Anda boleh menggunakan perintang pengehad arus apabila menyambungkan pin "LED" atau menggunakan voltan bekalan maksimum 3.3 V. Jangan lupa bahawa LED boleh menyerap arus tinggi! Tanpa had, mereka akan menarik kira-kira 100 mA pada voltan bekalan 3.3 V.

Antara muka kawalan

Paparan mempunyai pengawal terbina dalam: Philips PCD8544, yang menukar antara muka selari besar-besaran kepada satu siri yang lebih mudah. PCD8544 dikawal menggunakan protokol bersiri segerak, yang serupa dengan SPI. Ambil perhatian bahawa terdapat pin pembilang masa (SCLK) dan input data bersiri (DN), serta pemilihan cip rendah-aktif (SCE).

Di atas penyambung bersiri yang dipertimbangkan, terdapat penyambung lain yang dipasang - D / C, di mana maklumat diterima tentang sama ada data yang sedang dihantar boleh dipaparkan.

Untuk senarai arahan, lihat bahagian "Arahan" lembaran data PCD8544 (halaman 11). Terdapat arahan yang mengosongkan paparan, menyongsangkan piksel, mematikan kuasa, dsb.

Memasang dan menyambungkan paparan 5110

Sebelum memuat naik lakaran dan memindahkan data ke paparan, anda perlu memahami sambungannya. Untuk melakukan ini, anda perlu menyelesaikan masalah memasangnya dan menyambungkannya ke Arduino.

perhimpunan

Untuk "memasang" paparan, anda mungkin memerlukan penyambung. 8 keping sudah memadai. Anda boleh menggunakan kaki lurus atau 90 darjah. Bergantung pada penggunaan selanjutnya. Jika anda bercadang untuk menggunakan papan litar, rel dengan penyambung lurus mungkin merupakan pilihan terbaik.

Paparan LCD daripada Nokia 5110 dipasang pada papan litar mini:


Anda juga boleh memateri penyesuai secara terus ke paparan.

Menyambungkan Paparan 5110 ke Arduino

Dalam contoh ini kita akan menyambungkan paparan LCD ke Arduino. Teknik yang serupa boleh disesuaikan dengan mudah kepada papan dan mikropengawal lain. Untuk menyambungkan pin pemindahan data - SCLK dan DN(MOSI) - kami menggunakan pin Arduino SPI, yang menyediakan pemindahan data yang pantas. Pin pilih cip (SCE), tetapan semula (RST), dan pin data/kawalan (D/C) boleh disambungkan ke sebarang pin digital. Output dari LED disambungkan ke pin pada Arduino, yang menyokong modulasi PWM. Terima kasih kepada ini, pelarasan fleksibel kecerahan lampu latar adalah mungkin.

Malangnya, voltan bekalan maksimum paparan 5110 boleh mencapai 3.6 volt, jadi ia tidak boleh disambungkan terus ke output 5 V standard pada Arduino. Voltan perlu dilaraskan. Sehubungan itu, beberapa pilihan sambungan muncul.

Sambungan terus ke Arduino

Pilihan paling mudah ialah menyambung ke Arduino secara langsung. Dalam kes ini anda perlu menggunakan Papan Arduino Pro 3.3V/8MHz atau 3.3V Arduino Pro Mini. Pilihan yang dicadangkan di bawah berfungsi dengan papan Arduino 5V. Ini adalah pilihan yang berfungsi, tetapi hayat paparan mungkin berkurangan sedikit.


Pin disambungkan seperti berikut:


Pilihan yang baik dan murah untuk memberikan perlindungan tambahan ialah memasang perintang antara pin data dari Arduino ke LCD 5110. Jika anda menggunakan Arduino Uno(atau papan 5 volt yang serupa), anda boleh menggunakan perintang dengan nilai nominal 10 kOhm dan 1 kOhm. Gambar rajah sambungan paparan menggunakan perintang ditunjukkan dalam rajah di bawah:


Sambungan adalah sama seperti dalam contoh pertama, tetapi perintang dipasang di setiap litar isyarat. Perintang 10 kOhm dipasang di antara pin SCLK, DN, D/C dan RST. Perintang 1 kOhm berada di antara pin SCE dan pin 7. Nah, 330 Ohm kekal di antara pin 9 dan pin dengan LED. dan pin 7.

Penukar tahap

Pilihan sambungan ketiga menggunakan penukar aras untuk bertukar antara 5 dan 3.3 V. Untuk tujuan ini, anda boleh menggunakan modul Penukar Aras Logik Dwi Arah atau TXB0104.


Malangnya, terdapat lima input untuk isyarat 3.3 V pada paparan, dan empat pada penukar tahap. Anda boleh membiarkan keluaran RTS tinggi (dengan menyambungkannya menggunakan perintang 10k ohm). Akibatnya, anda tidak lagi dapat mengawal cara paparan but semula, tetapi semua fungsi lain akan tersedia.

Contoh lakaran Arduino pertama: Demo LCD

Selepas sambungan berjaya, anda boleh meneruskan memuat turun lakaran dan memaparkan data pada paparan!

Program untuk Arduino

Komen dalam kod di atas sepatutnya membantu anda memahami program ini. Kebanyakan tindakan berlaku dalam fungsi lcdFunTime().

Lakaran dalam tindakan

Selepas memuat naik ke Arduino, lakaran akan mula berfungsi dan melancarkan demo - satu set animasi standard dan ujian fungsi grafik. Mula-mula, mari kita paparkan beberapa piksel. Selepas itu, kami akan meneruskan untuk memaparkan garisan, segi empat tepat dan bulatan, memuatkan peta bit, dsb.


Selepas melengkapkan lakaran, monitor akan bertukar kepada mod pemindahan data melalui protokol bersiri. Buka monitor bersiri (dengan kadar baud 9600 bps). Perkara yang anda cetak pada monitor bersiri akan muncul pada monitor LCD.

Jika anda berminat dengan keupayaan paparan imej raster, baca terus. Kami akan melihat dengan tepat bagaimana anda boleh mengimport imej peta bit 84x48 anda sendiri dan memaparkannya pada skrin.

Contoh kedua lakaran Arduino: memuatkan dan memaparkan peta bit

Dalam contoh ini kita akan mencipta peta bit 84x48 baharu, menyepadukannya ke dalam kod Arduino dan menghantarnya ke monitor LCD.


Cari/Buat/Tukar peta bit

Mula-mula, cari imej yang anda ingin paparkan pada skrin LCD 5110. Anda tidak akan dapat mengembangkannya terlalu banyak kepada 84x48 piksel, tetapi ia masih boleh dilakukan. Berikut adalah beberapa contoh:

Selepas memilih imej, anda perlu membetulkannya: menjadikannya monokrom (warna 2-bit); kekalkan saiz 84x48 piksel. Anda boleh menggunakan kebanyakan penyunting imej untuk ini. Termasuk Paint, jika anda mempunyai Windows. Simpan imej yang terhasil.

Menukar bitmap kepada tatasusunan

Langkah seterusnya ialah menukar fail ini kepada tatasusunan aksara 504 bait. Untuk melakukan ini, anda boleh menggunakan pelbagai program. Contohnya, Pembantu LCD.

Untuk memuatkan imej ke dalam Pembantu LCD, pergi ke Fail > Muatkan Imej. Tetingkap dengan imej pratonton harus dibuka. Pastikan imej adalah saiz yang betul - 84 piksel lebar, 48 piksel tinggi dan orientasi Byte ditetapkan kepada Menegak, Saiz endianness kepada Kecil. Selebihnya tetapan lalai harus ditetapkan dengan betul (8 piksel/bait)

Selepas ini, pergi ke tab Fail > Simpan output untuk menjana fail teks sementara. Buka fail teks ini untuk melihat tatasusunan baharu anda yang menarik. Tukar jenis tatasusunan kepada char (bukan unsigned atau const). Juga pastikan tatasusunan dinamakan dengan betul (tiada sempang, tidak bermula dengan nombor, dsb.).

Import ke dalam lakaran dan lukis!

Salin tatasusunan yang dibuat ke dalam lakaran Arduino. Anda boleh menggunakan lakaran daripada contoh pertama. Tampalkan tatasusunan anda di mana-mana sahaja. Sekarang, untuk memaparkan lakaran anda, gantikan persediaan() dan gelung() dalam lakaran anda dengan baris di bawah (pastikan fungsi dan pembolehubah lain sama):

// ...pembolehubah, pemalar dan tatasusunan bitmap ditakrifkan di atas

lcdBegin(); // Menyediakan pin dan memulakan paparan LCD

setContrast(60); // Laraskan kontras (julat pilihan adalah dari 40 hingga 60)

setBitmap(flameBitmap); // flameBitmap hendaklah digantikan dengan nama tatasusunan anda

updateDisplay(); //Kemas kini paparan untuk menunjukkan tatasusunan

// Fungsi untuk kawalan dan grafik pada paparan LCD ditakrifkan di bawah...

Betul ke, ternyata keren? Antara lain, anda boleh mengimport berbilang imej dan mencipta animasi kecil! Cubalah, saya pasti anda akan menyukainya!

Pautan untuk memuat turun program tambahan, perpustakaan dan lembaran data

Helaian data untuk paparan LCD dan pemacu
  • Lembaran Data LCD - Tidak sama persis dengan 5110, tetapi sangat serupa dalam spesifikasi
Perpustakaan dan lakaran Arduino
  • Perpustakaan Arduino PCD8544 – Perpustakaan untuk bekerja Arduino dengan pemacu LCD PCD8544
Program untuk mencipta imej raster
  • TheDotFactory – Alat yang hebat untuk mencipta tatasusunan fon tersuai

Tinggalkan komen, soalan dan kongsi pengalaman peribadi anda di bawah. Idea dan projek baru sering dilahirkan dalam perbincangan!

Artikel baru

● Projek 16: Penunjuk grafik. Sambungan paparan Nokia 5110

Dalam eksperimen ini, kita akan melihat pada Paparan Grafik Nokia 5110, yang boleh digunakan dalam projek Arduino untuk memaparkan maklumat grafik.

Komponen yang diperlukan:

Paparan kristal cecair Nokia 5110 ialah paparan monokrom dengan resolusi 84×48 pada pengawal PCD8544, direka untuk memaparkan maklumat grafik dan teks. Bekalan kuasa paparan hendaklah antara 2.7-3.3 V (maksimum 3.3 V; jika 5 V dibekalkan ke pin VCC, paparan mungkin rosak). Tetapi pin pengawal adalah toleran +5V, jadi ia boleh disambungkan terus ke input Arduino. Perkara penting ialah penggunaan yang rendah, yang membolehkan anda menghidupkan paparan dari papan Arduino tanpa sumber kuasa luaran.
Gambar rajah sambungan untuk Nokia 5110 ke Arduino ditunjukkan dalam Rajah. 16.1.

nasi. 16.1. Gambar rajah sambungan untuk Nokia 5110 ke Arduino

Untuk bekerja dengan paparan Nokia 5110, kami akan menggunakan perpustakaan Adafruit_GFX, yang mempunyai keupayaan yang kaya untuk memaparkan grafik dan teks. Dalam percubaan kami, kami akan menerima data pencahayaan daripada photoresistor yang disambungkan kepada input analog Arduino A0 dan mengeluarkan data pencahayaan dalam perwakilan berangka dan grafik. Gambar rajah sambungan ditunjukkan dalam Rajah. 16.2.

nasi. 16.2. Gambarajah sambungan Nokia 5110 dan photoresistor ke Arduino

Kod untuk lakaran percubaan kami ditunjukkan dalam Penyenaraian 16.1. Kami membaca data dari photoresistor dan memaparkan nilai berangka, serta grafik (bar kemajuan), nilai pencahayaan sebagai peratusan nilai maksimum. Kami mengambil nilai pencahayaan minimum dan maksimum daripada eksperimen 13.

// Menyambung perpustakaan #termasuk #termasuk // PIN 7 - RST Pin 1 pada LCD // PIN 6 - CE Pin 2 pada LCD // PIN 5 - DC Pin 3 pada LCD // PIN 4 - DIN Pin 4 pada LCD // PIN 3 - CLK Pin 5 pada LCD Paparan Adafruit_PCD8544 = Adafruit_PCD8544(3, 4, 5, 6, 7); const int LIGHT=A0; // Pin A0 untuk input fotoperintang const int MIN_LIGHT=200 ; // Ambang pencahayaan yang lebih rendah const int MAX_LIGHT=900 ; // Ambang pencahayaan atas // Pembolehubah untuk menyimpan data photoresistor int val1,val2 = 0 ; persediaan batal()( display.begin(); // tetapkan kontras latar belakang skrin // parameter yang sangat penting! display.setContrast(60); display.clearDisplay(); // skrin jelas kelewatan(2000); ) gelung kosong()( val1 = analogRead(CAHAYA); // Baca bacaan photoresistor drawText(val1,1); // paparan teks // menskalakan nilai potensiometer kepada 0-75 val2= peta (val1, MIN_LIGHT, MAX_LIGHT, 0 , 75 ); // output segi empat tepat hitam dalam % display.fillRect(5, 25, val2, 10, 1); // keluarkan bahagian putih segi empat tepat display.fillRect(5 +val2,25 , 75 -val2, 10 , 0 ); display.display(); kelewatan(1000); // jeda sebelum pengukuran baharu drawText(val1,2); // padam teks) // prosedur output teks batal drawText( nombor panjang yang tidak ditandatangani, warna int)( display.setTextSize(2); // paparan saiz fon.setCursor(20,5); // kedudukan kursor jika (warna==1 ) paparan.setTextColor(BLACK); // cetak nilai else display.setTextColor(WHITE); // padam (putih pada putih) paparan.cetak(bilangan); )
Perintah sambungan:

1. Sambungkan penderia paparan Nokia 5110 dan photoresistor mengikut rajah dalam Rajah. 16.2.
2. Muatkan lakaran daripada Penyenaraian 16.1 ke papan Arduino.
3. Menyekat aliran cahaya dengan tangan anda, lihat perubahan dalam bacaan pencahayaan pada skrin paparan.

Penyenaraian program

Terdahulu dalam blog ini, beberapa paparan/penunjuk LCD dan penggunaannya daripada Arduino telah dibincangkan. Kelemahan ketara mereka ialah saiz dan beratnya yang agak besar. Selalunya ini tidak menjadi masalah. Sebagai contoh, jika anda memasang stesen pematerian DIY dalam bekas buatan sendiri, entah bagaimana tidak kira saiz paparan itu. Sebaliknya, jika anda memerlukan paparan pada, katakan, quadcopter, maka berat dan saiz menjadi kritikal. Oleh itu, hari ini kita akan belajar bagaimana untuk bekerja dengan skrin yang sangat kecil dan ringan dari telefon Nokia 5110.

Catatan: Siaran lain mengenai topik skrin - Belajar untuk memaparkan teks pada penunjuk LCD daripada Arduino, Mengenai menggunakan skrin 1602 dengan penyesuai I2C, Bekerja dengan LCD berdasarkan HD44780 tanpa perpustakaan, dan Termometer digital daripada matriks LCD, TMP36 dan Arduino.

Jangan risau, anda tidak perlu membeli Nokia 5110, yang sememangnya tidak wujud hari ini, pilih skrin daripadanya dan buang semua bahagian lain. Skrin Nokia 5110 ialah modul bersendirian yang sangat biasa untuk radio amatur dan berharga mana-mana dari $2 hingga $5, bergantung pada kedai. Di Rusia, modul boleh dibeli, contohnya, di tpai.ru, arduino-kit.ru, amperkot.ru, compacttool.ru, chipster.ru atau electromicro.ru. Dan, sudah tentu, skrin dijual pada harga terendah di AliExpress, tetapi anda perlu menunggu sebulan atau dua sehingga ia tiba dari China.

Seperti yang sering berlaku dalam dunia Arduino, sudah ada perpustakaan siap sedia untuk modul, dan lebih daripada satu. Saya menyukai perpustakaan LCD5110 yang disiarkan di tapak web rinkydinkelectronics.com. Pustaka ini mempunyai dua versi. Yang pertama dipanggil LCD5110_Basic. Ia lebih ringkas dan hanya boleh memaparkan teks dalam fon dengan saiz yang berbeza. Ia adalah mungkin untuk mencipta fon anda sendiri. Versi kedua dipanggil LCD5110_Graph. Ia mempunyai semua keupayaan perpustakaan pertama dan, sebagai tambahan kepada mereka, boleh melukis segmen, segi empat tepat, bulatan dan sebagainya.

Untuk tujuan siaran ini, LCD5110_Basic akan digunakan. Kedua-dua perpustakaan didokumentasikan dengan baik dan mempunyai banyak contoh penggunaan, jadi jika anda memerlukan LCD5110_Graph anda boleh memikirkannya sendiri dengan mudah. Walau bagaimanapun, perlu diingat bahawa untuk LCD5110_Basic dikompil tanpa amaran, saya terpaksa membuat beberapa suntingan kecil pada kodnya.

Jadi, contoh penggunaan perpustakaan:

#termasuk

extern uint8_t BigNumbers ;
extern uint8_t MediumNumbers ;
extern uint8_t SmallFont ;

/* SCK / CLK, MOSI / DIN, DC, RST, CS */
LCD5110 lcd(2, 3, 4, 6, 5);

persediaan batal()
{
lcd.InitLCD();
}

int ctr = 0 ;
gelung kosong()
{
lcd.clrScr();

Lcd.setFont(BigNumbers) ;
lcd.printNumI(ctr, KANAN, 0);

Lcd.setFont(MediumNumbers) ;
lcd.printNumF(12.34, 2, KANAN, 24);

Lcd.setFont(SmallFont) ;
lcd.print ("Barisan 1" , 0 , 8 * 0 );
lcd.print("Barisan 2", 0, 8 * 1);
lcd.print ("Barisan 3" , 0 , 8 * 2 ) ;
lcd.print ("L 4" , 0 , 8 * 3 );
lcd.print ("L 5" , 0 , 8 * 4 );
lcd.print ("0123456789ABCD" , 0 , 8 * 5 ) ;

Ctr + = 5 ;
jika (ctr >= 1000 )
ctr = 0 ;

Kelewatan(500);
}

Apa yang kelihatan seperti dalam tindakan:

Saya harap tidak perlu mengunyah kod. Sila ambil perhatian bahawa modul ini dikuasakan oleh 3.3 V, tetapi ia memahami arahan daripada Arduino biasanya tanpa sebarang penukar tahap logik. Sehubungan itu, kami menyambungkan pin VCC (kuasa) dan BL (lampu latar) kepada 3.3 V, sambungkan GND ke tanah, dan sambungkan lima pin yang tinggal ke pin digital Arduino. Kami menghantar nombor pin kepada pembina kelas LCD5110 mengikut komen dalam kod yang diberikan.

Mudah, bukan? Anda boleh mendapatkan kod sumber penuh untuk siaran ini dalam repositori GitHub ini. Tambahan dan soalan, seperti biasa, dialu-alukan dalam setiap cara yang mungkin.

Tambahan: Pengarang perpustakaan untuk bekerja dengan skrin Nokia 5110 juga merupakan pengarang perpustakaan OLED_I2C, yang direka untuk berfungsi dengan skrin OLED yang sama popular dengan antara muka I2C. Anda boleh mendapatkan contoh penggunaan OLED_I2C dalam siaran Menggunakan kayu bedik Sega Genesis dalam projek Arduino. Seperti yang anda jangkakan, kedua-dua perpustakaan mempunyai antara muka yang serupa.