Deoarece acest afisaj se poate comanda paralel sau serial, am preferat varianta cu mai putine fire, asa ca m-a oprit la articolul Display gráfico LCD 128x64 - ST7920, care foloseste libraria grafica u8glib.
Am folosit-o si eu pentru afisajul de Nokia 3410 cu driver PCF8812(vedeti un exemplu, articolul Afisaj de Nokia 3410 comandat de Arduino (III): Masurare temperaturi in 2 zone si afisare pe ecran de Nokia 3410).
Revenind la afisajul cel nou si la articolul brazilian, va prezint schema de conectare:
Dupa realizarea practica a montajului, am incarcat sketch-ul de acolo, obtinand:
Din primele teste, am realizat ca reglajul contrastului nu se face, indiferent de tensiunea de pe pinul VO (de la 0 la 5V), asa ca am incercat si fara: merge foarte bine.
Schema simplificata, folosita de mine este:
Am incarcat si modificat un pic sketch-ul prezentat in articolul Afisaj de Nokia 3410 comandat de Arduino (II)
De data asta, totul este mai mare:
Am facut si un filmulet, numit teste cu afisajul grafic LCD12864 cu ST7920 si Arduino
Sketch-ul folosit de mine, nefinisat, dar functional, este:
/*
// original sketch by niq_ro from http://nicuflorica.blogspot.com for analog clock using u8glib library
// version 1m5 - 2013.10.22, Craiova - Romania
// version 1m6 - 2014.06.17, Craiova
>>> Before compiling: Please remove comment from the constructor of the
>>> connected graphics display (see below).
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
Copyright (c) 2012, olikraus@gmail.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "U8glib.h"
// ecran de Nokia 3410
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_PCD8544 u8g(3, 4, 7, 5, 6); // SPI Com: SCK = 3, MOSI = 4, CS = 7, A0 = 5, Reset = 6
// U8GLIB_PCF8812 u8g(3, 4, 7, 5, 6);
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); //Enable, RW, RS, RESET
int xmax=128; // lungime maxima pe axa x (ST7920 LCD12864))
//int xmax=94; // lungime maxima pe axa x (LCD Nokia 3410)
//int xmax=84; // lungime maxima pe axa x (LCD Nokia 3310)
int ymax=64; // lungime maxima pe axa y (ST7920 LCD12864)
//int ymax=64; // lungime maxim ape axa y (LCD Nokia 3410)
//int ymax=48; // lungime maxima pe axa y (LCD Nokia 3310)
int xcenter=xmax/2; // centrul ecranului pe axa x
int ycenter=ymax/2; // centrul ecranului pe axa y
int raza=ymax/2-2; // raza cercului
int unghi=0;
// for LCD12864 with ST7920:
float kx = 1.37;
float ky = 1;
float kt = 1.2;
float xt=15;
// for Nokia 3310:
// float kx = 1;
// float ky = 1;
// float kt = 1;
// float xt=0;
// for Nokia 3410 LCD:
//float kx = 0.9;
//float ky = 0.57;
//float kt = 1;
// float xt=0;
void subrutina(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 3*kt+xt, 22*ky, "Salut Nicu!");
// pictez un chenar
u8g.drawFrame(1,1,93*kx,63*ky);
// u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x13);
u8g.drawStr( 3*kx*kt+xt, 40*ky, "afisez mesaj pe");
u8g.drawStr( 6*kx*kt+xt, 50*ky, "ecran grafic");
u8g.drawStr( 14*kx*kt+xt, 60*ky, "128x64");
}
void subrutina1(void) {
// desenez cercul principal
u8g.drawCircle(xcenter,ycenter,raza);
/*
// un font si mai mic
u8g.setFont(u8g_font_4x6);
u8g.drawStr(40, 60, "3410");
*/
// trag o linie din centrul cercului la cifra 0/12
u8g.drawLine(xcenter, ycenter, xcenter, ycenter-raza);
// delay(500);
u8g.drawLine(xcenter, ycenter, xcenter+raza, ycenter);
// delay(500);
u8g.drawLine(xcenter, ycenter, xcenter, raza+ycenter);
// delay(500);
u8g.drawLine(xcenter, ycenter, xcenter-raza, ycenter);
// delay(500);
}
void subrutina2(uint8_t unghi) {
// desenez cercul principal
u8g.drawCircle(xcenter,ycenter,raza);
// for (unghi=0; unghi<60; unghi+=1);
float x1=sin(6*unghi*2*3.14/360);
float y1=cos(6*unghi*2*3.14/360);
u8g.drawLine(xcenter, ycenter, xcenter+raza*x1, ycenter-raza*y1);
// folosesc un font mititel
u8g.setFont(u8g_font_6x13);
if (unghi <15 || unghi>45)
{ u8g.drawStr(30*kx*kt, 50*ky, "niq_ro"); }
else
{ u8g.drawStr(30*kx*kt, 20*ky, "niq_ro");
}
char s[2] = " ";
if (unghi<10)
{
// see http://www.asciitable.com/
s[0]=unghi+48; // transform cifrele in caractere ASCII
u8g.drawStr(10*kx, 10*ky, s);
}
else
{
s[0]=int(unghi/10)+48;
u8g.drawStr(4*kx, 10*ky, s);
}
s[0]=unghi-10*int(unghi/10)+48;
u8g.drawStr(10*kx, 10*ky, s);
}
void subrutina3(void) {
// pun font si apoi scriu mesaj de sfarsit...
// u8g.setFont(u8g_font_gdr25);
u8g.setFont(u8g_font_unifont);
u8g.drawStr(20*kx*kt, 30*ky, "Sfarsit!");
}
void setup(void) {
// flip screen, if required
// u8g.setRot180();
// set SPI backup if required
//u8g.setHardwareBackup(u8g_backup_avr_spi);
// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}
u8g_uint_t xx=0;
void loop(void) {
// picture loop
u8g.firstPage();
do {
subrutina(); // unde e mesajul de intampinare
} while( u8g.nextPage() );
delay(5000);
// a doua reprezentare grafica
u8g.firstPage();
do {
subrutina1(); // unde desenez ceva pana ma prind cum se face
} while( u8g.nextPage() );
delay(5000);
// rebuild the picture after some delay
delay(150);
// fac ceasu' cu secundar
for (xx = 0; xx < 60; xx++) // aici ar fi secundele
{
u8g.firstPage(); // incepere parte de grafica
do { // face asta pana termina ce e in subrutina de desenat
subrutina2(xx); // munceste la ce e in subrutina2
} while( u8g.nextPage() ); // pana o termina
delay(1000); // sta o secunda
}
xx=0; // readuce cronometrul la zero
delay(2000); // sta 2 secunde
// a treia reprezentare grafica
u8g.firstPage();
do {
subrutina3(); // unde scriu ca s-a terminat demonstratia...
} while( u8g.nextPage() );
delay(10000); // sta 10 secunde
} // final de program, se revine de la inceput
testeaza cu interfata i2c sa vezi daca merge, sa fie doar 2 pini folositi la arduino. in rest e super, cred ca o sa cumpar si eu unul :)
RăspundețiȘtergereCare sunt dimensiunile active ale ecranului?
RăspundețiȘtergerenu il am la indemana, dar am gasit la o cautare cu goagalele: http://www.wayengineer.com/yx-lcd12864-33v-blue-screen-lcd-backlight-j12864-st7920-p-1969.html#.VUiDY47tmko
RăspundețiȘtergereSuper! Multumim!
RăspundețiȘtergereBuna seara,
RăspundețiȘtergereMultumesc pentru articol, m-am chinuit cu un afisaj pe paralel dar imaginea era plina de artefacte. Am inceput sa cred ca ceva s-a defectat.
Cand l-am conectat pe serial, surpriza merge excelent.